One API for OTP — on any channel you choose.
A single integration with channel routing, fallback, sandbox keys and a production-ready panel. Send your first OTP in five minutes.
Four channels, one endpoint.
If the primary channel fails, the request falls through to the next one — no code changes on your side.
Integrate in three steps
Get your API key
Create live and sandbox keys in the panel. In sandbox, 123456 always verifies.
Send the code
Pick a channel or let your routing config decide; fallback is automatic.
Verify
5 attempts, 10-minute TTL, HMAC-stored codes, idempotency support.
Built for developers
TypeScript SDK, an OpenAPI schema, and an MCP server for AI agents. Or five lines of curl.
$ curl -X POST https://api.kolayotp.com/api/v1/otp/send \
-H "Authorization: Bearer kotp_live_..." \
-H "Content-Type: application/json" \
-H "idempotency-key: $(uuidgen)" \
-d '{"recipient":"+905551234567","locale":"tr"}'
{
"id": "otp_3kQ9fT2a",
"channel": "whatsapp",
"status": "sent",
"expires_at": "2026-09-11T09:51:00Z",
"attempts_left": 5
}import { KolayOTP } from "@kolayotp/sdk";
const kotp = new KolayOTP({ apiKey: process.env.KOTP_KEY });
const otp = await kotp.send({
recipient: "+905551234567",
locale: "tr",
// channel: "whatsapp" — omit to use routing config
});
const result = await kotp.verify({
id: otp.id,
code: "482913",
});
if (result.verified) {
// session.create(user)
}{
"mcpServers": {
"kolayotp": {
"command": "npx",
"args": ["-y", "@kolayotp/mcp"],
"env": {
"KOLAYOTP_API_KEY": "kotp_test_..."
}
}
}
}
# Tools exposed to the agent:
# otp_send otp_verify
# otp_resend otp_status
# balance_getA panel that's production-ready on day one
Balance and auto top-up, routing editor, per-channel analytics and live delivery logs.
Pay only for what you send
No subscription, no commitment. Per-channel unit pricing drawn from your balance. Garanti in Turkey, Stripe internationally.
See pricingFrequently asked
Send your first OTP in five minutes.
No credit card. Start on a sandbox key and switch to live when you're ready.