Your uptime monitor checks for a 200. It doesn't check if the code arrived.

otp-watch is synthetic monitoring for the one thing your status page can't see: whether the verification SMS or email your users need to log in is actually being delivered, and how fast. Rent a real target, send your own code to it, get told when it breaks.

Email checks free · 3 free SMS checks · SMS monitors €29/mo

Try it now — no terminal needed

Enter any email to get a free API key instantly:

Prefer the API directly? See the curl version just below.

The gap

Your auth provider returns 200 OK. Your uptime check is green. And yet a carrier filter, a spam-folder change, a suspended sender domain, or a broken SMS route means a chunk of your users never receive their code and simply can't sign in. You find out from a support ticket, days later. otp-watch closes the loop by actually receiving the message end to end, the same way a user would.

Quickstart — a free one-off email check

# get an API key
curl -X POST https://otpwatch.flo-voice1.com/keys \
  -H 'content-type: application/json' -d '{"email":"you@example.com"}'
# => {"key":"ow_..."}
# start a check — you get back a real disposable address
curl -X POST https://otpwatch.flo-voice1.com/checks \
  -H 'authorization: Bearer ow_...' \
  -H 'content-type: application/json' -d '{"channel":"email"}'
# => {"id":"chk_...","target":"a1b2c3@receivemail.dev","status":"pending"}
# trigger your app's verification email to that address, then poll:
curl https://otpwatch.flo-voice1.com/checks/chk_... \
  -H 'authorization: Bearer ow_...'
# => {"status":"received","latencyMs":4200}   (or "timed_out")

How it works

  1. You ask otp-watch for a target. A real UK phone number (rented live) or a real disposable email address.
  2. You trigger your own send. From your app, your CI job, your signup flow — otp-watch never touches your system.
  3. You poll for the result. received with a latency figure, or timed_out. Your own cron or CI job turns that into an alert — a red build is the alert.

SMS monitors

A one-off SMS check rents a fresh number each time — fine for a manual test, too expensive to run every 15 minutes. A monitor rents one real number for the month and reuses it for unlimited checks against that same number. The number can change when the month renews — always read it from GET /monitors.

# create a Stripe Checkout session for a monitor
curl -X POST https://otpwatch.flo-voice1.com/monitors/checkout \
  -H 'authorization: Bearer ow_...'
# => {"checkoutUrl":"https://checkout.stripe.com/..."}

# after payment, the monitor exists:
curl https://otpwatch.flo-voice1.com/monitors -H 'authorization: Bearer ow_...'

# run a check against it — no new rental:
curl -X POST https://otpwatch.flo-voice1.com/monitors/MON_ID/checks \
  -H 'authorization: Bearer ow_...'

Endpoints

EndpointDescription
POST /keysIssue an API key. Body {"email":"..."}.
POST /checksStart a one-off check. Body {"channel":"sms"|"email","timeoutSeconds"?:number}. Returns a real target and a check id. Email is unlimited; SMS uses your free trial allowance (402 once it's spent).
GET /checks/:idPoll a check: pending → received (with latencyMs) or timed_out.
GET /usageHow many free SMS checks your key has left.
POST /monitors/checkoutGet a Stripe Checkout URL for a €29/mo SMS monitor.
GET /monitorsList your active monitors.
POST /monitors/:id/checksRun a check against an existing monitor's number — no new rental.
POST /monitors/portalStripe billing-portal link to cancel or manage a monitor.

Pricing

Free

Email delivery checks, unlimited — one-off or on your own schedule. Powered by receivemail.dev. Includes 3 free one-off SMS checks per key to try the SMS side, since each of those rents a real number.

€29 / month

Per SMS monitor. A real UK number kept for the whole month (it can change at renewal), unlimited checks, cancel anytime from the billing portal. Billed through Stripe.

FAQ

Does otp-watch send the verification code?

No. It only provides the target and receives what lands there. You trigger the send from your own system, so the whole path — your provider, the carrier, the inbox — is exercised exactly as it is for a real user.

Do I need to run a cron job?

For continuous monitoring, yes — by design. otp-watch deliberately has no scheduler or alerting in v1. Your CI or cron calls it on whatever interval you want and fails loudly on timed_out. That keeps the service small and lets your existing alerting stack own the paging.

Which countries do the SMS numbers cover?

UK numbers today (same real-SIM hardware pool as sms-florin). If you need other countries for delivery monitoring, get in touch.

How is this different from a normal uptime monitor?

An uptime monitor confirms your API answered. otp-watch confirms a human on the other end would have received the code. Those are not the same check, and only the second one tells you your login flow still works.

Guides

FAQ: pricing, timeouts, CI usage and limits

How to monitor whether your OTP codes actually get delivered

How to test your Twilio Verify / OTP integration without burning SMS credits