Features / OTP Delivery Logs

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.

Get StartedTalk to Sales

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.

One verification
  • 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.

Read the Webhook Reference →

# 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.

Get StartedTalk to Sales