Developer-first

One API in front of every provider.

Order, poll, release — that is the whole surface for most integrations. Plain HTTPS and JSON, bearer auth, no client library required and no proprietary protocol to learn.

The whole flow, in two calls

# Order a US number for WhatsApp
curl -s https://smsmetro.com/api/v1/activations \
  -H "Authorization: Bearer $SMSMETRO_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"service":"whatsapp","country":"US"}'

# Poll until the code lands
curl -s https://smsmetro.com/api/v1/activations/ACT_ID \
  -H "Authorization: Bearer $SMSMETRO_KEY"

Or skip polling entirely and take a signed webhook the moment the message arrives.

What the API gives you

Smart or manual routing

Let routing pick the source — balanced, cheapest, fastest or best quality per request — or list every offer for a country and service and buy a specific one.

Signed webhooks

Deliveries carry an HMAC-SHA256 signature over a timestamp and the raw body, so you can verify authenticity and reject replays.

Idempotent purchases

Every purchase takes an Idempotency-Key, claimed in the database before the request runs. A retry after a timeout cannot buy twice.

Scoped keys

Keys carry only the scopes they need — catalogue, read, write, wallet, stats — so a leaked read key cannot spend money.

Wallet-backed billing

Prices are held, then captured or released. Balances derive from a double-entry ledger the database itself refuses to let drift.

Honest status data

Availability is a band, prices are integers in micro-units, and success rates are suppressed until the sample is large enough to mean anything.

Endpoints

EndpointPurpose
GET /v1/countries Countries with routable inventory
GET /v1/services The service catalogue
GET /v1/prices Cheapest price per service
GET /v1/offers Every purchasable source for a country and service
POST /v1/activations Buy a number — smart or manual
GET /v1/activations/{id} State, number, price, expiry
GET /v1/activations/{id}/sms Messages received, code extracted
POST /v1/activations/{id}/cancel Release a number early
GET /v1/balance Wallet balance

Full parameters, response shapes and every error code are in the API documentation.

Where we are honest with you

The API is v1-beta. Breaking changes are announced in advance but remain permitted until three external integrations have sustained thirty days of real traffic. Official SDKs are planned and not yet published — the surface is small enough that plain HTTP is a first-class path, and we would rather ship no SDK than an unmaintained one.

Get an API key in two minutes.

Create an account, generate a scoped key, and make your first call against real inventory.