Agent Output Verifier
Free during launch: check AI agent output before you accept or pay for a deliverable against your JSON Schema and rules. Pass/fail, % of checks passed, fix hints, signed attestation and receipt. $0.02 USDC after, x402 v2.
The wallet the 402 directs payment to. Its whole payment record — every payer, every chain — is on the merchant page.
Asset 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
The payTo wallet does not resolve to a registered ERC-8004 agent. That is not a verdict on the service — most of the catalog is unregistered.
Live 402 challenge
Captured by the enrichment pass, not read just now. Prices can change — always read the 402 the endpoint answers with.
{
"error": "No payment was attached to the request.",
"accepts": [
{
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"extra": {
"name": "USD Coin",
"version": "2"
},
"payTo": "0x42a3c399f83BCcC3b9eEf81e65954a715D54855E",
"amount": "20000",
"scheme": "exact",
"network": "eip155:8453",
"maxTimeoutSeconds": 300
},
{
"asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"extra": {
"feePayer": "GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"
},
"payTo": "38Fmaf3MWTR6AWPWrtrdXoqn6iqfVcUBHMFRhiUAEjFb",
"amount": "20000",
"scheme": "exact",
"network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
"maxTimeoutSeconds": 300
}
],
"guidance": {
"docs": {
"openapi": "https://verify.sarnai.dev/openapi.json",
"llms_txt": "https://verify.sarnai.dev/llms.txt"
},
"price": "$0.02 USDC per call (POST /verify/schema and /verify/deliverable); GET /score/{agent_id} is $0.01 USDC",
"how_to_pay": "Send the request with no payment: the 402 answer lists the price and networks (USDC on Base or Solana) in the PAYMENT-REQUIRED header (x402 v2). Sign it with an x402 client and resend the same request with the PAYMENT-SIGNATURE header. The MCP tool at https://verify.sarnai.dev/mcp takes the same arguments.",
"what_to_do": "Pay with x402 v2 as described in how_to_pay, or send a valid request while the free allowance lasts. Nothing was charged by this response.",
"free_allowance": {
"message": "Free during launch: 1000 verification checks a day per caller through MCP and REST (POST /verify/schema and POST /verify/deliverable), then $0.02 USDC per call via x402.",
"available": true,
"resets_at": "2026-10-16T00:00:00+00:00",
"applies_to": "valid requests to POST /verify/schema and POST /verify/deliverable and the MCP tool verify_schema; one count per client address",
"remaining_calls_today": 996,
"calls_per_client_per_day": 1000
},
"example_request": {
"url": "https://verify.sarnai.dev/verify/deliverable",
"body": {
"task_id": "example-task-1",
"expected_schema": {
"type": "object",
"required": [
"total"
],
"properties": {
"total": {
"type": "number"
}
}
},
"submitted_output": {
"total": 42
}
},
"method": "POST",
"headers": {
"Content-Type": "application/json"
}
}
},
"resource": {
"url": "https://verify.sarnai.dev/verify/deliverable",
"tags": [
"deliverable",
"agent-output",
"verification",
"json-schema",
"x402"
],
"mimeType": "application/json",
"description": "Free during launch: check AI agent output before you accept or pay for a deliverable against your JSON Schema and rules. Pass/fail, % of checks passed, fix hints, signed attestation and receipt. $0.02 USDC after, x402 v2.",
"serviceName": "Agent Output Verifier"
},
"free_trial": {
"url": "https://verify.sarnai.dev/mcp",
"via": "mcp+rest",
"tool": "verify_schema",
"client": "identified by request IP address; the same address's REST and MCP verification calls share one allowance",
"launch": true,
"message": "Free during launch. 996 of 1000 free checks remain today for this client, shared by this REST endpoint and the MCP tool 'verify_schema' at https://verify.sarnai.dev/mcp. This request needs payment because the request body is not a valid verification request.",
"available": true,
"resets_at": "2026-10-16T00:00:00+00:00",
"rest_free": true,
"transport": "streamable-http",
"declined_because": "invalid_request",
"remaining_calls_today": 996,
"calls_per_client_per_day": 1000
},
"probe_note": {
"path": "/verify/deliverable",
"method": "POST",
"message": "The real call is POST /verify/deliverable with the output to check as a JSON body; this GET/HEAD answer is the payment challenge for it. A valid POST is served free while the launch allowance lasts, then paid.",
"example_body": {
"task_id": "example-task-1",
"expected_schema": {
"type": "object",
"required": [
"total"
],
"properties": {
"total": {
"type": "number"
}
}
},
"submitted_output": {
"total": 42
}
}
},
"x402Version": 2,
"payment_error": {
"charged": false,
"message": "This call requires payment; none was attached.",
"retryable": true,
"error_code": "no_payment",
"retry_after": null,
"next_actions": [
{
"action": "submit_x402_v2_payment"
}
],
"payment_terms": {
"accepts": [
{
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"extra": {
"name": "USD Coin",
"version": "2"
},
"payTo": "0x42a3c399f83BCcC3b9eEf81e65954a715D54855E",
"amount": "20000",
"scheme": "exact",
"network": "eip155:8453",
"maxTimeoutSeconds": 300
},
{
"asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"extra": {
"feePayer": "GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"
},
"payTo": "38Fmaf3MWTR6AWPWrtrdXoqn6iqfVcUBHMFRhiUAEjFb",
"amount": "20000",
"scheme": "exact",
"network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
"maxTimeoutSeconds": 300
}
],
"resource": {
"url": "https://verify.sarnai.dev/verify/deliverable",
"tags": [
"deliverable",
"agent-output",
"verification",
"json-schema",
"x402"
],
"mimeType": "application/json",
"description": "Free during launch: check AI agent output before you accept or pay for a deliverable against your JSON Schema and rules. Pass/fail, % of checks passed, fix hints, signed attestation and receipt. $0.02 USDC after, x402 v2.",
"serviceName": "Agent Output Verifier"
}
}
}
}Accepts
The payment requirements as published to the catalog. Read the live 402 before paying — a price here is a claim, not a quote.
Pay 0.02 USDC on Base to 0x42a3…4855E. The signed payment is good for 5 minutes.
- Paid to
- 0x42a3…4855E
- USD Coin contract
- 0x8335…02913
- Payment window
- 5 minutes
- As published
- 20000 smallest units
That figure is in the token’s smallest units. Roundhouse does not hold this contract’s decimals, so it is shown as published rather than converted.
- Paid to
- 38Fmaf…AEjFb
- Token contract
- EPjFWd…TDt1v
- Payment window
- 5 minutes
The catalog’s raw entry
[
{
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"extra": {
"name": "USD Coin",
"version": "2"
},
"payTo": "0x42a3c399f83BCcC3b9eEf81e65954a715D54855E",
"amount": "20000",
"scheme": "exact",
"network": "eip155:8453",
"maxTimeoutSeconds": 300
},
{
"asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"extra": {
"feePayer": "GVJJ7rdGiXr5xaYbRwRbjfaJL7fmwRygFi1H6aGqDveb"
},
"payTo": "38Fmaf3MWTR6AWPWrtrdXoqn6iqfVcUBHMFRhiUAEjFb",
"amount": "20000",
"scheme": "exact",
"network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
"maxTimeoutSeconds": 300
}
]Extensions
{
"bazaar": {
"info": {
"input": {
"body": {
"rules": [
{
"type": "unique",
"field": "findings[].id"
}
],
"task_id": "example-task-002",
"agent_id": "example-agent-001",
"enforce_rules": true,
"expected_schema": {
"type": "object",
"required": [
"report_title",
"findings"
],
"properties": {
"findings": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"summary"
],
"properties": {
"id": {
"type": "string"
},
"summary": {
"type": "string",
"minLength": 1
}
}
},
"minItems": 1
},
"report_title": {
"type": "string",
"minLength": 1
}
}
},
"submitted_output": {
"findings": [
{
"id": "F-1",
"summary": "Vendor A raised its entry plan by 10%."
},
{
"id": "F-2",
"summary": "Vendor B added a free tier."
}
],
"report_title": "Q3 competitor pricing scan"
}
},
"type": "http",
"method": "POST",
"bodyType": "json"
},
"output": {
"type": "json",
"example": {
"flags": [],
"hints": [],
"errors": [],
"result": "pass",
"verify": {
"mcp": "https://verify.sarnai.dev/mcp",
"service": "Agent Output Verifier",
"key_version": "v1-2026-09c",
"hash_algorithm": "SHA-256",
"public_key_url": "https://verify.sarnai.dev/.well-known/agent-card.json",
"canonicalization": "RFC 8785 (JCS)"
},
"overall": {
"ratio": 1,
"total": 28,
"passed": 28
},
"summary": {
"result": "pass",
"blocking_checks": []
},
"task_id": "example-task-002",
"agent_id": "example-agent-001",
"rules_hash": "a888b42989834a385f47403af04349f49bb47c950918ed100dc1df20d9d30a3b",
"attestation": {
"algorithm": "Ed25519",
"signature": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"timestamp": "2026-01-01T00:00:00+00:00",
"key_version": "v1-example"
},
"flags_total": 0,
"hints_total": 0,
"output_hash": "dc7786e4a55de9423a7b14297944b00ebe8e5c709f2063a78230aa2df7004b50",
"schema_hash": "55cdc036dc420c8ed2f46ea0a6f2df6f99821be1b9b388d5267736066d66579b",
"verified_at": "2026-01-01T00:00:00+00:00",
"errors_total": 0,
"next_actions": [
{
"for": "seller",
"action": "attach_receipt"
},
{
"for": "buyer",
"action": "proceed_to_payment"
}
],
"request_hash": "0defdf7d0e73e14d785a03658d6f2b3ef6e210569516387e2cc1d057ed6ba6b0",
"enforce_rules": true,
"errors_detail": [],
"flags_omitted": 0,
"hints_omitted": 0,
"errors_omitted": 0,
"verification_id": "0b8f2a6e-5d1c-4f43-9a07-3c61d9e2b8a4",
"integrity_checks": {
"ratio": 1,
"total": 12,
"passed": 12
},
"verifier_version": "0.4.1",
"schema_compliance": {
"ratio": 1,
"total": 16,
"passed": 16
},
"errors_detail_total": 0,
"strict_content_check": false,
"errors_detail_omitted": 0
}
}
},
"schema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"input"
],
"properties": {
"input": {
"type": "object",
"required": [
"type",
"method",
"bodyType",
"body"
],
"properties": {
"body": {
"type": "object",
"required": [
"task_id",
"expected_schema",
"submitted_output"
],
"properties": {
"rules": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"required": [
"type",
"field"
],
"properties": {
"type": {
"type": "string"
},
"field": {
"type": "string"
},
"value": {
"type": [
"integer",
"number",
"string",
"null"
]
},
"equals": {
"type": [
"integer",
"number",
"null"
]
},
"values": {
"type": [
"array",
"null"
]
},
"in_field": {
"type": [
"string",
"null"
]
},
"tolerance": {
"type": "number"
},
"if_present": {
"type": "boolean"
},
"other_field": {
"type": [
"string",
"null"
]
},
"equals_field": {
"type": [
"string",
"null"
]
}
}
},
"description": "Optional cross-field rules: sum_equals, gte, lte, exists_in, unique (duplicate detection). Violations are reported as informational flags unless enforce_rules is true."
},
"bounds": {
"type": [
"object",
"null"
],
"description": "Optional per-field min/max, keyed by dotted path with '[]' array wildcard (e.g. 'items[].price'). Numbers or ISO-8601 dates. Violations are reported as informational flags unless enforce_rules is true."
},
"detail": {
"enum": [
"full",
"compact"
],
"type": "string",
"description": "'full' (default) returns everything; 'compact' returns only the summary, next actions, receipt and signature. Use compact inside verify-repair loops to save tokens. 'compact' fields: summary, next_actions, result, the receipt fields (verification_id, task_id, agent_id, output_hash, schema_hash, rules_hash, verified_at, verifier_version, enforce_rules, strict_content_check), verify and attestation - errors, errors_de…"
},
"task_id": {
"type": "string",
"description": "Your own identifier for this verification. 1-200 printable characters, no control characters and no lone Unicode surrogate; a request outside that range is rejected (422), not truncated."
},
"agent_id": {
"type": [
"string",
"null"
],
"description": "Optional label identifying the AI agent that produced submitted_output (for example, the seller), used for /reputation and the trust score: records and scores belong to the producer, not to whoever calls this endpoint. It is an unauthenticated label. agent_ids starting with 'test-' are reserved for testing: the verification runs normally but is never recorded, so it cannot affect any reputation or trust score. 1-200…"
},
"enforce_rules": {
"type": "boolean",
"description": "Opt-in. When true, every configured bound and consistency rule must hold, or the result is 'fail' (like strict_content_check), with an 'enforce_rules: ...' entry in errors. That includes a rule or bound that cannot run (its path is missing, a value is not comparable, a value has nothing to be compared against): it fails rather than passing silently, so omitting a field, in the whole path or in any array element the…"
},
"expected_schema": {
"type": "object",
"description": "Required. The JSON Schema (draft-04 to 2020-12) that submitted_output must satisfy: your own requirements, as a JSON object."
},
"submitted_output": {
"description": "Required. The output being checked: any JSON value (object, array, string, number, boolean or null), exactly as the AI agent produced it."
},
"strict_content_check": {
"type": "boolean",
"description": "Opt-in. When true, any string in submitted_output containing control characters (e.g. null bytes) or embedded HTML/script markup makes the result 'fail'. When false (default) this is not checked at all."
}
}
},
"type": {
"type": "string",
"const": "http"
},
"method": {
"enum": [
"POST",
"PUT",
"PATCH"
],
"type": "string"
},
"bodyType": {
"enum": [
"json",
"form-data",
"text"
],
"type": "string"
}
},
"additionalProperties": false
},
"output": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"type": "string"
},
"example": {
"type": "object",
"required": [
"summary",
"next_actions",
"result",
"verification_id",
"task_id",
"agent_id",
"output_hash",
"schema_hash",
"rules_hash",
"request_hash",
"verified_at",
"verifier_version",
"enforce_rules",
"strict_content_check",
"errors",
"errors_total",
"errors_omitted",
"errors_detail_total",
"errors_detail_omitted",
"flags_total",
"flags_omitted",
"hints",
"hints_total",
"hints_omitted",
"schema_compliance",
"integrity_checks",
"overall",
"verify",
"attestation"
],
"properties": {
"flags": {
"type": "array",
"items": {
"type": "object",
"required": [
"check",
"field",
"detail"
],
"properties": {
"check": {
"type": "string"
},
"field": {
"type": "string"
},
"detail": {
"type": "string"
},
"severity": {
"type": "string"
}
}
},
"description": "Integrity findings (placeholder text, possible truncation, bounds and consistency-rule violations)"
},
"hints": {
"type": "array",
"items": {
"type": "object",
"required": [
"source",
"check",
"path",
"expected",
"found"
],
"properties": {
"path": {
"type": "string"
},
"check": {
"type": "string"
},
"found": {
"type": "string"
},
"source": {
"type": "string"
},
"expected": {
"type": "string"
}
}
},
"description": "Machine-actionable, template-based fix hints: one per schema validation failure (first, in the same order as…"
},
"errors": {
"type": "array",
"items": {
"type": "string"
},
"description": "Every violation (schema, then strict-content, then enforce_rules), capped at the first 100 schema-validation…"
},
"result": {
"enum": [
"pass",
"fail"
],
"type": "string"
},
"verify": {
"type": "object",
"description": "How to verify this attestation and receipt without any other lookup than this response and public_key_url: ca…"
},
"overall": {
"type": "object",
"description": "A pooled count across both groups: (schema_compliance.passed + integrity_checks.passed) / (schema_compliance.…"
},
"summary": {
"type": "object",
"description": "Compact digest of the verdict: the same `result`, and `blocking_checks` (the distinct check codes that caused…"
},
"task_id": {
"type": "string"
},
"agent_id": {
"type": [
"string",
"null"
],
"description": "Echo of the agent_id label supplied in the request; null if none"
},
"rules_hash": {
"type": [
"string",
"null"
],
"description": "SHA-256 (64 lowercase hex chars) of the RFC 8785 (JCS) canonical JSON of {\"bounds\": <the bounds you supplied…"
},
"attestation": {
"type": "object",
"description": "Ed25519 signature over this response (every field above, including the receipt fields) plus the timestamp and…"
},
"flags_total": {
"type": "integer",
"description": "How many flags exist in total (flags holds at most the first 100, plus a flags_truncated marker when there ar…"
},
"hints_total": {
"type": "integer",
"description": "How many hints exist in total (hints holds at most the first 20)"
},
"output_hash": {
"type": [
"string",
"null"
],
"description": "SHA-256 (64 lowercase hex chars = 32 bytes; add 0x to use it as a bytes32) of the JCS canonical JSON of submi…"
},
"schema_hash": {
"type": [
"string",
"null"
],
"description": "SHA-256 (64 lowercase hex chars) of the JCS canonical JSON of expected_schema"
},
"verified_at": {
"type": "string",
"description": "ISO-8601 UTC time this service ran the verification"
},
"errors_total": {
"type": "integer",
"description": "How many errors exist in total"
},
"next_actions": {
"type": "array",
"items": {
"type": "object"
},
"description": "What to do next, machine-readable"
},
"request_hash": {
"type": [
"string",
"null"
],
"description": "SHA-256 (64 lowercase hex chars, no 0x prefix) of the RFC 8785 (JCS) canonical JSON of the request as parsed:…"
},
"enforce_rules": {
"type": "boolean",
"description": "Whether the request had enforce_rules on: true means every rule and bound had to hold (violations and unrunna…"
},
"errors_detail": {
"type": "array",
"items": {
"type": "object",
"required": [
"check",
"path",
"expected",
"found",
"message"
],
"properties": {
"path": {
"type": "string"
},
"check": {
"type": "string"
},
"found": {
"type": "string"
},
"message": {
"type": "string"
},
"expected": {
"type": "string"
}
}
},
"description": "The structured form of the leading entries in `errors`, same order, so a caller can act (check, path, expecte…"
},
"flags_omitted": {
"type": "integer",
"description": "Integrity flags beyond the 100 returned; 0 when nothing was cut off"
},
"hints_omitted": {
"type": "integer",
"description": "hints_total minus len(hints)"
},
"errors_omitted": {
"type": "integer",
"description": "errors_total minus len(errors); 0 when nothing was cut off"
},
"verification_id": {
"type": "string",
"description": "Unique UUID (v4) for this verification"
},
"integrity_checks": {
"type": "object",
"description": "Integrity checks that passed out of those evaluated (per string: placeholder and truncation, plus strict cont…"
},
"verifier_version": {
"type": "string"
},
"schema_compliance": {
"type": "object",
"description": "JSON Schema assertions that passed out of those evaluated (each keyword such as type/required/minimum, at eac…"
},
"errors_detail_total": {
"type": "integer",
"description": "How many entries in `errors` have a structured form available"
},
"strict_content_check": {
"type": "boolean",
"description": "Whether the request had strict_content_check on: true means control characters and embedded HTML/script marku…"
},
"errors_detail_omitted": {
"type": "integer",
"description": "errors_total minus errors_detail_total; 0 when every error has a structured form"
}
}
}
}
}
}
}
}
}Provenance
- Seen in the source catalog
- 2026-10-15 01:14Z
- Last indexed by Roundhouse
- 2026-10-26 22:40Z
- Last enriched (probe, favicon, geo)
- 2026-10-15 07:15Z
- x402 version
- 2
- Max timeout
- 300s
- Liveness probe
- HTTP 402
Hand this page to an agent
Copy the prompt and paste it into Claude, an MCP client or your own agent — it will vet this service and call it over the free read API. No key, no account.
GET api.roundhouseai.io/v0/endpoints
This endpoint's own trailing-30-day call count, as published by the upstream catalog and snapshotted daily. 16 snapshots so far. Verified volume counts only settlements with an on-chain EIP-3009 marker.
Show the promptHide the prompt
Using Roundhouse, look up the x402 service Agent Output Verifier and tell me whether it is worth paying: what a call costs, whether the endpoint answered when last probed, and what its payment record actually shows. curl -s 'https://api.roundhouseai.io/v0/endpoints?q=Agent%20Output%20Verifier' curl -s 'https://api.roundhouseai.io/v0/merchants/<the payTo wallet returned above>' Then call it: read the price from the live 402 at https://verify.sarnai.dev/verify/deliverable, never from a cached figure, and pay with an x402 client. The /v0 API needs an API key (`authorization: Bearer rh_live_…`) on everything except /v0/unified* and /v0/endpoints. Either pay over x402 (mint a personal key for $0.01 at GET https://api.roundhouseai.io/v0/test/x402), or ask me for an organization key, which I create at https://roundhouseai.io/dashboard/connections. If you have neither, ask before going further. If you do not have Roundhouse tools or skills installed, read https://roundhouseai.io/skill.md first — it is the whole procedure.