The smart route for every OTP & number
One REST API to order temporary verification numbers by service and country, capture one-time passwords through HMAC-signed webhooks, and run dedicated US & Canada lines — billed from a single prepaid USD wallet with automatic refunds.
# Order a temporary verification number
curl -X POST https://otproute.com/api/v1/activations \
-H "Authorization: Bearer or_live_…" \
-H "Content-Type: application/json" \
-d '{"service":"telegram","country":"us","max_price":0.50}'
import requests
r = requests.post(
"https://otproute.com/api/v1/activations",
headers={"Authorization": "Bearer or_live_…"},
json={"service": "telegram", "country": "us", "max_price": 0.50},
)
activation = r.json()
const res = await fetch("https://otproute.com/api/v1/activations", {
method: "POST",
headers: { Authorization: "Bearer or_live_…", "Content-Type": "application/json" },
body: JSON.stringify({ service: "telegram", country: "us", max_price: 0.5 }),
});
const activation = await res.json();
{
"id": "act_9f2c41d0b7e3a6158c24",
"status": "pending",
"service": "telegram",
"country": "us",
"phone_number": "+15550142231"
}X-OTPRoute-Signature: t=1793318400,v1=5f1c9a…
{ "type": "activation.sms_received",
"data": { "id": "act_9f2c41d0b7e3a6158c24", "status": "received", "code": "482913" } }From API call to captured OTP in four steps
Every activation follows the same deterministic path. You request, we route, you receive — or you are refunded.
You call the API
Send POST /v1/activations with a service, a country and an optional max_price ceiling.
We pick the route
The request is matched by service and country against live inventory, and the current price is debited from your wallet.
A number is issued
You get an activation ID and an E.164 phone number with status pending and an activation window of about 20 minutes.
OTP pushed — or refunded
The code is parsed and pushed as activation.sms_received. If nothing arrives, the activation expires and the full amount returns to your wallet.
Prefer to pull? Poll GET /v1/activations/{id} instead. Read the OTP gateway primer or how country routing works.
Short-lived verification or long-lived lines
Use temporary numbers when you need a single code, and dedicated numbers when a line has to stay yours.
OTP Gateway
Temporary verification numbers per service and country, built for automated flows.
- Order by service + country through one endpoint
- OTP extracted and delivered via signed webhook or polling
- From $0.20 per code, with a
max_priceguard - Automatic full refund when no SMS arrives
Virtual Numbers
Dedicated United States and Canada numbers for ongoing verification and operational lines.
- Inbound SMS to dashboard and
number.sms_receivedwebhook - From $1.95/month, renewed from your wallet, release any time
- Outbound SMS from the dashboard or API
- Browser calling — no softphone or SIP setup
Everything your integration needs, nothing it doesn't
A predictable REST surface, a console that shows what happened, and controls that keep spend and access in check.
Scoped API keys
Issue multiple or_live_ keys per account and revoke any of them independently.
Signed webhooks
HMAC-SHA256 signatures with a timestamp on every delivery, per-endpoint secrets and rotation.
Test-send
Fire a test event at any endpoint from the console before you go live.
Delivery log
Inspect each webhook attempt with status code and response excerpt, then fix and retry.
Usage analytics
Per-day API calls and errors plus your top endpoints, so you can spot regressions early.
Live price discovery
GET /v1/prices returns current price and availability per service and country.
Sandbox mode
Simulated numbers and codes with no wallet spend, enabled on request for development accounts.
Clear rate limits
300 requests per minute on every account, with 429 and Retry-After when you exceed them.
Verify every delivery in a few lines
Each webhook carries X-OTPRoute-Signature: t=<unix>,v1=<hex>. Recompute HMAC-SHA256 over <t>.<raw body> with your endpoint secret, compare in constant time and reject stale timestamps.
- Per-endpoint secrets with rotation from the console
- Timestamp binding blocks replayed payloads
- Events for activations and dedicated numbers
import hmac, hashlib, time
def verify(secret: str, header: str, body: bytes, tolerance=300) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
ts, sig = int(parts["t"]), parts["v1"]
if abs(time.time() - ts) > tolerance:
return False
mac = hmac.new(secret.encode(), f"{ts}.".encode() + body, hashlib.sha256)
return hmac.compare_digest(mac.hexdigest(), sig)
import crypto from "node:crypto";
export function verify(secret, header, rawBody, tolerance = 300) {
const p = Object.fromEntries(header.split(",").map((x) => x.split("=")));
if (Math.abs(Date.now() / 1000 - Number(p.t)) > tolerance) return false;
const mac = crypto.createHmac("sha256", secret)
.update(`${p.t}.${rawBody}`).digest("hex");
return mac.length === p.v1.length &&
crypto.timingSafeEqual(Buffer.from(mac), Buffer.from(p.v1));
}
Money rules you can reason about
A prepaid USD wallet, deterministic refunds and audit-friendly records — designed so finance and engineering agree on every cent.
Prepaid USD wallet
Top up once and spend across activations, numbers, SMS and calls. No monthly fee and no subscription.
Automatic refunds
An activation that expires or is cancelled without an SMS is refunded in full to your wallet — exactly once, no ticket required.
Exact-amount crypto
Pay with USDT or USDC via an on-domain QR. Each payment has an exact amount, so deposits match unambiguously.
Card with 3-D Secure
Card top-ups are processed by Stripe with 3-D Secure authentication. Coupons auto-apply at checkout.
Automatic invoices
A PDF invoice is emailed for top-ups and renewals, ready for your accounts payable process.
Fraud controls
Velocity limits on sign-ups, checkouts and orders, plus account locks on chargebacks, protect the platform for everyone.
Details in our Refund Policy and Acceptable Use Policy.
Where teams put OTP Route to work
From test pipelines to onboarding funnels, the same API fits wherever a one-time password sits on the critical path.
QA testing
Exercise real SMS verification paths in manual and automated test plans.
Learn more →CI/CD pipelines
Run end-to-end sign-up tests on every build without shared phones.
Learn more →Fintech onboarding
Validate verification steps across markets before customers ever see them.
Learn more →SaaS onboarding
Monitor and harden the first-run experience of your product's 2FA flow.
Learn more →Route OTPs by country
Availability and price are resolved live per service and country. Dedicated long-term numbers cover the United States and Canada.
Pay as you go. No plans, no subscription.
Every account gets the same wallet, the same API and the same limits. You only pay for what you use.
Verification codes
- 20-minute activation window
- Charged only if the code arrives
- Live price per service and country
Dedicated numbers
- Inbound SMS by dashboard and webhook
- Renewed from your wallet
- Release any time
Pay as you go
- 300 API requests/min
- Up to 10 API keys · 5 webhook endpoints
- Card or USDT/USDC top-ups
Live prices per service and country are shown in the dashboard and via GET /api/v1/prices. See full pricing.
Engineering notes on OTP delivery
Choosing an OTP Provider — A Buyer's Checklist and Scoring Table
Buyer's checklist for OTP routing and gateway providers covering API quality, refunds, webhooks, coverage, pricing, wallet controls, security and support.
Virtual Numbers for Team 2FA and Support Lines (US and Canada)
Use dedicated US and Canada virtual numbers for team 2FA and support lines, with inbound SMS webhooks, browser calling, renewal hygiene and clean release.
Securing OTP Webhooks with HMAC Signatures and Replay Protection
Threat model for OTP webhook endpoints with HMAC-SHA256 verification, constant-time compare, timestamp tolerance and secret rotation, in Python, Node and Go.
Frequently asked questions
What is OTP Route?
How does billing work?
Are there plans or a monthly fee?
How do I receive OTPs programmatically?
Which countries are supported?
Is there a sandbox?
What is OTP Route not for?
Route your first OTP in minutes
Create an account, generate an API key and make your first call. No monthly fee — you only pay for what you use.