POST /dips
Dip one number: the chosen products, answered now.
Charged from your prepaid balance in the currency the request names (else your account's own currency), at the portal's prices converted at today's rate. The full price of the requested products is taken before the dip runs; if the balance does not cover it the answer is 402 insufficient_balance and no dip runs. Products that do not answer are refunded, and a dip the service cannot answer is refunded in full (503). The Idempotency-Key is recorded with the payment itself, so one key is never charged twice. 423 account_locked when the account is locked pending a Trust & Safety review. Dips run at up to 10 per second per key and up to 10 per second across all of an account's keys; a burst waits once, then 429.
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. |
| number * | body | string | International format, 7 to 15 digits. |
| products | body | array of string | Codes from GET /dips/products; default every product listed there. A code not listed is 400 invalid_parameter. HLR and Live Status are not offered to API keys. |
| currency | body | string | The currency this is paid in: GBP, EUR, USD, JPY, AUD, CAD, CHF, HKD, SGD, INR, AED, KRW or SAR. Paid from your prepaid balance in that currency; left out, your account's own currency. Prices are converted from our USD price list at today's rate. Balances are never converted into one another: a short balance in this currency is 402 insufficient_balance, whatever you hold in others. |
* required
Example
curl -X POST "https://api.voicepro.plus/v3/dips" \
-H "Authorization: Bearer vpkey_YOUR_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"number":"+447700900123","products":["nrv","last_port"],"currency":"GBP"}'{
"object": "dip",
"id": "dip_x7k2m9qwp4zr",
"number": "447700900123",
"country": "GB",
"products": [
"nrv",
"last_port"
],
"results": {
"nrv": {
"tn": "447700900123",
"cc": "GB",
"valid": true,
"source": "local",
"line_type": "mobile",
"range_holder": "Example Mobile Ltd",
"ms": 12
},
"last_port": {
"tn": "447700900123",
"valid": "Y",
"lastPorted": "00/00/0000"
}
},
"charge": {
"amount": "0.0080",
"currency": "USD"
},
"created_at": "2026-10-27T16:45:10Z"
}Errors
Every error has the same shape: { "error": { "type", "code", "message", "param", "request_id" } }.