FAQ

Bulk SMS API questions and answers

39 answers about accounts, sending, prices, delivery reports and the API, checked against the limits in the code. For endpoints and fields, the API reference has the detail.

The service

What is BulkSMSAPI?

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. A web console sends campaigns from a pasted list or CSV without code.

Who uses a bulk SMS API?

Product and engineering teams that send texts from their own systems: login and sign-up codes, order and delivery updates, appointment reminders, payment alerts, service notices and marketing campaigns. Anyone who can make an HTTPS request can use it.

Which countries can I send to?

227 countries and territories, listed with their prices on the pricing page and the countries pages. One request can mix countries: every number is priced by the country it belongs to.

Is there a monthly fee or a contract?

No. You pay per message segment from a prepaid balance, and there is no monthly fee, setup fee or minimum volume. The balance has no expiry date.

Is there a free trial?

Accounts start with a zero balance and the first top-up opens everything. The first top-up adds a bonus of up to 40%, so the first messages cost less. Prices are public, and the estimate endpoint and the console show the exact cost before anything is sent.

Account and API keys

How do I create an account?

Open Get API key. Your browser makes an account key that starts with acct_; copy it or save it as a text file, confirm that you saved it, and the account is ready. The account key is the only login: there is no email or password to manage.

What happens if I lose my account key?

We store only a keyed hash of it, so nobody can show it again, including our support team. Keep it in a password manager. While you are still signed in, the console keeps working, and you can contact support from it.

How do I get an API key?

On the API keys page of the console, after the first top-up is credited. Name the key, create it and copy it once: it starts with bsa_live_. An account can hold 10 active keys, each with its own name and rate limit counter.

Can I use different keys for production and staging?

Yes. Create one key per app or environment and give it a name. Each key shows when it was last used, and revoking one leaves the others working.

How many accounts can I create?

Up to 3 accounts per network address. Most teams need one account with several API keys.

Sending messages

How many numbers can one request take?

POST /v1/batches takes up to 10,000 numbers per request, either one text for everyone or a personal text per number. The console takes 50,000 numbers per campaign. Larger lists are split into several requests.

How fast are messages sent?

The queue runs every two seconds and hands up to 1,200 messages per minute per account to the network, in the order they were accepted. A single message usually leaves within a few seconds of the request.

What format should phone numbers be in?

International E.164: a plus sign, the calling code and the national number, such as +14155550123. Spaces, dashes, brackets and a 00 prefix are cleaned automatically; duplicates and numbers that cannot be read are set aside and not charged.

How long can a message be?

Up to 10 segments: 1,530 characters in GSM-7 or 670 in Unicode. One segment holds 160 GSM-7 or 70 Unicode characters; longer texts are split into parts of 153 or 67 characters and joined again on the phone.

Why did my message use more segments than I expected?

One character outside the GSM-7 alphabet, such as a curly quote, an emoji or a letter like á or ç, switches the whole text to Unicode at 70 characters per segment. The console composer names those characters, and POST /v1/estimates returns the encoding before you send.

Can I schedule messages?

Yes. Add send_at to an API request, or pick a time in the console, from 2 minutes to 45 days ahead. A scheduled batch can be canceled until it starts, and its full cost returns to the balance.

Can each recipient get a different text?

Yes. Through the API, send a batch with messages, one {to, text} per recipient. In the console, paste or upload a list with extra columns and use merge fields {{1}} to {{9}} in the text.

Is an opt-out line added to my messages?

Set your opt-out wording once in Settings, for example a link or an email address, and the console adds it to campaign texts when you tick the box. Through the API you control the full text, so add the line yourself to marketing messages. Numbers on your do-not-send list are skipped by the console and the API, and not charged.

Can I send a test message first?

Yes. The console has a test send to one number before a campaign, and through the API you can send a single message to your own phone with POST /v1/messages.

Prices and payments

How much does one SMS cost?

It depends on the country of the number: each country has one price per segment in US dollars, from $0.00247 (Brazil). The pricing page and GET /v1/pricing list every country.

How is the cost of a batch worked out?

For each recipient: the price per segment of its country times the segments of its text. The sum is taken from the balance when the request is accepted, and the answer shows it in cost.

What is the minimum top-up?

$40. A top-up can be any amount from $40 to $5,000. The first top-up adds a bonus of up to 40%, shown on each amount before you pay.

How do I pay?

In the console, Billing opens a hosted checkout in a window over the page. You choose the amount and pay in cryptocurrency, and the payment page shows the exact amount and address. The payments page lists each step.

Are failed messages refunded?

Yes. When a message fails, its price returns to the balance automatically in the same pass, as a refund line in the ledger. A canceled scheduled batch is refunded in full.

Can I withdraw my balance?

The balance pays for messages and stays in your account with no expiry date. Refunds for failed or canceled messages go back to the balance as well.

Do prices change?

Prices can change when network costs change. The current list is dated, the API returns the date with every price, and messages already accepted keep the price they were charged at.

Delivery and reports

How do I know a message was delivered?

Each message moves from queued to sent to delivered or failed. Add a webhook URL in the console to get a signed event for every final status, or read GET /v1/messages/{id} and GET /v1/batches/{id}.

How are webhooks signed?

In the Standard Webhooks format: headers webhook-id, webhook-timestamp and webhook-signature, where the signature is HMAC-SHA256 of id, timestamp and raw body with your whsec_ secret. The docs have verification code for Node.js, Python, PHP and Go.

What if my webhook endpoint is down?

Every event gets 10 attempts over about 24 hours, and every attempt is listed in the console with its HTTP status. You can also poll the message endpoints at any time.

Why would a message fail?

The handset may be switched off for too long, the number may no longer be in service, or the network may refuse the message. The failed status carries an error code, and the price is refunded.

How long are message records kept?

Batches, messages and the balance ledger stay in your account and in the API. The request log keeps your last 500 API calls and the webhook log your last 500 deliveries.

For developers

Is there an SDK?

The API is plain JSON over HTTPS, so the standard library of any language is enough. The docs have complete samples in curl, Node.js, Python, PHP and Go, and the OpenAPI spec at /openapi.json generates a typed client in most languages.

What are the rate limits?

600 requests per minute per API key. Every answer has X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset headers, and a 429 answer has Retry-After.

How do I retry safely after a timeout?

Send POST requests with an Idempotency-Key header and retry with the same key. For 24 hours the same key and body return the first answer instead of sending again.

Can I check prices without an API key?

Yes. GET /v1/pricing and GET /v1/pricing/{country} are public, so a checkout page or dashboard can show live prices.

Where do I see what my code sent?

The console has a request log with the method, path, status and time of your last 500 API calls, next to batches, messages and the webhook log.

The console

Can I send without writing code?

Yes. In the console, paste numbers or upload a CSV file of up to 50,000 rows, write the text with merge fields, check the preview for each recipient and the cost per country, and send now or at a set time.

What does the console show?

Balance, recent batches with live counts, each batch with its messages and statuses, top-ups and the ledger, API keys, webhook settings and deliveries, the request log, the price list, support tickets and settings.

How do I contact support?

From the Support page of the console. Payment questions can be asked from the first day; the other topics open after the first top-up is credited.

Still have a question?

Signed-in accounts can open a support ticket from the console. Payment questions can be asked from the first day.

Bulk SMS API FAQ: Keys, Sending, Prices, Webhooks | BulkSMSAPI