{"openapi":"3.1.0","info":{"title":"ScrapeCheck","version":"1.0.0","description":"Checks whether a value you did not fetch yourself is actually on the page it came from. Independently re-fetches the source and returns a signed pass/fail/unverifiable verdict. A claim is never certified unless the re-fetched page contains it, and anything unconfirmed is unverifiable, never pass. Server-rendered pages only. $0.01 per check. First 100 checks per client are free: send header X-Use-Free-Allowance: yes with no payment to use them.","contact":{"email":"sales@fieldmodesolutions.com"},"x-guidance":"ScrapeCheck verifies values you already have; it does not find data. Call POST /verify with {url, claim, asked} when you hold a value that came from somewhere else (a search result, a scraper, an upstream API, another agent) and you need to know it is on the source page right now before you act on it. It re-fetches the page itself and never trusts the fetch you were given. Verdicts are pass, fail, or unverifiable; anything unconfirmed is unverifiable, never pass. Use POST /verify-presence only as a cheap screen: it confirms the value appears on the page, NOT that it answers your question, and never returns pass. Scope: server-rendered pages; JS-only content returns unverifiable rather than a guess. First 100 checks per client identity are free — send header X-Use-Free-Allowance: yes with no payment to use them; without that header, or past the allowance, pay per check in-band via x402 (USDC on Base). Do not trust this service at runtime: verdicts are ed25519-signed and verify offline against GET /pubkey, and GET /stats publishes the live verdict mix including failures."},"paths":{"/verify":{"post":{"operationId":"verifyWebField","summary":"Full verification of a held value against the live source page","description":"Checks whether a value you did not fetch yourself is actually on the source page right now, and returns a signed pass/fail/unverifiable verdict. Not a retrieval tool: it checks a value you already have, it does not find data for you. Structural guarantee: a claim is never certified unless the re-fetched page contains it, and the model judge can only veto a pass, never create one. $0.01 per check. First 100 checks per client are free: send header X-Use-Free-Allowance: yes with no payment to use them.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"source page the value came from (public http/https)"},"claim":{"type":"object","description":"the value(s) you hold and want checked, as {field: value}, e.g. {\"price\": \"$45\"}"},"asked":{"type":"string","description":"the question the value is supposed to answer, plain text"}},"required":["url","claim","asked"]}}}},"responses":{"200":{"description":"Signed verdict: verdict_id, verdict (pass|fail|unverifiable), confidence, reasons, evidence, check_type, engine, key_id, verifier_url, source_hash, signature (ed25519, verifies offline against GET /pubkey)"},"400":{"description":"Input does not match the contract"},"402":{"description":"Payment Required"}},"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":0.01}}}},"/verify-presence":{"post":{"operationId":"verifyPresence","summary":"Presence-only screen (never returns pass)","description":"Presence only: confirms the value appears on the page, NOT that it is the right answer to what was asked. Never returns pass. A was-price, a different variant's price, a shipping cost, or a tax figure can all satisfy presence. If your decision depends on the value being the right value, call /verify instead. $0.002 per check.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","description":"source page the value came from (public http/https)"},"claim":{"type":"object","description":"the value(s) to check for presence, as {field: value}"},"asked":{"type":"string","description":"context only in this mode; presence does not judge whether the value answers it"}},"required":["url","claim","asked"]}}}},"responses":{"200":{"description":"Signed verdict: present|fail|unverifiable, check_type web_field_presence_v1. Presence never returns pass."},"400":{"description":"Input does not match the contract"},"402":{"description":"Payment Required"}},"x-payment-info":{"protocols":[{"x402":{}}],"price":{"mode":"fixed","currency":"USD","amount":0.002}}}},"/pubkey":{"get":{"operationId":"getPubkey","security":[],"summary":"Public signing key archive (free)","description":"Free. Returns the ed25519 key archive: the active signing key plus every retired key, each with id, status, and validity dates, so verdicts signed before a key rotation still verify. The scalar public_key field is always the active key. If a verdict verifies against a retired key, confirm it against GET /verdicts/{verdict_id} — a retired-key signature proves signing, not issuance. Verify offline; you do not have to trust this service at runtime to rely on its output.","responses":{"200":{"description":"{ algorithm, public_key, keys: [{id, public_key, status, valid_from, retired_at?, reason?}], rotation_note_url }"}}}},"/verdicts/{verdict_id}":{"get":{"operationId":"getIssuanceRecord","security":[],"summary":"Issuance record for a verdict_id (free)","description":"Free. Confirms whether ScrapeCheck issued this verdict_id and, where available, returns signature_sha256 — the SHA-256 of the signature issued under it. ed25519 signing is deterministic, so hashing the signature on your copy and comparing binds your verdict content to the issuer record; a mismatch means forged content under a real id. Matters most for verdicts signed by a retired key, where the signature alone proves signing but not issuance. Returns no verdict content and no client data. Issuance records are permanent: a logged verdict is never deleted.","responses":{"200":{"description":"{ issued: true, signature_sha256, content_binding: available|available_backfilled|unavailable_legacy, binding_provenance?, note }"},"404":{"description":"{ issued: false, content_binding: not_issued } — no record of this verdict_id; treat a signed verdict carrying it as forged"}}}},"/stats":{"get":{"operationId":"getStats","security":[],"summary":"Live verdict mix, misses included (free)","description":"Free. Live aggregates from the durable log: totals and the full verdict mix including fails and unverifiables, split by channel and check type, with the benchmark summary and its sample-size labels. Aggregates only; no per-customer data. A verifier that only shows its passes isn't showing anything.","responses":{"200":{"description":"Aggregate stats JSON"}}}}}}