---
title: "Check a verification code"
method: POST
path: "/v1/verify/verifications/{verificationId}/check"
tags: ["Verify"]
---

# Check a verification code

`POST /v1/verify/verifications/{verificationId}/check`

Verify the code the user typed. Wrong, expired, and exhausted codes
answer 200 with `valid: false` and the settled `status` — only an
unknown id is a 404. A correct code consumes the verification
(single-use, `status: approved`) and fires the `verification.approved`
webhook; the 5th wrong attempt settles it as `max_attempts_reached`
and fires `verification.failed`.

## Path parameters

- `verificationId` string, required

## Request body

- object
  - `code` string, required

## Response `200`

Check result: the verification plus `valid`.

- object — A managed OTP verification. The code itself is never returned or stored (hash only).
  - `id` string
  - `status` 'pending' | 'approved' | 'expired' | 'max_attempts_reached' | 'canceled' | 'delivery_failed'
  - `channel` 'sms'
  - `to` string
  - `expiresAt` string, date-time
  - `attempts` integer
  - `maxAttempts` integer
  - `sendCount` integer — Accepted deliveries (initial send + resends); each bills one verification fee.
  - `lastSentAt` string, date-time, nullable
  - `createdAt` string, date-time
  - `resend` boolean — Present on create responses: true when an active verification was resent instead of created.
  - `valid` boolean

## Other responses

- `400` — Invalid request
- `401` — Unauthorized
- `404` — Verification not found (or already reaped).

---

[API](https://skmtc.net/zernio/apis/zernio-api.md) · [All operations](https://skmtc.net/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/zernio/zernio-api/versions/f81ca70ea6b9/schema)
