OTP API for Ghana
Protect signups, transactions, and logins with one-time passwords delivered in under 3 seconds. Built for Ghana’s banks, fintechs, and e-commerce platforms.
# Send an OTP in one API call curl -X POST https://sms.arkesel.com/api/otp/generate \ -H "api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "expiry": 5, "length": 6, "medium": "sms", "message": "Your verification code is %otp_code%. It expires in 5 minutes.", "number": "+233244000000", "sender_id": "MyApp", "type": "numeric" }'
Trusted by 10,000+ businesses across Africa








Everything you need to verify users
A complete OTP infrastructure so you can focus on building your product, not managing verification logic.
Auto-Generated OTP
One API call generates, sends, and stores a one-time code. No token logic needed on your end.
Multi-Channel Delivery
Send each OTP by SMS or voice call. You choose the channel on the request. Either way, the recipient can dial a USSD code to retrieve it.
Configurable Expiry & Length
Set OTP length (6–15 digits) and expiry time (1–10 minutes) per request. Different flows, different rules.
Rate Limiting & Fraud Protection
Built-in rate limiting per phone number. Prevent OTP bombing and brute-force verification attempts.
Delivery Receipts & Webhooks
Delivery status callbacks to your own endpoint, plus real-time status in your dashboard. Know when each OTP is delivered, expired, or verified.
Custom Sender ID
Send from your brand name instead of a random number. Build trust with every verification message.
Verify a user in 2 API calls
One POST to send the OTP, another to verify it. Arkesel handles code generation, delivery, expiry, and verification.
- Generate and send with one POST
- Verify with a second POST
- Send on SMS or voice, retrieve by USSD
- Automatic expiry handling
# Step 1: Send OTP curl -X POST https://sms.arkesel.com/api/otp/generate \ -H "api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "expiry": 5, "length": 6, "medium": "sms", "message": "Your code is %otp_code%", "number": "+233244000000", "sender_id": "MyApp", "type": "numeric" }' # Step 2: Verify OTP curl -X POST https://sms.arkesel.com/api/otp/verify \ -H "api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"code": "173882", "number": "+233244000000"}'
import requests API_KEY = "YOUR_API_KEY" BASE = "https://sms.arkesel.com/api/otp" headers = {"api-key": API_KEY, "Content-Type": "application/json"} # Step 1: Send OTP send = requests.post(f"{BASE}/generate", json={ "expiry": 5, "length": 6, "medium": "sms", "message": "Your code is %otp_code%", "number": "+233244000000", "sender_id": "MyApp", "type": "numeric" }, headers=headers) # Step 2: Verify OTP verify = requests.post(f"{BASE}/verify", json={ "code": "173882", "number": "+233244000000" }, headers=headers) print(verify.json())
const API_KEY = "YOUR_API_KEY"; const BASE = "https://sms.arkesel.com/api/otp"; const headers = { "api-key": API_KEY, "Content-Type": "application/json" }; // Step 1: Send OTP const send = await fetch(`${BASE}/generate`, { method: "POST", headers, body: JSON.stringify({ expiry: 5, length: 6, medium: "sms", message: "Your code is %otp_code%", number: "+233244000000", sender_id: "MyApp", type: "numeric" }) }); // Step 2: Verify OTP const verify = await fetch(`${BASE}/verify`, { method: "POST", headers, body: JSON.stringify({ code: "173882", number: "+233244000000" }) }); console.log(await verify.json());
$apiKey = "YOUR_API_KEY"; $base = "https://sms.arkesel.com/api/otp"; $headers = ["api-key: $apiKey", "Content-Type: application/json"]; // Step 1: Send OTP $ch = curl_init("$base/generate"); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_HTTPHEADER => $headers, CURLOPT_POSTFIELDS => json_encode([ "expiry" => 5, "length" => 6, "medium" => "sms", "message" => "Your code is %otp_code%", "number" => "+233244000000", "sender_id" => "MyApp", "type" => "numeric" ]), CURLOPT_RETURNTRANSFER => true, ]); curl_exec($ch); // Step 2: Verify OTP curl_setopt($ch, CURLOPT_URL, "$base/verify"); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([ "code" => "173882", "number" => "+233244000000" ])); echo curl_exec($ch); curl_close($ch);
OTP verification for every industry
From banking to SaaS, secure your users with phone-based verification that works across Ghana.
Bank Transaction Verification
Confirm wire transfers, card payments, and account changes with instant OTP verification.
E-Commerce Checkout
Verify buyers at checkout to reduce fraud and chargebacks. One-tap verification on mobile.
Fintech Account Onboarding
KYC phone verification for mobile money, digital wallets, and lending platforms.
Ride-Hailing Verification
Verify drivers and riders during signup. Confirm identity before every trip for safety.
Healthcare Patient Portals
Secure patient data access with OTP login. Protect health records with multi-channel verification.
SaaS Passwordless Login
Replace passwords with OTP-based magic links. Faster login, fewer support tickets.
Why build OTP with Arkesel?
Ship in Minutes, Not Weeks
Building OTP from scratch means token generation, secure storage, expiry logic, retry mechanisms, and multi-channel routing. With Arkesel, it’s two API calls and you’re live.
Three Channels, One Integration
You pick the channel on each request, SMS or voice. Nothing switches between them on its own. If the message hasn’t arrived, the recipient can dial a USSD code and retrieve the OTP. Voice OTP covers Ghanaian numbers.
Security Without the Engineering
Cryptographically random codes, server-side rate limiting, automatic expiry, and brute-force protection. All handled for you — no security audit needed on your OTP logic.
USSD Verification — No App Required
Whichever channel you sent on, the recipient can dial a USSD code to retrieve their OTP. Any phone, no internet needed.
Simple, transparent OTP pricing
Pay per verification. No monthly fees, no hidden charges.
Go live in 3 steps
From sign-up to first OTP in under 5 minutes.
Create an Account
Sign up for free and get instant access to your dashboard and API credentials.
Get Your API Key
Generate an API key from the dashboard. Use it in the api-key header for all requests.
Send Your First OTP
Copy a code sample, replace the API key, and verify your first user in seconds.
Start verifying users today
Free to sign up. No credit card required. Get your API key and send your first OTP in under 5 minutes.


