Skip to main content
POST
Verify a PIN
Submit the code exactly as the user typed it. OneXtel compares it against the stored hash in constant time, so the comparison itself leaks nothing about how close a wrong guess was.

Reading the outcome

A 200 is the only success. Everything else is a distinct error code, and they mean different things to your UI:
Expired and incorrect are deliberately separate codes. Collapsing them into one “invalid code” message makes a user who waited too long retype a code that can never work.

Attempts

Both the 200 response and a pin_incorrect error carry attemptsRemaining. Use it to warn before the PIN is spent — at zero, the next wrong guess returns pin_blocked and the PIN is dead. The allowance is set per template as pinAttempts and is reset by every resend. Verify calls are rate limited per template via verifyPinLimit; exceeding it returns rate_limited (429).

Authorizations

Authorization
string
header
required

An API key from the OneXtel portal, Developers → API Keys, sent as Authorization: Bearer <key>.

Path Parameters

pinId
string
required
Example:

"pin_x9k2m1qz"

Body

application/json
pin
string
required

The code as the end user typed it.

Example:

"123456"

Response

The PIN matched.

pinId
string
Example:

"pin_x9k2m1qz"

status
string
Example:

"VERIFIED"

attemptsRemaining
integer
Example:

2