---
title: "Append an operator verification run"
method: POST
path: "/api/v1/verification"
---

# Append an operator verification run

`POST /api/v1/verification`

## Request

- Base URL: `https://andrewsfreebies.com`
- URL: `https://andrewsfreebies.com/api/v1/verification`
- Auth: HTTP bearer

Operator-only ingestion for up to 100 field-level audit events. This append-only operation does not mutate or remove catalog records. blocked, fetch-error, not-found, and unknown preserve uncertainty and do not establish expiration.

## Request body

- VerificationIngestInput
  - `schema_version` string
  - `generated_at` string, date-time: Defaults to the ingestion time.
  - `run` VerificationRunInput, required
    - `method` string, required
    - `verifier` string
    - `started_at` string, date-time
    - `completed_at` string, date-time
  - `verification_events` VerificationEventInput[], required
    - `record_id` string, required
    - `record_type` 'trial' | 'entitlement', required
    - `category` string: Optional; when present it must match the canonical record category.
    - `url` string, uri, required
    - `url_role` string, required
    - `checked_at` string, date-time: Defaults to generated_at.
    - `method` string: Defaults to run.method.
    - `outcome` 'confirmed-exact' | 'confirmed-partial' | 'terms-changed' | 'explicitly-expired' | 'moved' | 'blocked' | 'fetch-error' | 'not-found' | 'unknown', required: Conservative field-level audit result. blocked, fetch-error, not-found, and unknown do not establish expiration.
    - `content_hash` string
    - `evidence_excerpt` string
    - `matched_fields` string[]
    - `unmatched_fields` string[]
    - `url_health` object, required: Structured status, redirect, and reachability observations.
    - `offer_existence` object, required: Structured evidence for whether the provider currently describes the offer.
    - `terms_match` object, required: Matched, unmatched, and contradicted normalized fields.
    - `redemption_path` object, required: Structured activation, application, or claim-path result.
    - `evidence_quality` object, required: Evidence ownership, authority, and sufficiency.
    - `freshness` object, required: Audit age and next-check scheduling fields.

## Response `201`

Verification events appended; catalog records unchanged

- VerificationIngestReceipt
  - `api_version` '1.9', required
  - `run` object, required
  - `accepted` integer, required
  - `events` VerificationEvent[], required
    - `record_id` string, required
    - `record_type` 'trial' | 'entitlement', required
    - `category` string: Optional; when present it must match the canonical record category.
    - `url` string, uri, required
    - `url_role` string, required
    - `checked_at` string, date-time: Defaults to generated_at.
    - `method` string: Defaults to run.method.
    - `outcome` 'confirmed-exact' | 'confirmed-partial' | 'terms-changed' | 'explicitly-expired' | 'moved' | 'blocked' | 'fetch-error' | 'not-found' | 'unknown', required: Conservative field-level audit result. blocked, fetch-error, not-found, and unknown do not establish expiration.
    - `content_hash` string
    - `evidence_excerpt` string
    - `matched_fields` string[]
    - `unmatched_fields` string[]
    - `url_health` object, required: Structured status, redirect, and reachability observations.
    - `offer_existence` object, required: Structured evidence for whether the provider currently describes the offer.
    - `terms_match` object, required: Matched, unmatched, and contradicted normalized fields.
    - `redemption_path` object, required: Structured activation, application, or claim-path result.
    - `evidence_quality` object, required: Evidence ownership, authority, and sufficiency.
    - `freshness` object, required: Audit age and next-check scheduling fields.
    - `id` string, uuid
    - `run_id` string, uuid
    - `created_at` string, date-time
    - `run` object
      - `schema_version` string
      - `generated_at` string, date-time
      - `method` string
      - `verifier` string, nullable
      - `started_at` string, date-time
      - `completed_at` string, date-time
  - `catalog_records_unchanged` true, required

## Other responses

- `400`: Invalid run or event payload
- `401`: Missing or invalid operator bearer token
- `404`: One or more catalog records not found
- `503`: Verification ledger unavailable

---

[API](https://skmtc.dev/andrewsfreebies/apis/andrew-s-freebies-api.md) · [All operations](https://skmtc.dev/andrewsfreebies/apis/andrew-s-freebies-api/llms.txt) · [OpenAPI document](https://skmtc.dev/andrewsfreebies/apis/andrew-s-freebies-api/revisions/2e23a7a12f7a?raw)
