HTTP API

Send SMS from your app

POST /v1/messages with a TEST key. The dashboard uses that same path. Open the message id when you need the delivery report — a 200 is only acceptance.

POST /v1/messages

{
  "to": "+233200000001",
  "sender_id": "TAYSEND",
  "message": "Hello from Taysend",
  "type": "transactional"
}

QUEUED — poll the message id for the DLR

One send path

The console and POST /v1/messages reserve, queue, and settle the same way.

Ghana prefixes

MTN, Telecel, and AT from the number. Other countries only after we add the route.

Bearer keys

sms_test_ and sms_live_. Shown once. Stored as SHA-256.

Delivery reports

HTTP 200 means we accepted the send. Delivered, failed, or expired comes later on the DLR.

TEST first

Mint a key and send to a simulated number

  • RESTful JSON under /v1
  • Authorization: Bearer sms_test_…
  • Idempotency-Key on send
  • Sandbox numbers with known outcomes
View full documentation →
export API_URL=https://api.taysend.com
export KEY=sms_test_your_key

curl -X POST "$API_URL/v1/messages" \
  -H "Authorization: Bearer $KEY" \
  -H "Idempotency-Key: 11111111-1111-1111-1111-111111111111" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+233200000001",
    "sender_id": "TAYSEND",
    "message": "Hello from Taysend",
    "type": "transactional"
  }'

Try it in the sandbox

Sends a simulated TEST message. No API key and no real SMS.

Sandbox

TEST

This number ends as delivered.

Response

{
  "id": "msg_…",
  "status": "QUEUED",
  "environment": "TEST"
}

Get your API key

Mint a TEST key in the console. It is shown once.

Get API Key →

Need help?

Routing, sender IDs, or a contract rate.

Contact us →

cURL, Node, Python, PHP

No official SDK. Call the API with a Bearer key and JSON.

Open the quickstart →

cURL

Quickstart

Node

fetch

Python

HTTP

PHP

HTTP