← 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/messagesSend 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/batchSend 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/messagesList 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}/eventsFull 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": {}
}
]
}