Witness: agreed terms, delivery checks, signed receipts, dispute bundles and evidence packs.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Use this when finishing a Buyer Assurance check. Pass the `terms_id` from assurance_prepare and mode PUBLIC_REPLAY (GAIP replays the service) or BUYER_SUBMITTED. Returns PASS / FAIL / UNKNOWN per check and a delivery receipt. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
PUBLIC_REPLAY: GAIP fetches the public URL itself. BUYER_SUBMITTED: check a response you pass in.
The terms_id returned when the terms were registered.
BUYER_SUBMITTED: the response body you received (max 32 KiB).
BUYER_SUBMITTED: SHA-256 of the body, instead of the body.
BUYER_SUBMITTED: the HTTP status you received.
BUYER_SUBMITTED: the Content-Type you received.
PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Use this when finishing a Buyer Assurance check. Pass the `terms_id` from assurance_prepare and mode PUBLIC_REPLAY (GAIP replays the service) or BUYER_SUBMITTED. Returns PASS / FAIL / UNKNOWN per check and a delivery receipt. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| body | string | BUYER_SUBMITTED: the response body you received (max 32 KiB). |
| mode* | any | PUBLIC_REPLAY: GAIP fetches the public URL itself. BUYER_SUBMITTED: check a response you pass in. |
| terms_id* | string | The terms_id returned when the terms were registered. |
| body_sha256 | string | BUYER_SUBMITTED: SHA-256 of the body, instead of the body. |
| http_status | integer | BUYER_SUBMITTED: the HTTP status you received. |
| content_type | string | BUYER_SUBMITTED: the Content-Type you received. |
| data_classification | string | PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data. |
{
"type": "object",
"examples": [
{
"mode": "PUBLIC_REPLAY",
"terms_id": "<terms_id from assurance_prepare>"
}
],
"required": [
"terms_id",
"mode"
],
"properties": {
"body": {
"type": "string",
"description": "BUYER_SUBMITTED: the response body you received (max 32 KiB)."
},
"mode": {
"enum": [
"BUYER_SUBMITTED",
"PUBLIC_REPLAY"
],
"description": "PUBLIC_REPLAY: GAIP fetches the public URL itself. BUYER_SUBMITTED: check a response you pass in."
},
"terms_id": {
"type": "string",
"description": "The terms_id returned when the terms were registered."
},
"body_sha256": {
"type": "string",
"description": "BUYER_SUBMITTED: SHA-256 of the body, instead of the body."
},
"http_status": {
"type": "integer",
"description": "BUYER_SUBMITTED: the HTTP status you received."
},
"content_type": {
"type": "string",
"description": "BUYER_SUBMITTED: the Content-Type you received."
},
"data_classification": {
"enum": [
"PUBLIC",
"NON_PERSONAL_PUBLIC"
],
"type": "string",
"default": "PUBLIC",
"description": "PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data."
}
}
}Use this when you, the buyer, chose a public service and want its delivery checked end to end. Pass `service_url`, `checks` and explicit_read_only_consent=true. GAIP preflights it and records your checks; returns a `terms_id` for assurance_complete. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| checks* | array | 1-8 checks, each {"id": "http_status_in", "allowed": [200]}, {"id": "content_type_is", "value": "application/json"}, {"id": "non_empty"}, {"id": "json_parses"}, {"id": "json_required_keys", "keys": ["a.b"]}, {"id": "json_path_equals", "path": "a.b", "value": 1}, {"id": "max_latency_ms", "limit": 2000}, {"id": "max_bytes", "limit": 20000}, {"id": "text_contains", "value": "ok"} or {"id": "regex", "pattern": "ok|up"}. |
| episode_id | string | Optional: your own id to group related calls. |
| task_class | string | Optional: short name of the task, e.g. weather_forecast. |
| service_url* | string | Public https URL of the service. |
| counterparty_id | string | Name or URL of the agent or service. |
| data_classification | string | PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data. |
| explicit_read_only_consent |
Use this when you hold a Buyer Assurance terms or delivery receipt_id and want to confirm it. Returns the retained record and its integrity proof (integrity only). Free, read-only, no account; inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| receipt_id* | string | A receipt_id returned by an earlier GAIP call. |
{
"type": "object",
"examples": [
{
"receipt_id": "<receipt_id from assurance_prepare or assurance_complete>"
}
],
"required": [
"receipt_id"
],
"properties": {
"receipt_id": {
"type": "string",
"description": "A receipt_id returned by an earlier GAIP call."
}
}
}Use this when handed an x402 SAR-shaped receipt (draft proposal shape; may change). Pass `sar_receipt`, optionally the issuer's `public_key`. Returns missing fields, whether receipt_id matches the core and whether the signature checks out against that key. Free, read-only, no account; inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| public_key | any | Optional: the issuer's Ed25519 public key, raw 32 bytes base64url or a JWK {kty: OKP, crv: Ed25519, x}. Omit to use GAIP's published keys. |
| sar_receipt* | object | The SAR receipt object (or a whole gaip_receipt_export x402 result). |
{
"type": "object",
"examples": [
{
"public_key": "Y8BpzlWPH3EPRQziEPRBeLS1lJBF4xEo9WaxTNbzNp0",
"sar_receipt": {
"ts": "2026-10-01T09:00:00Z",
"sig": "ogilW-bjlCbYkwwUAIrg_zm_Wuoc6EiRgeErs0RL7llP7FWyX43-LgozZFyCjCXgsViK-A4_aroOo16Q4uvTCg",
"sig_alg": "Ed25519",
"verdict": "PASS",
"confidence": 1,
"receipt_id": "sha256:17146cdeb5aba1c269130348cdc7d3d96ae55f6e048b81d3baa59d4e3f3b188b",
"reason_code": "SPEC_MATCH",
"task_id_hash": "sha256:c8b36982316351a28e040a6520df2092c2c87a4ea611c123d04993074b2b6f1d",
"verifier_kid": "ef654fc8b615b51c",
"receipt_version": "0.1"
}
}
],
"required": [
"sar_receipt"
],
"properties": {
"public_key": {
"oneOf": [
{
"type": "string",
"maxLength": 512
},
{
"type": "object"
}
],
"description": "Optional: the issuer's Ed25519 public key, raw 32 bytes base64url or a JWK {kty: OKP, crv: Ed25519, x}. Omit to use GAIP's published keys."
},
"sar_receipt": {
"type": "object",
"description": "The SAR receipt object (or a whole gaip_receipt_export x402 result)."
}
},
"additionalProperties": false
}Use this when asked to verify citations or quotes ("do these sources really say this?"). Pass `citations` (1-20 {url, quote}). GAIP fetches each page once (robots.txt respected); returns QUOTE_FOUND / QUOTE_NOT_FOUND_IN_FETCHED_VERSION / SOURCE_UNREACHABLE..., an excerpt and a receipt. Free, read-only, no account; inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| citations* | array | 1-20 citations, each {url, quote?, claimed_title?, claimed_date?}. |
| data_classification | string | PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data. |
{
"type": "object",
"examples": [
{
"citations": [
{
"url": "https://www.gaipagents.com/",
"quote": "GAIP",
"claimed_title": "GAIP"
}
]
}
],
"required": [
"citations"
],
"properties": {
"citations": {
"type": "array",
"items": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"format": "uri",
"maxLength": 2048
},
"quote": {
"type": "string",
"maxLength": 2000
},
"claimed_date": {
"type": "string",
"maxLength": 64
},
"claimed_title": {
"type": "string",
"maxLength": 500
}
},
"additionalProperties": false
},
"maxItems": 20,
"minItems": 1,
"description": "1-20 citations, each {url, quote?, claimed_title?, claimed_date?}."
},
"data_classification": {
"enum": [
"PUBLIC",
"NON_PERSONAL_PUBLIC"
],
"type": "string",
"default": "PUBLIC",
"description": "PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data."
}
},
"additionalProperties": true
}Use this when an insurer, auditor or buyer asks what evidence exists about an agent or supplier. Pass its `subject` (public id or https URL). Returns conformance, watch, witness, repair and incident records with Merkle proofs, plus gaps. A compilation, not certification or advice. Free, read-only, no account; inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| scope | object | Optional: {receipt_ids, since, until, categories, max_items}. |
| subject* | any | The agent or supplier: its public id or https URL. Never a person. |
| requester | object | Optional: {purpose, continuity_handle} to include your own receipts. |
{
"type": "object",
"examples": [
{
"scope": {
"since": "2026-09-01",
"max_items": 50
},
"subject": {
"counterparty_id": "example-weather-agent"
},
"requester": {
"purpose": "INSURER"
}
}
],
"required": [
"subject"
],
"properties": {
"scope": {
"type": "object",
"properties": {
"since": {
"type": "string"
},
"until": {
"type": "string"
},
"max_items": {
"type": "integer",
"maximum": 200,
"minimum": 1
},
"categories": {
"type": "array",
"items": {
"enum": [
"conformance",
"watch",
"witness",
"repair",
"incident",
"supplier_checks"
],
"type": "string"
}
},
"receipt_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50
}
},
"description": "Optional: {receipt_ids, since, until, categories, max_items}.",
"additionalProperties": false
},
"subject": {
"oneOf": [
{
"type": "string",
"maxLength": 256
},
{
"type": "object",
"properties": {
"ref": {
"type": "string"
},
"url": {
"type": "string",
"format": "uri"
},
"seller_ref": {
"type": "string"
},
"counterparty_id": {
"type": "string"
}
},
"additionalProperties": false
}
],
"description": "The agent or supplier: its public id or https URL. Never a person."
},
"requester": {
"type": "object",
"properties": {
"purpose": {
"enum": [
"INSURER",
"AUDITOR",
"OPERATOR",
"BUYER",
"UNSPECIFIED"
],
"type": "string"
},
"continuity_handle": {
"type": "object",
"required": [
"continuity_id",
"token"
],
"properties": {
"token": {
"type": "string"
},
"continuity_id": {
"type": "string"
}
}
}
},
"description": "Optional: {purpose, continuity_handle} to include your own receipts.",
"additionalProperties": false
}
},
"additionalProperties": false
}Use this when something went wrong with an agent and you need the facts in order. Pass the `receipt_ids` you hold and attributed `observations`. Returns a verified, source-attributed timeline with an EU AI Act Art. 73 reference aid. No fault, cause or liability finding. Free, read-only, no account; inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| title | string | Optional: short incident title. |
| receipt_ids | array | GAIP receipt ids you hold about the incident. |
| observations | array | Attributed observations, each {source, statement, observed_at_utc}. |
| ai_system_ref | string | Optional: public id or URL of the AI system involved; given alone, GAIP starts the timeline from its own public records of that system. |
| data_classification | string | PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data. |
{
"type": "object",
"examples": [
{
"title": "Forecast endpoint returned errors",
"receipt_ids": [
"<receipt_id returned by any GAIP tool>"
],
"observations": [
{
"source": "our uptime monitor",
"statement": "HTTP 503 from the forecast endpoint for 12 minutes",
"source_type": "AUTOMATED_MONITOR",
"observed_at_utc": "2026-09-27T10:00:00Z"
}
],
"ai_system_ref": "example-weather-agent"
}
],
"properties": {
"title": {
"type": "string",
"maxLength": 120,
"description": "Optional: short incident title."
},
"receipt_ids": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"description": "GAIP receipt ids you hold about the incident."
},
"observations": {
"type": "array",
"items": {
"type": "object",
"required": [
"source",
"statement"
],
"properties": {
"source": {
"type": "string",
"maxLength": 120
},
"statement": {
"type": "string",
"maxLength": 2000
},
"receipt_id": {
"type": "string"
},
"source_type": {
"enum": [
"AUTOMATED_MONITOR",
"PUBLIC_RECORD",
"REQUESTER",
"THIRD_PARTY"
],
"type": "string"
},
"observed_at_utc": {
"type": "string"
}
},
"additionalProperties": false
},
"maxItems": 50,
"description": "Attributed observations, each {source, statement, observed_at_utc}."
},
"ai_system_ref": {
"type": "string",
"maxLength": 256,
"description": "Optional: public id or URL of the AI system involved; given alone, GAIP starts the timeline from its own public records of that system."
},
"data_classification": {
"enum": [
"PUBLIC",
"NON_PERSONAL_PUBLIC"
],
"type": "string",
"default": "PUBLIC",
"description": "PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data."
}
},
"additionalProperties": false
}Use this when asked whether an outcome-priced task delivered and what it cost. Pass `episode_id`, `task` (acceptance_criteria), `delivery`, `costs`; `delivery_check` {url, checks} has GAIP test delivery now. Returns a dossier, running totals and a receipt. No ROI claim. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| task* | object | The task: {acceptance_criteria}. |
| costs* | object | Caller-stated costs in GBP: agent_gbp, compute_gbp, human_review_gbp, repair_gbp. |
| currency | string | Optional: ISO 4217 code of the cost amounts (default GBP). |
| delivery* | object | What was delivered: {status, receipt_id?}. |
| fx_to_gbp | object | Optional: {rate, as_of, source} - your GBP rate; GBP equivalents are then reported, labelled with it. GAIP never uses built-in rates. |
| synthetic | boolean | Optional: true marks a test call. |
| episode_id* | string | Optional: your own id to group related calls. |
| task_class |
Use this when you need a GAIP receipt in another format. Pass `receipt_id` and `format`: x402 (attestation style), erc8004 (validation-response shape) or vc (W3C-VC-like JSON-LD). Ed25519-signed when the runtime key is available; hash chain and Merkle proof; no on-chain write. Free, read-only, no account; inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| format* | string | x402, erc8004 or vc. |
| receipt_id* | string | The receipt_id exactly as an earlier GAIP result returned it. Have none? Call with any id: the refusal lists example_receipt_ids from GAIP's own public records. |
{
"type": "object",
"examples": [
{
"format": "x402",
"receipt_id": "<receipt_id returned by any GAIP tool>"
}
],
"required": [
"receipt_id",
"format"
],
"properties": {
"format": {
"enum": [
"x402",
"erc8004",
"vc"
],
"type": "string",
"description": "x402, erc8004 or vc."
},
"receipt_id": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "The receipt_id exactly as an earlier GAIP result returned it. Have none? Call with any id: the refusal lists example_receipt_ids from GAIP's own public records."
}
},
"additionalProperties": false
}Use this when you need proof of what an agent or shop page declared on a date. Pass its `url` (optional `since`, `until`). Returns an extract of GAIP's record as kept: entries with chain positions, hashes, daily anchors and a signature. Free preview. Free, read-only, no account; inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| url* | string | The A2A agent card, MCP endpoint or shop product page URL, exactly as recorded. |
| limit | integer | Optional: most entries to return, newest kept (default 50). |
| since | string | Optional: start of the range (YYYY-MM-DD or RFC 3339). |
| until | string | Optional: end of the range (YYYY-MM-DD, inclusive, or RFC 3339). |
{
"type": "object",
"examples": [
{
"url": "https://huggingface.co/mcp",
"since": "2026-09-01"
}
],
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "The A2A agent card, MCP endpoint or shop product page URL, exactly as recorded."
},
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Optional: most entries to return, newest kept (default 50)."
},
"since": {
"type": "string",
"maxLength": 40,
"description": "Optional: start of the range (YYYY-MM-DD or RFC 3339)."
},
"until": {
"type": "string",
"maxLength": 40,
"description": "Optional: end of the range (YYYY-MM-DD, inclusive, or RFC 3339)."
}
},
"additionalProperties": false
}Use this to check what an agent, API or supplier claims. Pass `claims` (each with an `id`; add `check_url` and GAIP tests it now), your `observations` and `metadata`. Returns per claim what GAIP saw, what you reported and whether they agree. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| claims* | array | Claims to check, each {id, text}. |
| metadata* | object | The published agent card, MCP server description or OpenAPI document (as JSON). |
| protocol | string | Counterparty protocol. Inferred from metadata when omitted, otherwise MCP. |
| synthetic | boolean | Optional: true marks a test call. |
| episode_id | string | Optional: your own id to group related calls. |
| task_class | string | Optional: short name of the task, e.g. weather_forecast. |
| observations | array | Optional: what you saw, each {claim_id, result: PASS|FAIL, detail}. |
| counterparty_id | string | Name or URL of the agent/service. Optional. |
Use this when asked what changed on a watched agent or service. Pass your `continuity_handle` and optionally a `watch_id`. Returns recent change events: verdict before and after, a change summary, the receipt and webhook delivery status. Free, read-only, no account; inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Optional: maximum events to return. |
| watch_id | string | The watch_id returned by gaip_watch_register. |
| continuity_handle* | object | The continuity_handle from an earlier GAIP result; proves you own these watches. |
{
"type": "object",
"examples": [
{
"limit": 10,
"watch_id": "<watch_id from gaip_watch_register>",
"continuity_handle": {
"token": "<continuity_handle.token returned by any GAIP tool>",
"continuity_id": "<continuity_handle.continuity_id returned by any GAIP tool>"
}
}
],
"required": [
"continuity_handle"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Optional: maximum events to return."
},
"watch_id": {
"type": "string",
"description": "The watch_id returned by gaip_watch_register."
},
"continuity_handle": {
"type": "object",
"required": [
"continuity_id",
"token"
],
"properties": {
"token": {
"type": "string"
},
"continuity_id": {
"type": "string"
}
},
"description": "The continuity_handle from an earlier GAIP result; proves you own these watches."
}
},
"additionalProperties": false
}Use this when asked which agents or services you are watching. Pass your `continuity_handle`. Returns each watch's kind, target, last verdict, last and next check and webhook endpoint (never the secret). Free, read-only, no account; inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| continuity_handle* | object | The continuity_handle from an earlier GAIP result; proves you own these watches. |
{
"type": "object",
"examples": [
{
"continuity_handle": {
"token": "<continuity_handle.token returned by any GAIP tool>",
"continuity_id": "<continuity_handle.continuity_id returned by any GAIP tool>"
}
}
],
"required": [
"continuity_handle"
],
"properties": {
"continuity_handle": {
"type": "object",
"required": [
"continuity_id",
"token"
],
"properties": {
"token": {
"type": "string"
},
"continuity_id": {
"type": "string"
}
},
"description": "The continuity_handle from an earlier GAIP result; proves you own these watches."
}
},
"additionalProperties": false
}Use this when asked to keep an eye on an agent or MCP server ("tell me if it changes or goes down"). Pass the `continuity_handle` from any GAIP result, `kind` and `target_url`. GAIP re-checks every 24 hours (3 free watches), receipts each change and can call your webhook. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| sla | object | DELIVERY_SLA only: service-level terms checked on every observation, any of min_uptime_pct, max_latency_ms, required_fields (JSON key paths), freshness_field + max_age_seconds; optional uptime_window_hours, min_observations. Results go only to you. |
| kind* | string | AGENT_READINESS (agent URL), SUPPLIER_CARD (published card), DELIVERY_TERMS (terms_id) or DELIVERY_SLA (terms_id plus sla terms). |
| terms_id | string | DELIVERY_TERMS or DELIVERY_SLA: terms_id from witness_register_terms. |
| target_url | string | Public https URL (AGENT_READINESS, SUPPLIER_CARD). No query string. |
| webhook_url | string | Optional: your own public https endpoint for signed change events. |
| interval_hours | integer | Hours between checks: 24 minimum on the free tier; 1 for DELIVERY_SLA. |
| continuity_handle* | object |
Use this when asked to stop watching an agent or service. Pass your `continuity_handle` and the `watch_id`. Its stored events are deleted; retained receipts stay verifiable. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| watch_id* | string | The watch_id returned by gaip_watch_register. |
| continuity_handle* | object | The continuity_handle from an earlier GAIP result; proves you own these watches. |
{
"type": "object",
"examples": [
{
"watch_id": "<watch_id from gaip_watch_register>",
"continuity_handle": {
"token": "<continuity_handle.token returned by any GAIP tool>",
"continuity_id": "<continuity_handle.continuity_id returned by any GAIP tool>"
}
}
],
"required": [
"continuity_handle",
"watch_id"
],
"properties": {
"watch_id": {
"type": "string",
"description": "The watch_id returned by gaip_watch_register."
},
"continuity_handle": {
"type": "object",
"required": [
"continuity_id",
"token"
],
"properties": {
"token": {
"type": "string"
},
"continuity_id": {
"type": "string"
}
},
"description": "The continuity_handle from an earlier GAIP result; proves you own these watches."
}
},
"additionalProperties": false
}Use this when asked what evidence exists about an agent before delegating to it. Pass its `counterparty_id` and any `observations`. Returns task-specific evidence coverage, conflicts, gaps and GAIP's own earlier checks of it, with a receipt. Never a trust score or recommendation. Free, read-only, no account; inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| synthetic | boolean | Optional: true marks a test call. |
| episode_id | string | Optional: your own id to group related calls. |
| task_class | string | Task you want evidence for. Optional. |
| max_age_days | integer | Optional freshness window (default 30): GAIP history records older than this are STALE and do not count toward evidence_sufficiency. |
| observations | array | Optional: observations about it, each {source, observed_at, evidence_digest, lifecycle_state, claim}. |
| counterparty_id | string | Name or URL of the agent or service. |
| continuity_handle | object | Optional: the continuity_handle from an earlier GAIP result; links this call to your earlier ones. |
Use this when you hold a GAIP receipt_id and want to confirm it ("is this receipt genuine?"). Returns the retained record, hash chain and Merkle inclusion proof. Integrity only: it does not make the underlying claim true. Free, read-only, no account; inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| synthetic | boolean | Optional: true marks a test call. |
| episode_id | string | Optional: your own id to group related calls. |
| receipt_id* | string | A receipt_id returned by an earlier GAIP call. |
| continuity_handle | object | Optional: the continuity_handle from an earlier GAIP result; links this call to your earlier ones. |
| data_classification | string | PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data. |
| independent_operator_id | string | Optional: your operator id (recorded as a claim, not verified). |
{
"type": "object",
"examples": [
{
"receipt_id": "<receipt_id returned by any GAIP tool>"
}
],
"required": [
"receipt_id"
],
"properties": {
"synthetic": {
"type": "boolean",
"description": "Optional: true marks a test call."
},
"episode_id": {
"type": "string",
"description": "Optional: your own id to group related calls."
},
"receipt_id": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "A receipt_id returned by an earlier GAIP call."
},
"continuity_handle": {
"type": "object",
"required": [
"continuity_id",
"token"
],
"properties": {
"token": {
"type": "string"
},
"continuity_id": {
"type": "string"
}
},
"description": "Optional: the continuity_handle from an earlier GAIP result; links this call to your earlier ones.",
"additionalProperties": false
},
"data_classification": {
"enum": [
"PUBLIC",
"NON_PERSONAL_PUBLIC"
],
"type": "string",
"description": "PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data."
},
"independent_operator_id": {
"type": "string",
"description": "Optional: your operator id (recorded as a claim, not verified)."
}
},
"additionalProperties": true
}Use this when you are the other party to terms a buyer registered. Pass the `terms_id`, your own `continuity_handle` and `business_purpose_statement` true (businesses only); the buyer confirms it with the `agreement_id`. Returns an `agreement_id` naming both parties. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| terms_id* | string | wt_... from witness_register_terms. |
| agreement_id | string | Only on an existing agreement: the buyer confirms business purpose or expert determination, or either party declares a consumer contract. |
| finding_mode | string | EVIDENCE_ONLY, or EXPERT_DETERMINATION (needs the buyer's confirmation). |
| acceptance_rule | object | What counts as delivered, by when, and who may ask for the finding. |
| seller_key_proof | object | Optional: {jwk, jws over the terms_id, host}; GAIP checks the signature and whether the host published that key. |
| consumer_contract | boolean | true if either party is a consumer: evidence summary only, no finding. |
| continuity_handle | object | Required: your own continuity handle (continuity_id, token). |
Use this when asked whether a service delivered what was agreed ("did the supplier deliver?"). Pass the `terms_id` from witness_register_terms and mode PUBLIC_REPLAY (GAIP fetches it) or BUYER_SUBMITTED. Returns PASS / FAIL / UNKNOWN per check, what changed since last time, and a receipt. Free, read-only, no account; inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| body | string | BUYER_SUBMITTED: the response body you received (max 32 KiB). |
| mode* | string | PUBLIC_REPLAY: GAIP fetches the public URL itself. BUYER_SUBMITTED: check a response you pass in. |
| terms_id* | string | The terms_id returned when the terms were registered. |
| synthetic | boolean | Optional: true marks a test call. |
| episode_id | string | Optional: your own id to group related calls. |
| body_sha256 | string | BUYER_SUBMITTED: SHA-256 of the body, instead of the body. |
| http_status | integer | BUYER_SUBMITTED: the HTTP status you received. |
| content_type |
Use this when a witnessed delivery failed and you must hand the facts to the other party or a resolver. Pass `terms_id` or a delivery `receipt_id`. Returns one hash-stamped bundle: terms, every check, receipts, timeline, summary. No judgement of who is right. Free, read-only, no account; inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| terms_id | string | Or the terms_id (wt_...) of the agreement. |
| receipt_id | string | A delivery receipt_id from witness_delivery. |
| receipt_format | string | gaip (default) or x402_sar: also give each delivery in the x402 SAR draft shape. |
| continuity_handle | object | Optional: the continuity_handle that registered a DELIVERY_SLA watch on these terms; adds your SLA breaches. |
{
"type": "object",
"examples": [
{
"receipt_id": "<receipt_id from witness_delivery>"
}
],
"properties": {
"terms_id": {
"type": "string",
"description": "Or the terms_id (wt_...) of the agreement."
},
"receipt_id": {
"type": "string",
"description": "A delivery receipt_id from witness_delivery."
},
"receipt_format": {
"enum": [
"gaip",
"x402_sar"
],
"type": "string",
"default": "gaip",
"description": "gaip (default) or x402_sar: also give each delivery in the x402 SAR draft shape."
},
"continuity_handle": {
"type": "object",
"description": "Optional: the continuity_handle that registered a DELIVERY_SLA watch on these terms; adds your SLA breaches."
}
}
}Use this when deliveries exist for an agreement and you want GAIP's signed finding. Pass the `agreement_id` and your `continuity_handle`. Returns MET, NOT_MET or INDETERMINATE on the agreed rule with the records relied on. Evidence only; no sum of money. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| agreement_id* | string | wa_... from witness_accept_terms. |
| continuity_handle | object | Required: a party's own continuity handle. |
| data_classification | string | PUBLIC or NON_PERSONAL_PUBLIC. |
{
"type": "object",
"examples": [
{
"agreement_id": "<agreement_id from witness_accept_terms>",
"continuity_handle": {
"token": "<continuity_handle.token returned by any GAIP tool>",
"continuity_id": "<continuity_handle.continuity_id returned by any GAIP tool>"
}
}
],
"required": [
"agreement_id"
],
"properties": {
"agreement_id": {
"type": "string",
"description": "wa_... from witness_accept_terms."
},
"continuity_handle": {
"type": "object",
"description": "Required: a party's own continuity handle."
},
"data_classification": {
"enum": [
"PUBLIC",
"NON_PERSONAL_PUBLIC"
],
"type": "string",
"description": "PUBLIC or NON_PERSONAL_PUBLIC."
}
},
"additionalProperties": false
}Use this when about to depend on a public HTTPS service and you want neutral evidence of what it delivers. Pass `service_url`; `checks` default to HTTP 200 and a non-empty body (also JSON keys, latency, size, regex). Returns a `terms_id`; then call witness_delivery. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| checks | array | 1-8 checks, each {"id": "http_status_in", "allowed": [200]}, {"id": "content_type_is", "value": "application/json"}, {"id": "non_empty"}, {"id": "json_parses"}, {"id": "json_required_keys", "keys": ["a.b"]}, {"id": "json_path_equals", "path": "a.b", "value": 1}, {"id": "max_latency_ms", "limit": 2000}, {"id": "max_bytes", "limit": 20000}, {"id": "text_contains", "value": "ok"} or {"id": "regex", "pattern": "ok|up"}. |
| seller_ref | string | Optional: name of the supplier. Defaults to the host of service_url. |
| service_url* | string | Public https URL of the service. |
| research_consent | boolean | Optional, default false. true lets this record be counted, never named, in GAIP's monthly aggregate research figures (for example for insurers). |
| data_classification | string | PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data. |
{
"type": "object",
"examples": [
{
"checks": [
{
"id": "http_status_in",
"allowed": [
200
]
},
{
"id": "json_parses"
}
],
"seller_ref": "example-weather-agent",
"service_url": "https://weather.example.com/forecast.json"
}
],
"required": [
"service_url"
],
"properties": {
"checks": {
"type": "array",
"maxItems": 8,
"minItems": 1,
"description": "1-8 checks, each {\"id\": \"http_status_in\", \"allowed\": [200]}, {\"id\": \"content_type_is\", \"value\": \"application/json\"}, {\"id\": \"non_empty\"}, {\"id\": \"json_parses\"}, {\"id\": \"json_required_keys\", \"keys\": [\"a.b\"]}, {\"id\": \"json_path_equals\", \"path\": \"a.b\", \"value\": 1}, {\"id\": \"max_latency_ms\", \"limit\": 2000}, {\"id\": \"max_bytes\", \"limit\": 20000}, {\"id\": \"text_contains\", \"value\": \"ok\"} or {\"id\": \"regex\", \"pattern\": \"ok|up\"}."
},
"seller_ref": {
"type": "string",
"description": "Optional: name of the supplier. Defaults to the host of service_url."
},
"service_url": {
"type": "string",
"description": "Public https URL of the service."
},
"research_consent": {
"type": "boolean",
"default": false,
"description": "Optional, default false. true lets this record be counted, never named, in GAIP's monthly aggregate research figures (for example for insurers)."
},
"data_classification": {
"enum": [
"PUBLIC",
"NON_PERSONAL_PUBLIC"
],
"type": "string",
"default": "PUBLIC",
"description": "PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data."
}
}
}Use this when a role (APPROVER, REVIEWER, OWNER, OPERATOR or a hashed role_id) decided on an agent's proposal. Pass `proposal_sha256`, `decision` (APPROVED, REFUSED, CHANGED), optionally `agreement_id`. Returns a chained, signed entry of the role's decision, never GAIP's. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
| Argument | Type | Description |
|---|---|---|
| role | string | The role that decided: APPROVER, REVIEWER, OWNER or OPERATOR. Any other text is refused (ROLE_VOCABULARY); use role_id for your own id. |
| role_id | string | Optional: your own opaque role identifier (one token, no spaces). GAIP keeps it only as a keyed hash, never in clear. |
| decision* | string | The decision as recorded: APPROVED, REFUSED or CHANGED. |
| agent_url | string | Optional: public https URL of the agent whose proposal was decided (the system identifier). |
| agreement_id | string | Optional: the wa_... Deals agreement from witness_accept_terms this decision concerns; the finding then lists it. |
| reason_sha256 | string | Optional: SHA-256 (64 hex) of the reason you keep; anything but a hash is refused. |
| proposal_sha256* | string | SHA-256 (64 hex) of what the agent proposed, computed by you; the proposal itself is never sent. |
| any |
| Must be true: you consent to a public, read-only check. |
{
"type": "object",
"examples": [
{
"checks": [
{
"id": "http_status_in",
"allowed": [
200
]
},
{
"id": "json_parses"
}
],
"task_class": "weather_forecast",
"service_url": "https://weather.example.com/forecast.json",
"counterparty_id": "example-weather-agent",
"explicit_read_only_consent": true
}
],
"required": [
"service_url",
"checks",
"explicit_read_only_consent"
],
"properties": {
"checks": {
"type": "array",
"maxItems": 8,
"minItems": 1,
"description": "1-8 checks, each {\"id\": \"http_status_in\", \"allowed\": [200]}, {\"id\": \"content_type_is\", \"value\": \"application/json\"}, {\"id\": \"non_empty\"}, {\"id\": \"json_parses\"}, {\"id\": \"json_required_keys\", \"keys\": [\"a.b\"]}, {\"id\": \"json_path_equals\", \"path\": \"a.b\", \"value\": 1}, {\"id\": \"max_latency_ms\", \"limit\": 2000}, {\"id\": \"max_bytes\", \"limit\": 20000}, {\"id\": \"text_contains\", \"value\": \"ok\"} or {\"id\": \"regex\", \"pattern\": \"ok|up\"}."
},
"episode_id": {
"type": "string",
"description": "Optional: your own id to group related calls."
},
"task_class": {
"type": "string",
"description": "Optional: short name of the task, e.g. weather_forecast."
},
"service_url": {
"type": "string",
"description": "Public https URL of the service."
},
"counterparty_id": {
"type": "string",
"description": "Name or URL of the agent or service."
},
"data_classification": {
"enum": [
"PUBLIC",
"NON_PERSONAL_PUBLIC"
],
"type": "string",
"default": "PUBLIC",
"description": "PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data."
},
"explicit_read_only_consent": {
"const": true,
"description": "Must be true: you consent to a public, read-only check."
}
}
}| string |
| Optional: short name of the task, e.g. weather_forecast. |
| evidence_refs | array | Optional: references to your own evidence (ids or URLs). |
| delivery_check | object | Optional: {url, checks} - GAIP tests the delivery at this public https URL now with Witness checks; its verdict sets delivery.status. |
| downstream_use | object | Optional: {status: USED|NOT_USED, evidence_ref}. |
| counterparty_id | string | Name or URL of the agent or service. |
| baseline_cost_gbp | any | Optional: what the task cost before, in GBP. |
| continuity_handle | object | Optional: the continuity_handle from an earlier GAIP result; adds running totals over your own earlier tasks. |
| data_classification | string | PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data. |
| independent_operator_id | string | Optional: your operator id (recorded as a claim, not verified). |
{
"type": "object",
"examples": [
{
"task": {
"acceptance_criteria": "Forecast JSON for London returned within 5 seconds"
},
"costs": {
"agent_gbp": "0.40",
"repair_gbp": "0",
"compute_gbp": "0.12",
"human_review_gbp": "3.50"
},
"units": 7,
"delivery": {
"status": "ACCEPTED",
"receipt_id": "example-receipt-1"
},
"episode_id": "example-episode-1",
"task_class": "weather_forecast",
"unit_label": "forecast",
"downstream_use": {
"status": "USED",
"evidence_ref": "example-ticket-4411"
},
"counterparty_id": "example-weather-agent",
"observed_at_utc": "2026-09-27T21:00:00Z",
"baseline_cost_gbp": "12.00"
}
],
"required": [
"episode_id",
"task",
"delivery",
"costs"
],
"properties": {
"task": {
"type": "object",
"required": [
"acceptance_criteria"
],
"description": "The task: {acceptance_criteria}."
},
"costs": {
"type": "object",
"description": "Caller-stated costs in GBP: agent_gbp, compute_gbp, human_review_gbp, repair_gbp."
},
"currency": {
"type": "string",
"default": "GBP",
"description": "Optional: ISO 4217 code of the cost amounts (default GBP)."
},
"delivery": {
"type": "object",
"required": [
"status"
],
"description": "What was delivered: {status, receipt_id?}."
},
"fx_to_gbp": {
"type": "object",
"required": [
"rate",
"as_of",
"source"
],
"properties": {
"rate": {
"type": "number"
},
"as_of": {
"type": "string"
},
"source": {
"type": "string"
}
},
"description": "Optional: {rate, as_of, source} - your GBP rate; GBP equivalents are then reported, labelled with it. GAIP never uses built-in rates."
},
"synthetic": {
"type": "boolean",
"description": "Optional: true marks a test call."
},
"episode_id": {
"type": "string",
"description": "Optional: your own id to group related calls."
},
"task_class": {
"type": "string",
"description": "Optional: short name of the task, e.g. weather_forecast."
},
"evidence_refs": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 20,
"description": "Optional: references to your own evidence (ids or URLs)."
},
"delivery_check": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string"
},
"checks": {
"type": "array",
"items": {
"type": "object"
},
"maxItems": 8,
"minItems": 1
}
},
"description": "Optional: {url, checks} - GAIP tests the delivery at this public https URL now with Witness checks; its verdict sets delivery.status."
},
"downstream_use": {
"type": "object",
"description": "Optional: {status: USED|NOT_USED, evidence_ref}."
},
"counterparty_id": {
"type": "string",
"description": "Name or URL of the agent or service."
},
"baseline_cost_gbp": {
"oneOf": [
{
"type": "number"
},
{
"type": "string"
}
],
"description": "Optional: what the task cost before, in GBP."
},
"continuity_handle": {
"type": "object",
"required": [
"continuity_id",
"token"
],
"properties": {
"token": {
"type": "string"
},
"continuity_id": {
"type": "string"
}
},
"description": "Optional: the continuity_handle from an earlier GAIP result; adds running totals over your own earlier tasks.",
"additionalProperties": false
},
"data_classification": {
"enum": [
"PUBLIC",
"NON_PERSONAL_PUBLIC"
],
"type": "string",
"default": "PUBLIC",
"description": "PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data."
},
"independent_operator_id": {
"type": "string",
"description": "Optional: your operator id (recorded as a claim, not verified)."
}
},
"additionalProperties": true
}| continuity_handle | object | Optional: the continuity_handle from an earlier GAIP result; links this call to your earlier ones. |
| data_classification | string | PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data. |
| independent_operator_id | string | Optional: your operator id (recorded as a claim, not verified). |
{
"type": "object",
"examples": [
{
"claims": [
{
"id": "c1",
"text": "Returns JSON forecasts over MCP"
},
{
"id": "c2",
"text": "Responds within 2 seconds"
}
],
"metadata": {
"url": "https://weather.example.com/mcp",
"protocolVersion": "2025-06-18"
},
"observations": [
{
"detail": "tools/call returned valid JSON",
"result": "PASS",
"claim_id": "c1"
},
{
"detail": "p95 latency 4.8 s over 20 calls",
"result": "FAIL",
"claim_id": "c2"
}
],
"counterparty_id": "example-weather-agent"
}
],
"required": [
"claims",
"metadata"
],
"properties": {
"claims": {
"type": "array",
"items": {
"type": "object"
},
"maxItems": 20,
"minItems": 1,
"description": "Claims to check, each {id, text}."
},
"metadata": {
"type": "object",
"description": "The published agent card, MCP server description or OpenAPI document (as JSON)."
},
"protocol": {
"enum": [
"A2A",
"MCP",
"OPENAPI"
],
"type": "string",
"description": "Counterparty protocol. Inferred from metadata when omitted, otherwise MCP."
},
"synthetic": {
"type": "boolean",
"description": "Optional: true marks a test call."
},
"episode_id": {
"type": "string",
"description": "Optional: your own id to group related calls."
},
"task_class": {
"type": "string",
"default": "supplier_claim_check",
"description": "Optional: short name of the task, e.g. weather_forecast."
},
"observations": {
"type": "array",
"items": {
"type": "object"
},
"maxItems": 30,
"description": "Optional: what you saw, each {claim_id, result: PASS|FAIL, detail}."
},
"counterparty_id": {
"type": "string",
"description": "Name or URL of the agent/service. Optional."
},
"continuity_handle": {
"type": "object",
"required": [
"continuity_id",
"token"
],
"properties": {
"token": {
"type": "string"
},
"continuity_id": {
"type": "string"
}
},
"description": "Optional: the continuity_handle from an earlier GAIP result; links this call to your earlier ones.",
"additionalProperties": false
},
"data_classification": {
"enum": [
"PUBLIC",
"NON_PERSONAL_PUBLIC"
],
"type": "string",
"default": "PUBLIC",
"description": "PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data."
},
"independent_operator_id": {
"type": "string",
"description": "Optional: your operator id (recorded as a claim, not verified)."
}
},
"additionalProperties": true
}| The continuity_handle from an earlier GAIP result; proves you own these watches. |
| data_classification | string | PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data. |
{
"type": "object",
"examples": [
{
"kind": "DELIVERY_TERMS",
"terms_id": "<terms_id from witness_register_terms>",
"interval_hours": 24,
"continuity_handle": {
"token": "<continuity_handle.token returned by any GAIP tool>",
"continuity_id": "<continuity_handle.continuity_id returned by any GAIP tool>"
}
}
],
"required": [
"continuity_handle",
"kind"
],
"properties": {
"sla": {
"type": "object",
"description": "DELIVERY_SLA only: service-level terms checked on every observation, any of min_uptime_pct, max_latency_ms, required_fields (JSON key paths), freshness_field + max_age_seconds; optional uptime_window_hours, min_observations. Results go only to you."
},
"kind": {
"enum": [
"AGENT_READINESS",
"DELIVERY_TERMS",
"SUPPLIER_CARD",
"DELIVERY_SLA"
],
"type": "string",
"description": "AGENT_READINESS (agent URL), SUPPLIER_CARD (published card), DELIVERY_TERMS (terms_id) or DELIVERY_SLA (terms_id plus sla terms)."
},
"terms_id": {
"type": "string",
"description": "DELIVERY_TERMS or DELIVERY_SLA: terms_id from witness_register_terms."
},
"target_url": {
"type": "string",
"format": "uri",
"maxLength": 2048,
"description": "Public https URL (AGENT_READINESS, SUPPLIER_CARD). No query string."
},
"webhook_url": {
"type": "string",
"format": "uri",
"maxLength": 2048,
"description": "Optional: your own public https endpoint for signed change events."
},
"interval_hours": {
"type": "integer",
"default": 24,
"maximum": 168,
"minimum": 1,
"description": "Hours between checks: 24 minimum on the free tier; 1 for DELIVERY_SLA."
},
"continuity_handle": {
"type": "object",
"required": [
"continuity_id",
"token"
],
"properties": {
"token": {
"type": "string"
},
"continuity_id": {
"type": "string"
}
},
"description": "The continuity_handle from an earlier GAIP result; proves you own these watches."
},
"data_classification": {
"enum": [
"PUBLIC",
"NON_PERSONAL_PUBLIC"
],
"type": "string",
"default": "PUBLIC",
"description": "PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data."
}
},
"additionalProperties": false
}| data_classification | string | PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data. |
| independent_operator_id | string | Optional: your operator id (recorded as a claim, not verified). |
{
"type": "object",
"examples": [
{
"task_class": "weather_forecast",
"observations": [
{
"claim": "Publishes a public weather_forecast skill",
"source": "https://forecast.example.com/.well-known/agent-card.json",
"observed_at": "2026-09-27T12:00:00Z",
"evidence_digest": "3f0a9c1e5b7d2468ace013579bdf2468ace013579bdf2468ace013579bdf2468",
"lifecycle_state": "observed"
},
{
"claim": "Returned a London forecast in 1.2 s",
"source": "caller_task_log",
"observed_at": "2026-09-27T12:05:00Z",
"lifecycle_state": "OBSERVED"
}
],
"counterparty_id": "example-weather-agent"
}
],
"properties": {
"synthetic": {
"type": "boolean",
"description": "Optional: true marks a test call."
},
"episode_id": {
"type": "string",
"description": "Optional: your own id to group related calls."
},
"task_class": {
"type": "string",
"default": "COUNTERPARTY_EVIDENCE",
"description": "Task you want evidence for. Optional."
},
"max_age_days": {
"type": "integer",
"maximum": 365,
"minimum": 1,
"description": "Optional freshness window (default 30): GAIP history records older than this are STALE and do not count toward evidence_sufficiency."
},
"observations": {
"type": "array",
"items": {
"type": "object"
},
"description": "Optional: observations about it, each {source, observed_at, evidence_digest, lifecycle_state, claim}."
},
"counterparty_id": {
"type": "string",
"description": "Name or URL of the agent or service."
},
"continuity_handle": {
"type": "object",
"required": [
"continuity_id",
"token"
],
"properties": {
"token": {
"type": "string"
},
"continuity_id": {
"type": "string"
}
},
"description": "Optional: the continuity_handle from an earlier GAIP result; links this call to your earlier ones.",
"additionalProperties": false
},
"data_classification": {
"enum": [
"PUBLIC",
"NON_PERSONAL_PUBLIC"
],
"type": "string",
"default": "PUBLIC",
"description": "PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data."
},
"independent_operator_id": {
"type": "string",
"description": "Optional: your operator id (recorded as a claim, not verified)."
}
},
"additionalProperties": true
}| agreement_cancelled |
| boolean |
| Only with agreement_id: either party records that it cancelled the agreement (recorded as that party's statement and published in GAIP's revocation feed). |
| data_classification | string | PUBLIC or NON_PERSONAL_PUBLIC. |
| mandate_check_receipt | object | Optional: the gaip_check_mandate receipt you obtained (or {receipt_sha256, state}) if you act for a person; its state is recorded beside the acceptance as a fact and shown in the finding. |
| business_purpose_statement | boolean | Required true from the seller at acceptance and from the buyer (with agreement_id): you act for purposes relating to your trade, business, craft or profession and the deal is not with a consumer. No finding until both parties have stated it. |
{
"type": "object",
"examples": [
{
"terms_id": "<terms_id from witness_register_terms>",
"continuity_handle": {
"token": "<continuity_handle.token returned by any GAIP tool>",
"continuity_id": "<continuity_handle.continuity_id returned by any GAIP tool>"
},
"business_purpose_statement": true
}
],
"required": [
"terms_id"
],
"properties": {
"terms_id": {
"type": "string",
"description": "wt_... from witness_register_terms."
},
"agreement_id": {
"type": "string",
"description": "Only on an existing agreement: the buyer confirms business purpose or expert determination, or either party declares a consumer contract."
},
"finding_mode": {
"enum": [
"EVIDENCE_ONLY",
"EXPERT_DETERMINATION"
],
"type": "string",
"default": "EVIDENCE_ONLY",
"description": "EVIDENCE_ONLY, or EXPERT_DETERMINATION (needs the buyer's confirmation)."
},
"acceptance_rule": {
"type": "object",
"properties": {
"by": {
"type": [
"string",
"null"
],
"description": "Deadline, RFC 3339 (optional)."
},
"delivered_when": {
"enum": [
"LATEST_MET",
"ANY_MET"
],
"type": "string",
"default": "LATEST_MET"
},
"finding_may_be_called_by": {
"enum": [
"EITHER",
"BUYER",
"SELLER"
],
"type": "string",
"default": "EITHER"
}
},
"description": "What counts as delivered, by when, and who may ask for the finding.",
"additionalProperties": false
},
"seller_key_proof": {
"type": "object",
"description": "Optional: {jwk, jws over the terms_id, host}; GAIP checks the signature and whether the host published that key."
},
"consumer_contract": {
"type": "boolean",
"default": false,
"description": "true if either party is a consumer: evidence summary only, no finding."
},
"continuity_handle": {
"type": "object",
"description": "Required: your own continuity handle (continuity_id, token)."
},
"agreement_cancelled": {
"type": "boolean",
"default": false,
"description": "Only with agreement_id: either party records that it cancelled the agreement (recorded as that party's statement and published in GAIP's revocation feed)."
},
"data_classification": {
"enum": [
"PUBLIC",
"NON_PERSONAL_PUBLIC"
],
"type": "string",
"description": "PUBLIC or NON_PERSONAL_PUBLIC."
},
"mandate_check_receipt": {
"type": "object",
"description": "Optional: the gaip_check_mandate receipt you obtained (or {receipt_sha256, state}) if you act for a person; its state is recorded beside the acceptance as a fact and shown in the finding."
},
"business_purpose_statement": {
"type": "boolean",
"description": "Required true from the seller at acceptance and from the buyer (with agreement_id): you act for purposes relating to your trade, business, craft or profession and the deal is not with a consumer. No finding until both parties have stated it."
}
},
"additionalProperties": false
}| string |
| BUYER_SUBMITTED: the Content-Type you received. |
| research_consent | boolean | Optional, default false. true lets this delivery check be counted, never named, in GAIP's monthly aggregate research figures. |
| continuity_handle | object | Optional: the continuity_handle from an earlier GAIP result; links this call to your earlier ones. |
| data_classification | string | PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data. |
| independent_operator_id | string | Optional: your operator id (recorded as a claim, not verified). |
{
"type": "object",
"examples": [
{
"mode": "PUBLIC_REPLAY",
"terms_id": "<terms_id from witness_register_terms>"
}
],
"required": [
"terms_id",
"mode"
],
"properties": {
"body": {
"type": "string",
"maxLength": 32768,
"description": "BUYER_SUBMITTED: the response body you received (max 32 KiB)."
},
"mode": {
"enum": [
"BUYER_SUBMITTED",
"PUBLIC_REPLAY"
],
"type": "string",
"description": "PUBLIC_REPLAY: GAIP fetches the public URL itself. BUYER_SUBMITTED: check a response you pass in."
},
"terms_id": {
"type": "string",
"description": "The terms_id returned when the terms were registered."
},
"synthetic": {
"type": "boolean",
"description": "Optional: true marks a test call."
},
"episode_id": {
"type": "string",
"description": "Optional: your own id to group related calls."
},
"body_sha256": {
"type": "string",
"description": "BUYER_SUBMITTED: SHA-256 of the body, instead of the body."
},
"http_status": {
"type": "integer",
"description": "BUYER_SUBMITTED: the HTTP status you received."
},
"content_type": {
"type": "string",
"description": "BUYER_SUBMITTED: the Content-Type you received."
},
"research_consent": {
"type": "boolean",
"default": false,
"description": "Optional, default false. true lets this delivery check be counted, never named, in GAIP's monthly aggregate research figures."
},
"continuity_handle": {
"type": "object",
"required": [
"continuity_id",
"token"
],
"properties": {
"token": {
"type": "string"
},
"continuity_id": {
"type": "string"
}
},
"description": "Optional: the continuity_handle from an earlier GAIP result; links this call to your earlier ones.",
"additionalProperties": false
},
"data_classification": {
"enum": [
"PUBLIC",
"NON_PERSONAL_PUBLIC"
],
"type": "string",
"default": "PUBLIC",
"description": "PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data."
},
"independent_operator_id": {
"type": "string",
"description": "Optional: your operator id (recorded as a claim, not verified)."
}
},
"additionalProperties": true
}| continuity_handle | object | Optional: your continuity handle (continuity_id, token); one is issued with the receipt when absent. |
| data_classification | string | PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data. |
{
"type": "object",
"examples": [
{
"role": "APPROVER",
"decision": "APPROVED",
"agreement_id": "<agreement_id returned by witness_accept_terms>",
"proposal_sha256": "a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1"
}
],
"required": [
"proposal_sha256",
"decision"
],
"properties": {
"role": {
"enum": [
"APPROVER",
"REVIEWER",
"OWNER",
"OPERATOR"
],
"type": "string",
"description": "The role that decided: APPROVER, REVIEWER, OWNER or OPERATOR. Any other text is refused (ROLE_VOCABULARY); use role_id for your own id."
},
"role_id": {
"type": "string",
"maxLength": 200,
"description": "Optional: your own opaque role identifier (one token, no spaces). GAIP keeps it only as a keyed hash, never in clear."
},
"decision": {
"enum": [
"APPROVED",
"REFUSED",
"CHANGED"
],
"type": "string",
"description": "The decision as recorded: APPROVED, REFUSED or CHANGED."
},
"agent_url": {
"type": "string",
"maxLength": 2048,
"description": "Optional: public https URL of the agent whose proposal was decided (the system identifier)."
},
"agreement_id": {
"type": "string",
"description": "Optional: the wa_... Deals agreement from witness_accept_terms this decision concerns; the finding then lists it."
},
"reason_sha256": {
"type": "string",
"maxLength": 64,
"minLength": 64,
"description": "Optional: SHA-256 (64 hex) of the reason you keep; anything but a hash is refused."
},
"proposal_sha256": {
"type": "string",
"maxLength": 64,
"minLength": 64,
"description": "SHA-256 (64 hex) of what the agent proposed, computed by you; the proposal itself is never sent."
},
"continuity_handle": {
"type": "object",
"description": "Optional: your continuity handle (continuity_id, token); one is issued with the receipt when absent."
},
"data_classification": {
"enum": [
"PUBLIC",
"NON_PERSONAL_PUBLIC"
],
"type": "string",
"default": "PUBLIC",
"description": "PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data."
}
},
"additionalProperties": false
}