Skip to content
← API marketplace
Messaging

SMS Messaging

One-off and batch sends with automatic GSM-7/UCS-2 segmentation, idempotency keys, delivery tracking and failover across aggregators. Use an sk_test_ key to send to the sandbox without charge to real handsets.

POST/v1/messages

Send an SMS

Scopes: messages:write

curl -X POST "https://api.sendaapp.co.za/v1/messages" \
  -H "Authorization: Bearer $SENDA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"to":"0821234567","from":"ACME","body":"Your order #1042 has shipped.","client_ref":"order-1042"}'
Example response (202)
{
  "id": "01a19900-0000-7000-8000-00000000abcd",
  "direction": "out",
  "to": "+27821234567",
  "from": "ACME",
  "body": "Your order #1042 has shipped.",
  "parts": 1,
  "encoding": "gsm7",
  "status": "queued",
  "category": "transactional",
  "campaign_id": null,
  "client_ref": "order-1042",
  "provider": null,
  "provider_message_id": null,
  "error_code": null,
  "cost_cents": 0,
  "test": false,
  "created_at": "2026-11-01T08:00:00.000Z",
  "sent_at": null,
  "delivered_at": null
}
POST/v1/messages/batch

Send up to 1 000 SMS in one call

Scopes: messages:write

curl -X POST "https://api.sendaapp.co.za/v1/messages/batch" \
  -H "Authorization: Bearer $SENDA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"messages":[{"to":"+27821234567","from":"ACME","body":"Hi Thandi, your appointment is tomorrow at 10:00."},{"to":"+27831234567","from":"ACME","body":"Hi Pieter, your appointment is tomorrow at 11:00."}]}'
Example response (207)
{
  "accepted": 2,
  "rejected": 0,
  "results": [
    {
      "index": 0,
      "status": 202,
      "message": {
        "id": "01a19900-0000-7000-8000-00000000abcd",
        "direction": "out",
        "to": "+27821234567",
        "from": "ACME",
        "body": "Your order #1042 has shipped.",
        "parts": 1,
        "encoding": "gsm7",
        "status": "queued",
        "category": "transactional",
        "campaign_id": null,
        "client_ref": "order-1042",
        "provider": null,
        "provider_message_id": null,
        "error_code": null,
        "cost_cents": 0,
        "test": false,
        "created_at": "2026-11-01T08:00:00.000Z",
        "sent_at": null,
        "delivered_at": null
      }
    }
  ]
}
GET/v1/messages/{id}

Get a message and its status

Scopes: messages:read

curl -X GET "https://api.sendaapp.co.za/v1/messages/01a19900-0000-7000-8000-00000000abcd" \
  -H "Authorization: Bearer $SENDA_API_KEY"
Example response (200)
{
  "id": "01a19900-0000-7000-8000-00000000abcd",
  "direction": "out",
  "to": "+27821234567",
  "from": "ACME",
  "body": "Your order #1042 has shipped.",
  "parts": 1,
  "encoding": "gsm7",
  "status": "submitted",
  "category": "transactional",
  "campaign_id": null,
  "client_ref": "order-1042",
  "provider": "smsflow",
  "provider_message_id": null,
  "error_code": null,
  "cost_cents": 0,
  "test": false,
  "created_at": "2026-11-01T08:00:00.000Z",
  "sent_at": null,
  "delivered_at": null
}
GET/v1/messages

List messages

Scopes: messages:read

curl -X GET "https://api.sendaapp.co.za/v1/messages?status=delivered&limit=50" \
  -H "Authorization: Bearer $SENDA_API_KEY"
Example response (200)
{
  "data": [
    {
      "id": "01a19900-0000-7000-8000-00000000abcd",
      "direction": "out",
      "to": "+27821234567",
      "from": "ACME",
      "body": "Your order #1042 has shipped.",
      "parts": 1,
      "encoding": "gsm7",
      "status": "queued",
      "category": "transactional",
      "campaign_id": null,
      "client_ref": "order-1042",
      "provider": null,
      "provider_message_id": null,
      "error_code": null,
      "cost_cents": 0,
      "test": false,
      "created_at": "2026-11-01T08:00:00.000Z",
      "sent_at": null,
      "delivered_at": null
    }
  ],
  "next_cursor": null
}
GET/v1/messages/{id}/events

Full status history

Scopes: messages:read

curl -X GET "https://api.sendaapp.co.za/v1/messages/01a19900-0000-7000-8000-00000000abcd/events" \
  -H "Authorization: Bearer $SENDA_API_KEY"
Example response (200)
{
  "data": [
    {
      "id": "…",
      "status": "submitted",
      "error_code": null,
      "provider": "smsflow",
      "occurred_at": "2026-11-01T08:00:01.000Z",
      "raw": {}
    }
  ]
}