How-to · 4 min read

Handling OTP errors and rate limits

Build resilient verification: timeouts, refunds for missed codes, retry/backoff, and respecting rate limits.

Verification is inherently flaky — codes occasionally don't arrive and pools sell out. Resilient code handles that gracefully.

Missed codes

If no SMS arrives within your window, cancel the order — you're refunded, so a miss costs nothing.

try:
    code = wait_for_otp(order.order_id, timeout=120)
except TimeoutError:
    client.orders.cancel(order.order_id)   # refunded
    # retry in another country/service based on live availability

Rate limits

The API returns 429 when you exceed your plan's RPM. Back off exponentially and retry — don't hammer.

Sold-out pools

A create call can fail if a (country, service) pool is empty. Pick the next option from the live availability the pricing endpoints report, rather than retrying the same dead pool.


Ready to build? Create a free Eveses account, top up a wallet, and grab your API key — no KYC. See the API docs or live pricing.

FAQ

▸What happens if the OTP never arrives?
Cancel the order within your timeout window — you are refunded, so a missed code costs nothing.
▸How do I handle 429 rate limits?
Back off exponentially and retry. Respect your plan RPM rather than hammering the endpoint.
Related guides