Verifications API

Every call to POST /v1/verify writes a row scoped to your account. These two endpoints read that history back: list verifications with filters and cursor pagination, and retrieve a single verification by ID with a freshly signed image URL. Both are read-only and account-scoped — you only ever see your own verifications.

Authentication

Both endpoints authenticate the same way as every VerifyAI request.

HeaderRequiredValue
X-API-KeyYesYour vai_… key. See Authentication.

List verifications

text
GET /api/v1/verifications

Returns your most recent verifications, newest first, with cursor-based pagination. Use the query parameters to filter by policy, status, compliance, or date range.

Query parameters

ParameterTypeDefaultDescription
limitnumber20Page size. Clamped to a maximum of 100.
cursorstringPagination cursor. Pass the next_cursor from the previous page.
policystringFilter to a single policy ID (e.g. scooter_parking).
statusstringFilter by success or error.
is_compliantbooleanFilter by outcome — true or false.
start_datestringISO 8601 lower bound (inclusive) on created_at.
end_datestringISO 8601 upper bound (inclusive) on created_at.

Example

curl "https://verify.switchlabs.dev/api/v1/verifications?limit=20&policy=scooter_parking&is_compliant=false" \
-H "X-API-Key: vai_your_api_key"

Response

json
{
  "data": [
    {
      "id": "ver_8x92m4k9",
      "created_at": "2026-05-12T14:30:00Z",
      "status": "success",
      "is_compliant": false,
      "confidence": 0.94,
      "policy": "scooter_parking",
      "violation_reasons": ["blocking_sidewalk", "kickstand_up"],
      "feedback": "Please deploy the kickstand and move away from the walkway.",
      "metadata": { "trip_id": "trip_456" },
      "image_url": "https://...signed-url..."
    }
  ],
  "has_more": true,
  "next_cursor": "2026-05-12T14:30:00Z"
}

Response fields

FieldTypeDescription
dataobject[]The page of verification summaries, newest first.
has_morebooleantrue when more results exist past this page.
next_cursorstring?Pass as cursor to fetch the next page. null on the last page.

Each item in data carries id, created_at, status, is_compliant, confidence, policy, violation_reasons, feedback, metadata, and a freshly signed image_url (null when storage is disabled).

List items omit category

The list endpoint returns a compact summary and does not include the category field. If you need the resolved category for a specific verification, fetch it from the retrieve endpoint below, or read it from the original POST /v1/verify response.

Paginating

next_cursor is the created_at of the last item on the page. Pass it back as cursor and keep going until has_more is false:

let cursor = null;
const all = [];
do {
const params = new URLSearchParams({ limit: "100" });
if (cursor) params.set("cursor", cursor);
const res = await fetch(
  "https://verify.switchlabs.dev/api/v1/verifications?" + params,
  { headers: { "X-API-Key": process.env.VERIFY_AI_KEY } },
);
const page = await res.json();
all.push(...page.data);
cursor = page.next_cursor;
} while (cursor);

Retrieve a verification

text
GET /api/v1/verifications/:id

Returns a single verification by its ver_ ID. The image URL is signed fresh on every call — use this endpoint when an image_url from an earlier response has expired.

Example

curl https://verify.switchlabs.dev/api/v1/verifications/ver_8x92m4k9 \
-H "X-API-Key: vai_your_api_key"

Response

json
{
  "id": "ver_8x92m4k9",
  "created_at": "2026-05-12T14:30:00Z",
  "status": "success",
  "is_compliant": false,
  "confidence": 0.94,
  "policy": "scooter_parking",
  "violation_reasons": ["blocking_sidewalk", "kickstand_up"],
  "feedback": "Please deploy the kickstand and move away from the walkway.",
  "metadata": { "trip_id": "trip_456" },
  "image_url": "https://...signed-url...",
  "processing_time_ms": 1184,
  "error_message": null
}

Response fields

FieldTypeDescription
idstringThe verification ID, prefix ver_.
created_atISO 8601When the verification was processed.
statusstringsuccess or error.
is_compliantbooleanTop-level pass/fail decision.
confidencenumber0–1 confidence score from the underlying model.
policystringThe policy ID that ran.
violation_reasonsstring[]Machine-readable IDs of the failed criteria.
feedbackstringHuman-readable explanation, safe to surface to end users.
metadataobjectThe metadata you sent with the original request.
image_urlstring?Freshly signed URL to the stored image. null if storage is disabled.
processing_time_msnumber?Server-side processing time for the original verification.
error_messagestring?Populated when status is error; otherwise null.

Errors

StatusReason
401Missing or invalid API key.
403API key not valid for VerifyAI, or not linked to a customer.
404Verification not found, or it belongs to a different account (retrieve).
429Rate limit — check the Retry-After header.
500Failed to fetch verifications.
503Authentication service unavailable. Retry.

What's next

Get in Touch

Questions about pricing, integrations, or custom deployments? We'd love to hear from you.