Get started

Bulk SMS API reference

BulkSMSAPI is a bulk SMS API for developers: send one text or a batch of up to 10,000 numbers per request to 227 countries over REST, follow every message with signed webhooks, and pay per message from a prepaid balance. This reference covers every endpoint, field, event and error the API has. Every page is also available as Markdown: add .md to its address.

Base URL and format

All requests go to https://bulksmsapi.cc/v1 over HTTPS. Bodies are JSON (Content-Type: application/json, UTF-8), and every answer is JSON, including errors. Times are ISO 8601 in UTC. Money is a string in US dollars with five decimals ("0.00507"), so prices below a cent are exact.

Endpoints

Method and pathWhat it doesKey
POST /v1/messagesSend one text to one numberYes
POST /v1/batchesSend to up to 10,000 numbers, one text or one per numberYes
GET /v1/messages/{id}One message with its status and priceYes
GET /v1/messagesMessages, newest first, filter by batch or statusYes
GET /v1/batches/{id}One batch with counts per statusYes
GET /v1/batchesBatches, newest firstYes
POST /v1/batches/{id}/cancelCancel a scheduled batch, full refundYes
POST /v1/estimatesPrice a request without sending itYes
GET /v1/balanceBalance in USDYes
GET /v1/pricingPrice per segment for every countryNo
GET /v1/pricing/{country}Price for one country (ISO code)No

A first request

Create an API key in the console, export it, and send a message. The answer is 202 with the message object: the cost is taken from the balance and the message is queued.

curl https://bulksmsapi.cc/v1/messages \
  -H "Authorization: Bearer $BULKSMSAPI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+14155550123",
    "text": "Your Northwind code is 482913. It expires in 10 minutes.",
    "reference": "login-7781"
  }'
202 AcceptedJSON
{
  "id": "msg_8F3K2Q9TZ1MX",
  "object": "message",
  "batch_id": "bat_4M7Q1X0PK2RS",
  "to": "+14155550123",
  "country": "US",
  "text": "Your Northwind code is 482913. It expires in 10 minutes.",
  "segments": 1,
  "price": "0.00507",
  "currency": "USD",
  "status": "queued",
  "error": null,
  "reference": "login-7781",
  "created_at": "2026-11-07T09:30:12.418Z",
  "sent_at": null,
  "done_at": null
}

How a message moves

Accepted messages are queued (or scheduled when the request has send_at). The queue hands them to the network every two seconds, up to 1,200 per minute per account, and they become sent. The final status is delivered or failed; a failed message is refunded to the balance at once. Each final status calls your webhook with a signed event.

Limits at a glance

LimitValue
Recipients per API request10,000
Recipients per console campaign50,000
Requests per minute per key600
Messages handed to the network per minute per account1,200
Longest text10 segments (1,530 GSM-7 or 670 UCS-2 characters)
Schedule window2 minutes to 45 days ahead
Webhook attempts per event10
Idempotency-Key memory24 hours
API keys per account10

Machine-readable files

Bulk SMS API reference | BulkSMSAPI Docs