For developers

Virtual number API: provision numbers from your own code

A REST API over the same real-carrier numbers sold on the site — permanent and OTP alike. Buy, renew, and read SMS programmatically, wallet-funded and idempotent.

How it's built

Bearer key auth

One API key per account, sent as an Authorization: Bearer header or X-API-Key.

Wallet-funded

Every call spends from a balance you top up in crypto — no separate API billing.

Idempotent by key

Purchases and renewals accept an Idempotency-Key header so a retried request never double-charges.

Signed webhooks

Register a URL and get real-time, signed events instead of polling.

Rate-limited

Every response carries rate-limit headers so you can back off cleanly.

Renew and auto-renew

Renew a number manually or flip on auto-renew from your balance.

Endpoints

MethodPathWhat it does
GET/api/v1/balanceRead your current wallet balance
GET/api/v1/catalogList countries, plans and your resale price for each
POST/api/v1/numbersBuy a number for a country and plan, charged from your balance
GET/api/v1/numbersList the numbers on your account, with status and expiry
GET/api/v1/numbers/{id}Get one number's details and status
GET/api/v1/numbers/{id}/smsList messages received on a number
POST/api/v1/numbers/{id}/renewRenew a number for another plan period
POST/api/v1/numbers/{id}/autorenewTurn auto-renew on or off for a number
GET / PUT/api/v1/webhookRead or set your webhook URL for real-time events
GET/api/v1/otp-catalogList OTP services, countries and your resale price for each
POST/api/v1/otp-numbersBuy a single-use OTP number, charged from your balance
GET/api/v1/otp-numbersList your OTP activations, with status
GET/api/v1/otp-numbers/{id}Get one activation's live status and SMS code
POST/api/v1/otp-numbers/{id}/resendRequest an SMS resend, where the upstream route supports it
POST/api/v1/otp-numbers/{id}/cancelCancel a waiting activation for a full refund

Full request and response fields, headers and error codes are in your dashboard's developer section once you have a key.

Quick example

curl https://vnumbr.com/api/v1/numbers \
  -X POST \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Idempotency-Key: order-8f21" \
  -H "Content-Type: application/json" \
  -d '{"countryCode":"US","subscriptionOption":"month"}'

API questions

How do I get an API key?

Create a free account, open the developer section of your dashboard, and generate a key. There is no approval wait and no monthly fee — you pay only from your wallet balance when you buy or renew a number.

How does authentication work?

Send your key as an Authorization: Bearer header, or as an X-API-Key header, on every request.

What happens if a request times out and I retry it?

Purchase and renewal endpoints accept an Idempotency-Key header. Retry the same request with the same key and you get back the original result instead of a duplicate charge.

How do I find out when a number is ready or a message arrives?

Set a webhook URL with PUT /api/v1/webhook. We POST signed JSON events to it (for example number.provisioned and sms.received) with a signature header you can verify.

What are the rate limits?

Each response includes rate-limit headers so you can see your remaining quota and back off cleanly if you are close to the limit.

Can I resell numbers under my own brand?

Yes. The catalog endpoint returns your own resale price only — your customers never see the underlying cost.

Does the API cover OTP numbers too?

Yes. Alongside the permanent-number endpoints, a parallel set of otp-numbers endpoints lets you buy, check, resend and cancel single-use OTP activations the same way.

Where do I get help with the API?

Use the Support page in your dashboard, or email [email protected].

Ready to integrate?

Create a free account and generate a key in minutes.

Create an account