Power your authentication with WhatsApp OTP
Secure, fast, developer-friendly WhatsApp OTP authentication for websites and mobile applications — self-hosted, REST-first, and live in minutes.
- Self-hosted, your data stays yours
- REST API, any language
- Docker & Render ready
482 917
Expires in 5 minutes. Never share this code.09:41
0
% uptime target0
SDK languages0
median API response0
Docker command to deployEverything you need to ship WhatsApp OTP
A complete authentication gateway — API, dashboard, and delivery — built for developers who want control over their own stack.
WhatsApp OTP delivery
Codes are sent through your own connected WhatsApp number via whatsapp-web.js — no SMS carrier fees.
Simple REST API
Two endpoints — send and verify. Predictable JSON, clear error codes, works with any backend.
Admin dashboard
Manage connected WhatsApp sessions, API keys, and delivery logs from one responsive dashboard.
Rate limiting
Per-key and per-number limits protect your WhatsApp account from abuse and spam patterns.
Secure API keys
Scoped, revocable keys with hashed storage. Rotate instantly if a key is ever exposed.
OTP expiration
Configurable time-to-live per request. Expired codes are rejected automatically at the API layer.
Analytics
Delivery rate, verification rate, and latency trends across every connected website or app.
Full request logs
Every send and verify attempt is logged with status, timestamp, and originating website.
Docker & SQLite
Ships as a Docker image with SQLite by default — no external database required to get running.
One-click Render deploy
Deploy the gateway to Render with a pre-configured blueprint — no server management needed.
Automatic reconnect
If the WhatsApp session drops, VerifyOne detects it and prompts a fresh QR pairing automatically.
Multi-website support
Connect several websites or apps to one VerifyOne instance, each with its own scoped API key.
From zero to your first OTP in four steps
Connect once, then every website you own can send verification codes through the same gateway.
Connect WhatsApp
Scan a QR code once to link the business number VerifyOne will send codes from.
Generate an API key
Create a scoped key for each website or app from the dashboard, in a few seconds.
Integrate the API
Call /send and /verify from your backend using any of five SDKs.
Start sending OTPs
Codes deliver over WhatsApp in seconds, with full logs and analytics from day one.
A REST API you'll understand in one read
Two core endpoints, JSON in and out, and SDKs for the languages developers actually ship with.
# Send a one-time passcode
curl -X POST https://api.verifyone.dev/v1/otp/send \
-H "Authorization: Bearer v1_live_9f2a...c7d1" \
-H "Content-Type: application/json" \
-d '{"phone": "+15551234567", "template": "signin"}'
const res = await fetch("https://api.verifyone.dev/v1/otp/send", {
method: "POST",
headers: {
"Authorization": "Bearer v1_live_9f2a...c7d1",
"Content-Type": "application/json"
},
body: JSON.stringify({ phone: "+15551234567", template: "signin" })
});
const data = await res.json();
const { VerifyOne } = require("verifyone-node");
const client = new VerifyOne("v1_live_9f2a...c7d1");
const otp = await client.otp.send({
phone: "+15551234567",
template: "signin"
});
$client = new VerifyOne\Client("v1_live_9f2a...c7d1");
$otp = $client->otp->send([
"phone" => "+15551234567",
"template" => "signin"
]);
from verifyone import Client
client = Client("v1_live_9f2a...c7d1")
otp = client.otp.send(
phone="+15551234567",
template="signin"
)
{
"success": true,
"otp_id": "otp_8f3ac1",
"expires_in": 300,
"channel": "whatsapp"
}401 invalid_api_key
422 invalid_phone_number
429 rate_limit_exceeded
409 otp_already_sent
410 otp_expired
403 otp_mismatchA dashboard that stays out of your way
Everything you need to monitor delivery, manage keys, and pair devices — nothing you don't.
Scan with the WhatsApp account you want VerifyOne to send codes from. Reconnects automatically if the session drops.
What early developers are saying
Example quotes shown for illustration — real testimonials will replace these at launch.
"Swapped our SMS OTP provider for VerifyOne in an afternoon. Self-hosting it means we're not waiting on carrier delivery windows anymore."
"The Docker image plus SQLite meant zero extra infrastructure. We had staging and production running the same day."
"Multi-website support let us run one gateway across three client projects, each with its own scoped key and logs."
Start free, self-hosted, no credit card
VerifyOne is currently free to self-host. Managed and commercial plans are planned for a future release.
Starter
Everything you need to self-host VerifyOne today.
- Unlimited OTPs (your WhatsApp number)
- Full REST API access
- Admin dashboard included
- Docker & Render deployment
- Community support
Pro Coming soon
Managed hosting with automated backups and priority support.
- Managed hosting
- Automated backups
- Multi-device WhatsApp support
- Priority email support
Business Coming soon
For teams running VerifyOne across many websites and apps.
- SLA-backed uptime
- Team roles & permissions
- Dedicated support channel
- Custom rate limits
Set up VerifyOne wherever you deploy
Guides for installation, environment configuration, and everyday operation.
Installation
Authentication
Environment variables
| Key | Purpose |
|---|---|
| PORT | Server port |
| DB_PATH | SQLite file path |
| OTP_TTL | Expiry, seconds |
| API_SECRET | Key signing secret |
Frequently asked questions
Ready to connect your first website?
Self-host VerifyOne for free and start sending WhatsApp OTPs today.
Talk to the VerifyOne team
Questions about setup, self-hosting, or what's coming next — reach out any time.
hello@verifyone.dev
GitHub
github.com/verifyone/verifyone