Reseller API v1

Stable REST API for automating SMS number rentals. JSON in, JSON out. Same infrastructure the SMSVerifyo website uses, so latency, uptime and pricing match what you see in your dashboard.

Base URL: https://smsverifyo.com
Auth: Bearer token
Format: JSON (UTF-8)
TLS 1.2+ only
Getting started in 3 minutes
  1. Sign up and add credit to your account (Cryptomus / Stripe / Paddle / PayTR / Shopier).
  2. Open the API keys page, click Create key — the key is shown once and also emailed to you. Store it in a secret manager or environment variable. Format: sk_live_… (56 chars).
  3. Send it as an HTTP header on every request:
    Authorization: Bearer sk_live_…
  4. Start with GET /balance to confirm the key works, then GET /services → GET /countries → POST /order → poll GET /order/{id}.
Conventions
  • All amounts are in USD with 4-decimal precision.
  • All timestamps are ISO-8601 UTC (2026-07-03T01:32:11Z).
  • Successful responses always include "ok": true. Errors return { ok: false, error: { message, code } } with an HTTP 4xx/5xx status.
  • CORS is enabled (Access-Control-Allow-Origin: *) — API keys must live on the server, never in a browser.
  • Responses are Cache-Control: no-store. Do not cache order state.
GET
/api/public/v1/balance

Returns the current account balance in USD. Call before ordering to make sure you have funds.

Request

curl -H "Authorization: Bearer $KEY" https://smsverifyo.com/api/public/v1/balance

Response 200

{
  "ok": true,
  "balance_usd": 42.5000,
  "currency": "USD",
  "email": "you@example.com",
  "username": "reseller1"
}
GET
/api/public/v1/services

Lists every enabled service (WhatsApp, Telegram, Google, etc.). Cache this — it changes rarely.

Request

curl -H "Authorization: Bearer $KEY" https://smsverifyo.com/api/public/v1/services

Response 200

{
  "ok": true,
  "services": [
    { "id": "d0…uuid", "code": "wa", "name": "WhatsApp" },
    { "id": "e1…uuid", "code": "tg", "name": "Telegram" }
  ]
}
GET
/api/public/v1/countries

Lists countries available for a given service with live per-number pricing and availability.

Parameters

NameTypeRequiredDescription
service_iduuidyesThe service.id returned by /services.

Request

curl -H "Authorization: Bearer $KEY" \
  "https://smsverifyo.com/api/public/v1/countries?service_id=SERVICE_UUID"

Response 200

{
  "ok": true,
  "countries": [
    { "country_id": 0, "name": "Russia",  "flag": "🇷🇺", "price_usd": 0.15, "available": 42 },
    { "country_id": 1, "name": "Ukraine", "flag": "🇺🇦", "price_usd": 0.22, "available":  8 }
  ]
}
POST
/api/public/v1/order

Rents a number. Atomically debits your balance and returns the phone number. Order starts in status waiting.

Parameters

NameTypeRequiredDescription
service_iduuidyesService to rent for.
country_idintyesCountry id from /countries.

Request

curl -X POST -H "Authorization: Bearer $KEY" \
  -H "Content-Type: application/json" \
  -d '{"service_id":"SERVICE_UUID","country_id":0}' \
  https://smsverifyo.com/api/public/v1/order

Response 200

{
  "ok": true,
  "order": {
    "id": "b7…uuid",
    "phone": "79001234567",
    "status": "waiting",
    "price_usd": 0.18,
    "balance_usd": 42.32,
    "expires_at": "2026-07-03T02:00:00Z"
  }
}
GET
/api/public/v1/order/{id}

Polls an order. Poll every 3–5 seconds. When the SMS arrives, status becomes received and sms_code is returned.

Request

curl -H "Authorization: Bearer $KEY" https://smsverifyo.com/api/public/v1/order/ORDER_ID

Response 200

{
  "ok": true,
  "order": {
    "id": "b7…uuid",
    "phone": "79001234567",
    "status": "received",
    "sms_code": "123456",
    "received_at": "2026-07-03T01:32:11Z"
  }
}
POST
/api/public/v1/order/{id}/cancel

Cancels a waiting order after the cooldown window and refunds the balance. Not allowed once an SMS has arrived.

Request

curl -X POST -H "Authorization: Bearer $KEY" \
  https://smsverifyo.com/api/public/v1/order/ORDER_ID/cancel

Response 200

{ "ok": true, "status": "cancelled", "balance_usd": 42.50 }
POST
/api/public/v1/order/{id}/finish

Marks an order as finished once you're done with the code. Optional — orders auto-finalize after expiry.

Request

curl -X POST -H "Authorization: Bearer $KEY" \
  https://smsverifyo.com/api/public/v1/order/ORDER_ID/finish

Response 200

{ "ok": true, "status": "finished" }
Order lifecycle
  1. POST /order → status waiting, balance debited atomically.
  2. Poll GET /order/{id} every 3–5 s (max ~20 min).
  3. SMS arrives → status received, sms_code populated.
  4. Call /finish to close, or /cancel before an SMS arrives (after the cooldown) for an automatic refund.
  5. If nothing arrives before expiry, the order auto-transitions to expired and the balance is refunded automatically.
Error codes
HTTPerror.codeWhen it happens
401unauthorizedMissing / invalid / revoked API key.
400invalid_requestMissing or malformed body parameters.
402insufficient_fundsBalance is not enough to cover the order price.
404not_foundOrder id does not exist or belongs to another user.
409invalid_stateTrying to cancel/finish an order in the wrong state.
429rate_limitedToo many requests. Back off and retry.
503no_numbersProvider has no available numbers for this service/country.
Rate limits & best practices
  • Soft limit: ~120 requests/minute per key. Bursts are tolerated; sustained overload returns 429.
  • Poll intervals: 3–5 s recommended. Anything under 1 s counts as abuse and can revoke the key.
  • Cache /services for at least an hour and /countries per service for a few minutes — pricing updates aren't real-time.
  • Always retry transient 5xx and 429 with exponential backoff (2 s, 4 s, 8 s…).
  • Rotate API keys periodically. Revoke old keys from the API keys page — takes effect instantly.
  • Treat your key like a password. Anyone with it can spend your balance.
Support
Questions or integration help? Open a ticket from the Support page or email info@smsverifyo.com.