Skip to content

Changelog

Every change to the API is listed here, newest first. See Versioning for what we promise within a version.

Released: 11 November 2026

This is the first version of the API documented on this site.

  • New base URL: https://api.sanadwa.com/v1. The older path https://api.sanadwa.com/api/public/v1 keeps working.
  • Endpoints:
    • Messages: POST /messages/template (send an approved template), POST /messages/text (reply with free-form text while the 24-hour customer-service window is open), and GET /messages/{id} (look up a sent message and its delivery status).
    • GET /templates: list approved templates, with pagination and filters by phone number or WhatsApp Business Account.
    • GET /phone-numbers: list the WhatsApp numbers you can send from.
    • Contacts: GET /contacts (with a tag filter), POST /contacts (create or update up to 100 contacts), POST /contacts/import (CSV import, up to 5 MB and 5,000 rows) and DELETE /contacts/{id}.
    • Tags: GET /tags, POST /tags and DELETE /tags/{id}.
    • Campaigns: POST /campaigns (send to everyone with a tag, now or scheduled up to 30 days ahead), GET /campaigns, GET /campaigns/{id}, POST /campaigns/{id}/pause and POST /campaigns/{id}/resume.
    • GET /balance: credit balance and this month’s usage.
    • GET /health: check your API key.
    • GET /openapi.json: the OpenAPI description of the API, without a key.
  • API keys with the scopes read, send and full, optional IP allowlists, and a rate limit of 60 requests per minute per key by default. Creating campaigns is limited to 5 requests per minute per key.
  • The Idempotency-Key header on every POST and DELETE request. It is required on POST /campaigns.
  • Webhooks for inbound.message, message.sent, message.delivered, message.read and message.failed, signed with HMAC-SHA256.
  • Errors answer JSON with a stable code, including 404 not_found for paths that do not exist.