Send SMS from your own backend.
One endpoint, the same sending engine the Sendly dashboard itself uses — so a message sent through the API is billed, routed, and reported on exactly like one sent from the composer. Generate an API key from your dashboard's API keys page once you're signed in.
Authentication
Every request carries your API key as a bearer token — never your dashboard login, and a leaked API key can never be used to sign into the dashboard either.
Authorization: Bearer <publicKey>.<secret>Send a message
/api/v1/messages/sendEvery mutating request requires an Idempotency-Key header — a value you generate yourself and reuse if you need to retry the same request. A repeated request with the same key returns the original result instead of sending a second message.
curl -X POST https://sendly.ng/api/v1/messages/send \
-H "Authorization: Bearer <publicKey>.<secret>" \
-H "Idempotency-Key: <a-unique-value-per-request>" \
-H "Content-Type: application/json" \
-d '{
"channel": "sms",
"senderId": "Sendly",
"route": "TRANSACTIONAL",
"recipient": "+2348012345678",
"content": "Your OTP is 123456."
}'A successful send returns:
{
"data": {
"messageId": "clx1...",
"status": "SUBMITTED"
}
}A rejected send (an unapproved Sender ID, an unsubscribed contact, insufficient wallet balance, or a validation error) returns a structured error instead of a bare status code, so your integration can show the real reason rather than a generic failure:
{
"error": {
"code": "SEND_FAILED",
"message": "This Sender ID isn't approved with any active messaging provider yet."
}
}Rate limits
Limits apply per API key and per organization, and scale with your account tier — a rate-limited request returns 429 with a Retry-After header rather than failing silently. On the standard tier: 60 requests per minute per key, 120 per minute per organization.
Create an account to generate your first API key.
Create Free Account