Dev Mode & Test Pairs

Dev mode lets you drive a complete verification flow — request, deliver, verify — without sending a single message to anyone. You get a temporary test pair: a synthetic phone number and a matching OTP. Send the OTP request to that number, type that code, and the transaction succeeds exactly as a real one would.


How it works

Enable dev mode on the surface you're integrating against:

  • V1.2 REST API → enable it on the pipeline.
  • V2.0 Widget SDK → enable it on the widget.

Akedly then mints a test pair and holds it for a 60-minute window. While that window is open, any verification request whose phone number matches the test pair's number is treated as a test: the stored test OTP becomes the transaction's OTP, and the whole delivery path is skipped.

Any other phone number sent to the same pipeline or widget during that window behaves completely normally — real code, real delivery, real billing. Dev mode does not put your integration into a global test state; it only special-cases the one number. (One exception: V1.2's optional bypass toggles, which are pipeline-wide — see Proof-of-work and Turnstile below.)


Choosing the OTP length

When you enable or rotate a test pair you can choose whether its OTP is 4, 5 or 6 digits. This is the length you will actually type, and it is the length the transaction is created with — so it is how you test a non-default digit length end to end.

  • Name
    Length
    Type
    4 | 5 | 6
    Description

    The number of digits in the minted test OTP. Defaults to 6.

  • Name
    Scope
    Type
    per rotation
    Description

    The length is a property of the pair you just minted, not a saved pipeline or widget setting. Rotate again at a different length and the new pair simply has a different length.

Because the length lives in the pair itself, the rule is simply: the test pair's OTP length is the length. There is no separate setting that could drift out of sync with the code you were given.


What is skipped

A test transaction deliberately bypasses the machinery that would otherwise have real-world side effects:

SkippedWhy it matters
Message deliveryNo WhatsApp, SMS, Telegram or email is sent — the successful delivery is synthesized for display.
BillingThe transaction carries no billing state, so repeated testing costs nothing.
Delivery webhooksmetaWebhookForwardUrl is not attached, so your endpoint is not called with test traffic.
Operational alertsTest transactions do not raise the internal success/failure notifications real traffic does.
Rate limiting & circuit breakerBoth are skipped for the test number, and test traffic is excluded from the counters and buckets they measure — so a tight test loop neither consumes your budget nor trips the breaker for real users.

Your own callbacks still fire, and the redirect carries isTest=true so your application can tell a test verification from a real one.

Proof-of-work and Turnstile are handled differently

These two are not simply "off in dev mode", and they differ by surface:

  • V2.0 Widget SDK — proof-of-work is skipped for the test-pair attempt only; real traffic against the same widget keeps full protection. Turnstile is still required for test attempts, but the hosted widget completes it for you, so it costs you nothing.
  • V1.2 REST API — proof-of-work and Turnstile still apply to the test number. If your test client cannot solve them, the dev-mode panel offers two explicit opt-in toggles, Bypass PoW and Bypass Turnstile.

Using it

  1. Enable dev mode on the pipeline (V1.2) or widget (V2) in the dashboard, choosing an OTP length of 4, 5 or 6.
  2. Copy the test pair — the dashboard shows the synthetic phone number and its OTP.
  3. Start a verification for that phone number exactly as you would for a real user.
  4. Submit the test OTP. The transaction verifies, your callbacks fire, and nothing is sent or billed.

Was this page helpful?