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 Verdict Capture 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.
cursorstring—Pagination cursor. Pass the next_cursor from the previous page.
policystring—Filter to a single policy ID (e.g. scooter_parking).
statusstring—Filter by success or error.
is_compliantboolean—Filter by outcome — true or false.
start_datestring—ISO 8601 lower bound (inclusive) on created_at.
end_datestring—ISO 8601 upper bound (inclusive) on created_at.

Example

curl "https://verdictcapture.com/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://verdictcapture.com/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://verdictcapture.com/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 Verdict Capture, 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

What do you need to verify?

Tell us about the evidence, the decision and the workflow around it.

Discuss your workflow