Multi-tenant SMS microservice platform providing reliable SMS delivery through provider integrations.
Welcome to the ExoSend API documentation. This API allows you to send SMS messages, manage sender IDs, and monitor delivery status.
Authorization: Bearer {token} header for all requests.API requests are rate-limited per organization. The default limit is 60 requests per minute. Contact support if you need higher limits.
ExoSend uses a prepaid credits system. Each SMS message deducts credits based on the destination country and message length. Check your balance via the /balance endpoint.
As you scroll, you'll see code examples for working with the API in different programming languages in the dark area to the right (or as part of the content on mobile).
To authenticate requests, include an Authorization header with the value "Bearer {YOUR_API_TOKEN}".
All authenticated endpoints are marked with a requires authentication badge in the documentation below.
You can retrieve your API token by logging into the ExoSend admin panel at /admin and navigating to your profile settings. Click Create New Token to generate an API token.
APIs for managing your ExoSend account balance and credits.
Retrieve your organization's current credit balance. Credits are used to send SMS messages, with costs varying by destination country and message length.
curl --request GET \
--get "https://send.exoclass.com/api/v1/balance" \
--header "Authorization: Bearer {YOUR_API_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": true,
"data": {
"balance": 99.965,
"currency": "EUR",
"organization": "ExoClass"
}
}
APIs for sending SMS messages and checking delivery status.
Queue a single SMS message for delivery. The message will be sent asynchronously and credits will be deducted immediately.
curl --request POST \
"https://send.exoclass.com/api/v1/sms/send" \
--header "Authorization: Bearer {YOUR_API_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"recipient\": \"+37061234567\",
\"message\": \"Hello from ExoSend! Your verification code is 123456.\",
\"sender_id\": \"EXOCLASS\"
}"
{
"success": true,
"data": {
"message_id": "9a7f2e5c-1234-5678-90ab-cdef12345678",
"status": "pending",
"cost": 0.035,
"segments": 1,
"balance_remaining": 99.965
},
"message": "SMS queued for sending"
}
Queue multiple SMS messages to different recipients with the same content. Invalid phone numbers will be filtered out, and only valid recipients will receive messages. Credits are deducted for all valid recipients before sending.
curl --request POST \
"https://send.exoclass.com/api/v1/sms/send-bulk" \
--header "Authorization: Bearer {YOUR_API_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"recipients\": [
\"+37061234567\",
\"+37061234568\",
\"+37061234569\"
],
\"message\": \"Bulk notification: System maintenance scheduled for tonight.\",
\"sender_id\": \"EXOCLASS\"
}"
{
"success": true,
"data": {
"total_messages": 3,
"total_cost": 0.105,
"balance_remaining": 99.895,
"message_ids": [
"9a7f2e5c-1234-5678-90ab-cdef12345678",
"9a7f2e5c-1234-5678-90ab-cdef12345679",
"9a7f2e5c-1234-5678-90ab-cdef12345680"
],
"invalid_recipients": []
},
"message": "Bulk SMS queued for sending"
}
Retrieve the current delivery status of a previously sent SMS message. Only messages belonging to your organization can be accessed.
The UUID of the message.
curl --request GET \
--get "https://send.exoclass.com/api/v1/sms/9a7f2e5c-1234-5678-90ab-cdef12345678/status" \
--header "Authorization: Bearer {YOUR_API_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": true,
"data": {
"id": "9a7f2e5c-1234-5678-90ab-cdef12345678",
"status": "delivered",
"recipient": "+37061234567",
"cost": 0.035,
"segments": 1,
"sent_at": "2026-01-03T14:30:00+00:00",
"delivered_at": "2026-01-03T14:30:15+00:00",
"error_message": null,
"error_code": null
}
}
APIs for managing sender IDs (sender names that appear on SMS messages). Sender IDs must be approved by administrators and verified by providers before use.
Retrieve all sender IDs for your organization with optional status filtering. By default, only verified sender IDs are returned.
Filter by status. Options: verified, pending, approved, rejected, all. Default: verified.
curl --request GET \
--get "https://send.exoclass.com/api/v1/sender-ids?status=verified" \
--header "Authorization: Bearer {YOUR_API_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": true,
"data": [
{
"id": "9a7f2e5c-1234-5678-90ab-cdef12345678",
"sender_id": "EXOCLASS",
"admin_status": "approved",
"provider_status": "verified",
"is_verified": true,
"is_default": true,
"rejection_reason": null,
"message_count": 42,
"created_at": "2026-01-01T10:00:00+00:00",
"approved_at": "2026-01-01T12:00:00+00:00",
"verified_at": "2026-01-01T14:00:00+00:00"
},
{
"id": "9a7f2e5c-1234-5678-90ab-cdef12345679",
"sender_id": "EXOSMS",
"admin_status": "approved",
"provider_status": "verified",
"is_verified": true,
"is_default": false,
"rejection_reason": null,
"message_count": 15,
"created_at": "2026-01-02T10:00:00+00:00",
"approved_at": "2026-01-02T11:00:00+00:00",
"verified_at": "2026-01-02T13:00:00+00:00"
}
]
}
Submit a new sender ID request for approval. The sender ID will be created in pending status and must go through a two-stage approval process:
Only after both stages can the sender ID be used for sending messages.
curl --request POST \
"https://send.exoclass.com/api/v1/sender-ids" \
--header "Authorization: Bearer {YOUR_API_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data "{
\"sender_id\": \"EXOCLASS\"
}"
{
"success": true,
"data": {
"id": "9a7f2e5c-1234-5678-90ab-cdef12345678",
"sender_id": "EXOCLASS",
"admin_status": "pending",
"provider_status": "pending",
"is_verified": false,
"is_default": false,
"created_at": "2026-01-03T14:30:00+00:00"
},
"message": "Sender ID request submitted. Awaiting approval from administrator."
}
Set a verified sender ID as the default for your organization. Only verified sender IDs can be set as default. Automatically unsets any previously set default sender ID.
The UUID of the sender ID.
curl --request PATCH \
"https://send.exoclass.com/api/v1/sender-ids/9a7f2e5c-1234-5678-90ab-cdef12345678/default" \
--header "Authorization: Bearer {YOUR_API_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": true,
"data": {
"id": "9a7f2e5c-1234-5678-90ab-cdef12345678",
"sender_id": "EXOCLASS",
"is_verified": true,
"is_default": true
},
"message": "Sender ID set as default"
}
Delete a sender ID from your organization. Sender IDs with existing messages or set as default cannot be deleted.
The UUID of the sender ID.
curl --request DELETE \
"https://send.exoclass.com/api/v1/sender-ids/9a7f2e5c-1234-5678-90ab-cdef12345678" \
--header "Authorization: Bearer {YOUR_API_TOKEN}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" {
"success": true,
"data": null,
"message": "Sender ID deleted successfully"
}