OTP Delivery Logs and Costs
Check the destination, delivery channel, status and cost of each OTP request. Use dashboard logs to investigate failed deliveries and monitor spending.
Investigate Delivery Issues per Request
When a user reports a missing code, check the request in your dashboard. OTP logs show the destination, delivery status, channel and cost.
See which channel confirmed delivery, including requests that fell back to another channel.
For updates in your application, configure delivery and verification webhooks. You can also fetch a verification while it is pending.
- Destination +9779841000000
- Delivery status DELIVERED
- Channel whatsapp
- Price 0.0120 USD
- Created 2026-09-12T09:14:22Z
Example log details. Prices shown are illustrative.
Review Delivery Status and Spending
Check individual requests to understand delivery outcomes and account usage.
Cost per Request
Review the cost recorded for each OTP request in your dashboard.
The Channel That Delivered
See whether a code arrived over SMS, WhatsApp, Viber or RCS, including after a fallback.
Delivery and Verification
Delivery confirmation tells you the message arrived. A successful verification tells you the user entered the correct code.
Free to Read
Fetching a verification costs nothing and doesn’t use up one of the code’s check attempts.
Monitor OTPs From Your Dashboard and App
Review requests in the dashboard, fetch pending verifications and receive updates through webhooks.
OTP Logs in Your Dashboard
Review the destination, delivery channel, status and cost of each request.
Fetch a Verification
Use the verification SID to read a pending verification. Approved, expired and locked verifications return a 404.
Receive Webhooks
Get a signed event when a code is delivered, fails on every channel, is verified or expires.
Receive Delivery Updates by Webhook
Configure a webhook URL and signing secret in your dashboard. SecondFactor sends events for delivery, failure, verification and expiry.
A delivery event includes the destination, channel and cost so far. The charged amount is rounded to two decimal places. Use the verification check response to decide whether to grant access to your user.
# Delivery webhook (excerpt) { "event": "otp.delivered", "request_id": "OTP26H7K3M9PQRSTVW", "phone": "+9779800000000", "status": "DELIVERED", "channel": "WHATSAPP", "charged": "0.02", "verified_at": null }
Track Delivery and Verification Separately
These webhook events tell you when a code arrives, fails, is verified or expires.
Delivered
otp.delivered: a carrier confirmed delivery. The user still needs to enter the code.
Failed
otp.failed: every eligible channel was tried and none confirmed delivery.
Verified
otp.verified: the user’s code was accepted.
Expired
otp.expired: the code expired before it was successfully verified.
Understand What You Are Charged For
Sending a code creates a charge. Checking the code and fetching a pending verification are free.
One Charge per Accepted Send
Each accepted send is one charge. The charge stands whether or not the message is delivered.
Refused Sends Are Free
A send that is refused with an error is not charged.
Checking and Fetching Are Free
Verifying a code and reading a verification’s status cost nothing.
Sending Again Is a New Charge
A new code to the same number is a new send. Limit how often users can request one.
More SecondFactor Features
Automatic OTP Routing and Fallback
Route codes through eligible channels, with fallback after eight seconds without delivery confirmation. Learn more →
OTP Template Management
Create templates per channel, track approval and choose one per request. Learn more →
PIE Playground
Send a real OTP, inspect its route and verify the code before you integrate. Learn more →
Frequently Asked Questions
Write to support@secondfactor.ai for anything not covered here.
Where Can I See Whether an OTP Was Delivered?+
Check the OTP logs in your dashboard or configure webhooks to receive otp.delivered and otp.failed events in your application.
Is the Cost Shown for Each Request?+
Yes. Your dashboard shows the cost of each OTP request. Webhooks also include a charged amount, rounded to two decimal places.
Am I Charged for an OTP That Isn’t Delivered?+
Yes. An accepted send is charged whether or not the message is delivered. A send that is refused with an error is not charged.
Does It Cost Anything to Check Delivery Status?+
No. Fetching a verification is free and doesn’t count as a check attempt on the code.
Does Delivered Mean the User Has Verified Their Number?+
No. Delivered means a carrier confirmed delivery. The user must still enter the code, and your application must check it successfully before treating the number as verified.
Can I Fetch a Verification After It Is Complete?+
No. The fetch endpoint returns pending verifications only. A 404 cannot distinguish an approved verification from an expired, locked or unknown one. Keep the outcome from the check response and webhooks in your application.
How Often Can I Poll for Delivery?+
Poll no more than once per second, and stop at the first 404 or your own timeout. Polling tells you when a verification is no longer pending; use the check response and webhooks to learn the outcome.
Send a Test OTP and Review Its Log
Create an account to send a test OTP and inspect its log, or talk to our team about pricing for your destination markets.