The API ships with live ordering. Nothing below is callable yet — this is the contract we are building to. Get one email when it goes live.
Developers
readynum API
A clean REST API for renting numbers and reading codes — with the same honesty rules the site runs on, enforced by the response shapes themselves. We publish the contract before the endpoints so you can review it, integrate against it, and tell us where it is wrong while that is still cheap to fix.
That invitation has an address: every message goes to the same inbox a human answers, and a contract change is cheaper today than a breaking change later. Tell us what's wrong with it →
Design principles
Four rules shape every endpoint. They are the API translation of the promises on the rest of this site — which means breaking one of them in the API would be a launch blocker, not a patch note.
A success figure is never a bare number
Success rates come back as a state-tagged object — measured with its sample size and window, supplier_reported with the supplier named, or no_data. The shape makes an unlabelled percentage impossible to render from our response. Where the honest state is no_data, show your users the words, not a dash — ours are “We don't have data for this route yet”.
Stock is binary
"stock": true means buyable right now; false means it is not. There is no count field and there never will be — not ours, not a supplier's passed through. A number you can see is a number you can buy.
Orders are idempotent
Every POST /v1/orders carries an Idempotency-Key header. Retry a timed-out request with the same key and you get the same order back — never a second charge. Webhook deliveries carry event ids for the same reason.
Refunds are first-class
A refund is a field on the order object and a webhook event — not a support ticket. The policy below is quoted verbatim, because it must read identically here, on the refund page, and in the app at the moment you rent:
If a code doesn't arrive, you don't pay. We auto-refund your wallet within 5 minutes when a number fails to receive a valid code. No form, no waiting. Refunds go to your readynum balance instantly and never expire. Prefer a card refund? Ask support and we'll send it back the way you paid within 5 business days.
Base URL and authentication
The base URL and API keys are published when the API ships — printing one now would imply a server that answers. GET /v1/prices will need no key at all: public prices are the point. Everything else authenticates with a bearer key from your account. at launch
Endpoint reference
Every value in the examples below is illustrative. The field shapes are the contract; the prices, rates, numbers and timestamps are placeholders, not measurements.
GET/v1/pricesat launch
Price, stock and route state — before you pay
One call per route: the price, binary stock, and the success-rate object in whichever of its three states is true. The no_data example below is deliberate — at launch it is the majority state, and the API says so instead of inventing a number.
Send back the price you saw as max_price. If the route's current price is higher when your order lands, we reject it and charge nothing — the quote you saw is the most you can ever pay. Retries reuse the same Idempotency-Key, so a network timeout can never double-charge you.
{
"error": "max_price_exceeded",
"message": "The current price is above your max_price.
No order was created and nothing was charged.",
"current_price": { "amount": "0.52", "currency": "USD" }
}
GET/v1/orders/{id}at launch
Poll status and read received SMS
The order carries its lifecycle state and every received message, with the verification code extracted for you. Message bodies auto-delete after 24 hours — read codes promptly, or skip polling entirely and use the webhooks below.
waiting_for_sms — number issued, listening.
code_received — at least one message arrived.
refunded — no valid code, or you cancelled; the refund object says which and when.
Cancel any time before a code arrives; the refund is in the response, credited to your wallet — not opened as a ticket. Orders that already received a code can't be cancelled: the service was delivered.
Response — 200, cancelled and refundedillustrative
Register an HTTPS endpoint and we push events as they happen. Two event types at launch: code.received and order.refunded. Deliveries are signed with an HMAC header — verify before trusting — and retried with backoff, so handle events idempotently by their id.
A field you need that isn't here, a state we forgot, a shape that would be painful to consume — this is the point in the page where you know that, so this is where we ask again. Tell us what's wrong with it →
Also shipping with the API
The OpenAPI 3.1 spec is live now at /api/openapi.json — the same contract you just read, machine-readable, so your client generator can produce a client today. Every operation in it carries "x-implemented": false, because generating a client is not the same as calling one.
A sandbox key that simulates the full lifecycle — issue, receive, timeout, refund — with fake numbers and injectable test codes, so you integrate without spending money. at launch
Python and Node SDKs, MIT-licensed, plus copy-paste examples in cURL, Python, Node, PHP and Go throughout the full reference. at launch
Be first against the real endpoints
One email when the API is callable, and nothing else. If the contract changes before launch, the changelog is in that email too.
Every country and service we carry
Every route below is one click away. Open a country to see its services, or jump straight to a service hub.