Skip to main content
This guide covers the Silent Network Authentication (SNA) only integration using the OTPless SDK. In this configuration SNA is the single authentication channel — there is no OTP, WhatsApp, or other fallback. The flow is designed for backend-controlled, server-verified authentication.

The three building blocks

The integration is built from three pieces that work together regardless of platform (Android or iOS):
StepComponentWhere it runsPurpose
1. CreateCreate APIYour server → OTPless ServerRegisters the user’s identity (phone number) and returns a requestId that links the identity to a future auth flow.
2. Initialize & StartAndroid SDK / iOS SDKClient appInitializes the SDK, then starts SNA with the requestId. The SDK drives the silent network handshake and emits lifecycle callbacks.
3. Status CheckStatus Check APIYour server → OTPless ServerYour backend polls the consolidated auth status for the requestId and decides the final outcome.
In an SNA-only configuration the server is the source of truth. Your backend must rely on the Status Check API result — not the SDK callback alone — to confirm a successful login.

How the SDK and APIs stitch together

The requestId is the thread that ties every step together:
  1. Your server calls Create with the user’s phone number and receives a requestId.
  2. Your server hands the requestId back to the client app.
  3. The client app passes the requestId to the SDK via start().
  4. The SDK performs the silent network handshake with the Telco Server and reports progress through callbacks.
  5. Independently, your server polls Status Check with the same requestId to determine the final, authoritative result.

Data flow

The flow is the same on every platform — only the SDK calls differ. The client app starts polling its own backend immediately after calling start(requestId), while the SDK runs the SNA handshake in parallel.

How to perform the status check

There are two ways to drive the Status Check API poll:
Begin polling from your backend immediately after calling the SDK start() method, and keep polling until you receive a terminal state (SUCCESS or FAILED).Always enforce a timeout threshold — if no terminal state is reached within that window, stop polling and mark the transaction as failed (timeout). This prevents the poll from running indefinitely if the flow never resolves.
Regardless of the approach, the Status Check API result from your server — not the SDK callback alone — is the source of truth for confirming a successful login.

SDK callback states

The SDK works in two steps, and each step has its own set of callbacks. First, the SDK must be initialized. Once initialization succeeds, you invoke the start() method to begin authentication.

Step 1: Initialization callbacks

Emitted when you initialize the SDK.
CallbackStateMeaning
SDK_READYNon-terminalSDK initialized successfully. You may enable the continue button or proceed with auth.
FAILEDTerminalSDK failed to initialize. Retry initialization.

Step 2: Start callbacks

Emitted after you invoke start() to begin authentication.
CallbackStateMeaning
INITIATENon-terminalBackend pre-checks passed and SNA is being attempted. Show a loading state.
ONETAPSuccess — terminalSNA completed successfully.
AUTH_TERMINATEDFailed — terminalAuth could not complete. Emitted either because pre-checks failed, or because SNA was attempted and then failed/expired.

Create API

Generate a requestId from the user’s phone number.

Android SDK

Initialize and start SNA on Android.

iOS SDK

Initialize and start SNA on iOS.

Status Check API

Poll the authoritative auth status from your server.