Phone verification for the Pacific

Codes that reach Papua New Guinea.

Auskal OTP sends each code on the best route for its country, switches route automatically when a carrier rejects it, and only says "delivered" when the phone confirms it.

242countries and territories
4providers routed
1 callto send, 1 to verify
+675 •••• 3456Delivered
482915 is your Auskal verification code.
route PG · smsFailover
Infobip rejected → Twilio Verify accepted in 0.8 s
How it works

From a tap to a verified user, with every hop visible.

Most OTP tools stop at "sent". Auskal follows the message to the handset and back, so you can see where a code got stuck.

  1. RequestYour app calls /v1/verifications. Number checked, landlines refused, limits applied.
  2. RouteThe router picks the best provider for the country, based on measured delivery.
  3. AcceptedThe provider takes the message. Shown as accepted, never as delivered.
  4. DeliveredThe carrier confirms the handset received it. A rejection triggers one automatic failover.
  5. VerifiedThe user enters the code. Your server confirms a single-use token.

Smart routing and failover

Per-country route order, promoted automatically when another route delivers at least 10 points better. A permanent rejection moves to the backup route with a fresh code.

Honest delivery status

Accepted, sent, delivered, failed or unknown. Delivery reports from Infobip and Twilio are matched, de-duplicated and reconciled if they never arrive.

Fraud and cost controls

Country allow-lists, limits per phone, IP, tenant and country, daily spend caps and monthly quotas stop SMS pumping before it costs you.

Operator dashboard

Delivery rate, median delivery time and spend by country and provider. Tenants, API keys, routes and a test console in one place.

Drop-in widget

One script gives you a phone field with 242 country codes, code boxes with paste and Android autofill, resend timers and WhatsApp fallback.

Private by design

Codes are stored only as keyed hashes. Phone numbers are masked in logs and purged after 30 days. Webhooks are signed.

Live demo

Verify a number right here.

This demo runs in sandbox mode: no real SMS is sent and the code appears on screen. Numbers ending in 0000 show a failed delivery; 2222 shows a missing report.

Open the checkout template · Login template · Signup template

Coverage

Default Pacific routes

Primary and backup route per destination, with estimated cost per verification. Prices are list or account rates as of 5 Nov 2026, in USD; set your own in config/routes.json.

DestinationPrimaryEst. USDBackupEst. USDWhy
Pricing

Start free. Pay when it works for you.

Try live codes on real phones first. When you're happy with delivery, choose a plan.

Developers

Two calls. Done.

Send from your server, verify, and you're finished. Or use the browser widget with a publishable key, then confirm the token on your server.

Full integration guide

# 1. send
curl -X POST https://sms.auskal.tech/v1/verifications \
  -H "Authorization: Bearer $AUSKAL_SECRET_KEY" \
  -d '{"to":"+67570123456","purpose":"login"}'
# → {"id":"otp_…","delivery":{"status":"accepted"}, …}

# 2. check
curl -X POST https://sms.auskal.tech/v1/verifications/otp_…/check \
  -H "Authorization: Bearer $AUSKAL_SECRET_KEY" \
  -d '{"code":"482915"}'
# → {"valid":true,"status":"verified","verification_token":"…"}