Rate limits & billing
The limits, wallet model, and per-number pricing that govern every order.
Rate limit
All endpoints share one throttle scope: 120 requests / minute, applied per API key (not per IP, so resellers behind a shared NAT do not eat each other's quota). Exceeding it returns 429 with code throttled; the message states how many seconds to wait before retrying.
HTTP/1.1 429 Too Many Requests
{ "message": "Request was throttled. Expected available in 30 seconds.", "code": "throttled", "is_error": true }Prepaid wallet
- Currency: 1 token = 1 USD. Balances and costs are USD, to 6 decimal places.
- Prepaid: you must have funds before submitting. Top-ups are arranged with your account manager (no self-serve top-up endpoint yet).
- Charged at submit time (
POST /orders). The charge isinput_count × price_per_number, whereinput_countis the count of valid, deduplicated numbers accepted from your file. The exactcostandwallet_balance_afterare returned in the submit response. - Atomic: a failed submit never leaves a partial charge.
- Auto-refund on failure: if an order ends in
failed, the exact amount you were charged is automatically refunded.
Check your balance
curl -s "https://api.p-syke.com/api/reseller/balance" -H "X-Reseller-API-Key: $KEY"{ "token_balance": "98.460000", "currency": "USD" }token_balance is a precise decimal string — parse it as a decimal, not a float, if you need exact accounting.
Per-number pricing
Each service has its own USD-per-number rate — see the services catalog for the full table, or fetch it live with GET /services. Example: 2,000 numbers × tg-active (0.0004) = $0.80.
File limits & rules
- Format: plain text, one phone number per line, read as UTF-8.
- Digits only, no
+prefix. Thecountryfield supplies the dialing context. Numbers are normalized to a canonical digit form for that country (e.g. US 10-digit →1XXXXXXXXXX), malformed/empty lines are dropped, and duplicates removed. - Minimum order: 2,000 valid numbers after normalization (fewer →
MIN_NUMBERS, nothing charged). - Max file size: 20 MB (larger →
FILE_TOO_LARGE).
Idempotency
Send an Idempotency-Key header (any unique string, ≤ 64 chars — a UUID works well) with every submit. If your request times out and you retry with the same key, the API returns the original order (HTTP 200 with "replayed": true) instead of creating and charging a second one. Keys are scoped to your account. Without the header, every retry that reaches the server creates a new, separately charged order.