Worked request and response samples
Copy a request body as written, substitute your own value, and compare the response envelope. Every sample pairs a plain E.164 number — Devotel Orbit forwards it as the CAMARA subject — against adv_test_sk_* sandbox key, so no operator is contacted, no credits are deducted, and the response carries meta.test_mode: true. X-Test-Mode: true behaves the same way when the caller authenticates with a dashboard session instead of a server-to-server key.
The three end to end loops. Number Verification (Silent Auth) proves the SIM behind the asserted number is in the device that made the call, SIM Swap answers whether that SIM changed inside a look-back window, and Device Location answers whether the device is inside a claimed geofence without ever returning coordinates. Fails closed is the rule for each of them: anything that is not an explicit affirmative reads as a negative.
1. Number Verification (Silent Auth)
POST /api/v1/numbers/network-apis/number-verification:verify"phoneNumber" (E.164) or its SHA-256 equivalent "hashedPhoneNumber" — exactly one. Add accessToken when your device already completed the three-legged operator flow; without it the call still runs, but server-context possession is only as strong as the operator deployment allows.
devicePhoneNumberVerified: false means not confirmed — treat it as no assertion, never as proof of absence.
2. SIM Swap check
POST /api/v1/numbers/network-apis/sim-swap:checkmaxAge is the look-back in hours (1..2400, default 240). A swapped: true inside the window is a strong account-takeover signal — step up before you accept the session.
POST /sim-swap:retrieve-date returns the operator’s last SIM-change time under the same envelope.
3. Device Location verification
POST /api/v1/numbers/network-apis/device-location:verifylatitude, longitude) and radius in metres (2,000..200,000) — and the operator answers whether the device is inside it without revealing where it actually is. verificationResult is TRUE, FALSE, PARTIAL (coverage overlap, not a clean hit), or UNKNOWN (no fix inside maxAge seconds, 60..3600).
Error envelope — operator-side rejection
An off-spec body (a non-E.164 number, an out-of-rangeradius) is rejected before any operator sees it, so the 422 with VALIDATION_ERROR costs you nothing and carries the offending field in error.details.issues. When the operator itself rejects the request (an unknown subscriber, an out-of-range window) the rejection is mapped to a caller-correctable 422 with the operator’s own code preserved in upstream_code; when the operator cannot be reached at all, the call surfaces as a 502 UPSTREAM_ERROR rather than a false result. Sandbox keys never reach an operator, so you see this shape only with a live key.
422
phoneNumber in every error detail is masked — a rejection never echoes the full E.164 subject back.