Verify
OTP without the boilerplate
Start a verification challenge with one POST, check it with another. Throttling, expiry, attempt limits, and channel fallback are built in. The bits every team rewrites the first time, done once and done right.
How it works
Two POSTs. One verified user.
Step 1 · Start the challenge
curl -X POST https://api.zevsend.com/v1/verify/start \ -H "Authorization: Bearer zs_live_***" \ -H "Content-Type: application/json" \ -d '{ "channel": "sms", "to": "+2348100000000", "length": 6, "expires_in": 300 }'
We generate the code, send it through the channel you picked, and return a challenge id.
Step 2 · Check the user's input
curl -X POST https://api.zevsend.com/v1/verify/check \ -H "Authorization: Bearer zs_live_***" \ -H "Content-Type: application/json" \ -d '{ "id": "ver_4t5u6v7w...", "code": "482310" }'
We match the code, enforce expiry and attempt limits, and return verified or not. You skip the Redis dance.
What you get
6 things you don't have to build.
On by default the moment you mint your first API key. No premium tier, no add-on.
- One API for SMS, WhatsApp, and email codes
- Configurable length, format, expiry, attempts
- Per-recipient throttling out of the box
- Fallback to another channel if delivery silently fails
- Localised templates with sensible defaults
- Per-challenge audit log for compliance reviews
Ready when
you are.
Open the console, verify a domain, and send your first message in under five minutes. Free sandbox, no credit card.