POST /verifications
Text a one-time code to a mobile number.
Sends a 6-digit code by SMS in your account's registered company name (the legal name we verified when the account went active). 403 account_not_active until the account is active. The price for the number's country (GET /verify/prices) is taken from your prepaid balance before the code is sent, once per Idempotency-Key; a code that is not sent is refunded. 402 insufficient_balance when the balance does not cover it. A code lives 10 minutes and allows 5 checks. Up to 5 codes a second per key and per account, and 5 an hour to one number from one account. Codes are refused for countries we do not serve, and paused for a short while when traffic looks like SMS pumping. 423 account_locked when the account is locked pending a Trust & Safety review.
Fields
| Name | In | Type | |
|---|---|---|---|
| Idempotency-Key * | header | string | Required on every POST. 8-128 characters: letters, digits, dot, colon, hyphen or underscore. The first response is stored for 24 hours and replayed for any retry with the same key and the same body. Two rules, set per operation by x-charged. Charged or partner-side operations (x-charged true: dips, dip batches, orders, SMS, porting) never re-run while a first attempt is unfinished: a retry answers 409 idempotency_key_in_use (outcome pending) until the first outcome is stored, and the key is also given to the partner as its own reference, so one key never causes more than one order, charge or message, even across failures. A charged operation that fails part-way stores that failure as the key's answer; only a refusal before anything ran (400, 401, 402, 403, 404, 429) frees the key for a retry. Operations with no outside effect (x-charged false) hold their key for at most 2 minutes; after that a retry runs fresh. Missing: 400 missing_parameter (param Idempotency-Key). Malformed: 400 invalid_parameter. Same key, different body: 409 idempotency_key_reused. First request still running: 409 idempotency_key_in_use. |
| to * | body | string | The mobile number to text the code to, in international format with a leading +. |
| channel | body | sms | How the code is sent. Only sms today. |
| currency | body | string | The balance to pay from (any currency we charge in). Defaults to your account's currency. |
* required
Example
curl -X POST "https://api.voicepro.plus/v3/verifications" \
-H "Authorization: Bearer vpkey_YOUR_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"to":"+447700900123","channel":"sms","currency":"GBP"}'{
"object": "verification",
"id": "vrf_3f9a1c7e2b8d4a6f0c5e9b1d",
"to": "+447700900123",
"channel": "sms",
"status": "pending",
"checks_left": 5,
"expires_at": "2026-11-12T10:10:00Z",
"charge": {
"amount": "0.12",
"currency": "GBP"
},
"created_at": "2026-11-12T10:00:00Z",
"approved_at": null
}Errors
Every error has the same shape: { "error": { "type", "code", "message", "param", "request_id" } }.