MERCURY Verifiable Web Fetch
MERCURY is an agent-to-agent storefront that sells over HTTP 402. Your agent discovers what
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": "X-PAYMENT header is required",
"accepts": [
{
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"extra": {
"name": "USD Coin",
"version": "2"
},
"payTo": "0xe10B9d44e72A29B9c19da02981FFCd875308e3C1",
"scheme": "exact",
"network": "base",
"mimeType": "",
"resource": "https://mercury-x402-jed.fly.dev/buy/fetch",
"description": "VERIFIABLE keyless web-read for autonomous agents. Every result ships a cryptographically SIGNED provenance receipt (EIP-191 over sha256(text)+url+status+time) — the wedge a free scraper structurally CANNOT match: Jina r.jina.ai is free+keyless too, but its bytes are HEARSAY (no proof of what/where/when). MERCURY's `attestation` is ecrecoverable OFFLINE, forever, by you OR any downstream agent you forward the bytes to — proving the content is genuine + untampered (key pinned at /.well-known/mercury-attestation). For RAG, trading and agent-to-agent commerce that need provenance, that is the gap between data and evidence. Beyond that it's the keyless web-read primitive — NO API key, NO signup, NO account, NO monthly plan, the one fetch SKU a fresh agent can onboard to by itself instead of stopping to ask a human for a key. Give a ?url= and get back clean readable page text + title + status. Agent-native extras (opt-in): ?format=markdown for structure-preserving markdown, ?links=1 for an outbound-link graph (crawl frontier), and the headline wedge — STRUCTURED EXTRACT: ?extract=title,price,author,publishedAt returns a clean JSON record { title, price, author, publishedAt }, an LLM-ready row not a wall of text. That is Firecrawl's paid 'JSON mode' (they need an LLM call + an API key for it) done here DETERMINISTICALLY from the page's own JSON-LD/OpenGraph/meta/microdata — keyless, no LLM, $0.003. (?extract=1 still returns the legacy description + wordCount.) The extracted record is folded into the SIGNED attestation too, so a buyer can prove the FIELDS — not just the raw bytes — are exactly what MERCURY resolved. You pay in-band over HTTP 402 (x402, USDC on Base mainnet) — the wedge those tools can't match: they ALL gate behind a human-created API key + a credit-card plan, so an agent can't onboard itself. This one an agent finds in the x402 Bazaar and pays with zero human in the loop. Honest charge-per-ATTEMPT: every call returns a structured result (success OR an ok:false failure with a reason) — never a silent charge-then-500. Follows redirects, SSRF-guarded, 5s timeout, 10MB cap. Pure data, no mint — delivers in prod.",
"outputSchema": {
"input": {
"type": "object",
"method": "GET",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "the page to fetch (http/https)"
},
"links": {
"enum": [
"0",
"1"
],
"type": "string",
"description": "1 = also return the outbound-link graph (crawl frontier)"
},
"format": {
"enum": [
"text",
"markdown"
],
"type": "string",
"description": "text (default) or structure-preserving markdown"
},
"extract": {
"type": "string",
"maxLength": 256,
"description": "1 = page description + wordCount; OR a comma-list of field names (e.g. title,price,author,publishedAt) to get a structured JSON record under `extract`"
}
},
"discoverable": true,
"additionalProperties": false
},
"output": {
"type": "object",
"required": [
"ok",
"url"
],
"properties": {
"ok": {
"type": "boolean",
"description": "true on success; false on an honest failure (still delivered)"
},
"url": {
"type": "string",
"description": "final URL after redirects"
},
"text": {
"type": "string",
"description": "cleaned, readable page text (or markdown if ?format=markdown)"
},
"bytes": {
"type": "integer",
"description": "raw body size"
},
"error": {
"type": "string",
"description": "present only when ok:false"
},
"links": {
"type": "array",
"items": {
"type": "object",
"properties": {
"url": {
"type": "string"
},
"text": {
"type": "string"
}
}
},
"description": "outbound-link graph, same-origin first (only when ?links=1)"
},
"title": {
"type": "string",
"description": "page <title> (HTML pages only)"
},
"format": {
"enum": [
"markdown"
],
"type": "string",
"description": "echoed only when ?format=markdown was requested"
},
"status": {
"type": "integer",
"description": "upstream HTTP status"
},
"extract": {
"type": "object",
"description": "STRUCTURED JSON record (only when ?extract=<comma-list of fields>). The Firecrawl-JSON-mode wedge: each requested field resolved from JSON-LD/OpenGraph/meta/microdata, absent fields null. Deterministic, keyless, no LLM call. The signed attestation covers this record too.",
"additionalProperties": {
"type": [
"string",
"number",
"boolean",
"null"
]
}
},
"truncated": {
"type": "boolean"
},
"wordCount": {
"type": "integer",
"description": "word count of returned text (only when ?extract=1)"
},
"attestation": {
"type": "object",
"properties": {
"alg": {
"type": "string",
"description": "EIP-191-personal_sign"
},
"keyId": {
"type": "string",
"description": "versioned key id (scheme + signer address)"
},
"nonce": {
"type": "string"
},
"verify": {
"type": "object",
"properties": {
"howTo": {
"type": "string"
},
"message": {
"type": "string"
}
},
"description": "the exact signed `message` + a one-line howTo, so verification needs no MERCURY SDK"
},
"address": {
"type": "string",
"description": "the signer address; recover() must equal this"
},
"signedAt": {
"type": "string"
},
"signature": {
"type": "string",
"description": "0x… 65-byte EIP-191 signature"
},
"contentHash": {
"type": "string",
"description": "0x… sha256 hex of `text`"
}
},
"description": "EIP-191 provenance receipt: a signature over sha256(text)+url+status+time, verifiable OFFLINE by anyone (key pinned at /.well-known/mercury-attestation). Proves the content is genuine + untampered — the non-commodity edge of a signed-payment seller."
},
"contentType": {
"type": "string"
},
"description": {
"type": "string",
"description": "page meta/og description (only when ?extract=1)"
}
},
"additionalProperties": false
}
},
"maxAmountRequired": "3000",
"maxTimeoutSeconds": 60
}
],
"x402Version": 1
}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.003 USDC on Base to 0xe10B…8e3C1. The signed payment is good for 1 minute.
- Paid to
- 0xe10B…8e3C1
- USD Coin contract
- 0x8335…02913
- Payment window
- 1 minute
- As published
- 3000 smallest units
Pay 0.006 USDC on Base to 0xe10B…8e3C1. The signed payment is good for 1 minute.
- Paid to
- 0xe10B…8e3C1
- USD Coin contract
- 0x8335…02913
- Payment window
- 1 minute
- As published
- 6000 smallest units
Pay 0.012 USDC on Base to 0xe10B…8e3C1. The signed payment is good for 1 minute.
- Paid to
- 0xe10B…8e3C1
- USD Coin contract
- 0x8335…02913
- Payment window
- 1 minute
- As published
- 12000 smallest units
The catalog’s raw entry
[
{
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"extra": {
"name": "USD Coin",
"tier": "fetch",
"version": "2",
"includes": "clean page text + signed provenance receipt"
},
"payTo": "0xe10B9d44e72A29B9c19da02981FFCd875308e3C1",
"amount": "3000",
"scheme": "exact",
"network": "eip155:8453",
"maxTimeoutSeconds": 60
},
{
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"extra": {
"name": "USD Coin",
"tier": "plus",
"params": "format=markdown&links=1",
"version": "2",
"includes": "+ markdown structure + outbound-link graph"
},
"payTo": "0xe10B9d44e72A29B9c19da02981FFCd875308e3C1",
"amount": "6000",
"scheme": "exact",
"network": "eip155:8453",
"maxTimeoutSeconds": 60
},
{
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"extra": {
"name": "USD Coin",
"tier": "pro",
"params": "extract=title,price,author,publishedAt",
"version": "2",
"includes": "+ deterministic structured-extract JSON record"
},
"payTo": "0xe10B9d44e72A29B9c19da02981FFCd875308e3C1",
"amount": "12000",
"scheme": "exact",
"network": "eip155:8453",
"maxTimeoutSeconds": 60
}
]Extensions
{
"bazaar": {
"info": {
"input": {
"type": "http",
"method": "GET",
"queryParams": {
"url": "https://example.com"
}
},
"output": {
"type": "json",
"example": {
"ok": true,
"url": "https://example.com/",
"text": "Example Domain\n\n# Example Domain\n\nThis domain is for use in documentation examples without needing permission. Avoid use in operations. [Learn more](https://iana.org/domains/example)",
"bytes": 513,
"links": [
{
"url": "https://iana.org/domains/example",
"text": "Learn more"
}
],
"title": "Example Domain",
"format": "markdown",
"status": 200,
"extract": {
"price": null,
"title": "Example Domain",
"author": null
},
"truncated": false,
"wordCount": 22,
"attestation": {
"alg": "EIP-191-personal_sign",
"keyId": "mercury-x402-attestation-v1:0x<signer>",
"nonce": "0x<16-random-bytes>",
"verify": {
"howTo": "EIP-191 ecrecover this message; signer must equal address. Recompute sha256(text)==contentHash.",
"message": "mercury-x402:fetch-attestation:v1\nurl=https://example.com/\nstatus=200\nsha256=0xc372…\nfetchedAt=2026-06-03T00:00:00.000Z\nnonce=0x…"
},
"address": "0x<signer-from-/.well-known/mercury-attestation>",
"signedAt": "2026-06-03T00:00:00.000Z",
"signature": "0x<65-byte EIP-191 signature>",
"contentHash": "0xc372f751afc12f338f7b3cc8ce610bc548c40338bb80c8e0e0b0c06c707a146c"
},
"contentType": "text/html; charset=utf-8",
"description": "Example Domain # Example Domain This domain is for use in documentation examples without needing permission."
}
}
},
"schema": {
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"input"
],
"properties": {
"input": {
"type": "object",
"required": [
"type",
"method"
],
"properties": {
"type": {
"type": "string",
"const": "http"
},
"method": {
"enum": [
"GET"
],
"type": "string"
},
"queryParams": {
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2048,
"description": "the page to fetch (http/https)"
},
"links": {
"enum": [
"0",
"1"
],
"type": "string",
"description": "1 = also return the outbound-link graph (crawl frontier)"
},
"format": {
"enum": [
"text",
"markdown"
],
"type": "string",
"description": "text (default) or structure-preserving markdown"
},
"extract": {
"type": "string",
"maxLength": 256,
"description": "1 = page description + wordCount; OR a comma-list of field names (e.g. title,price,author,publishedAt) to get a structured JSON record under `extract`"
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"output": {
"type": "object",
"required": [
"type"
],
"properties": {
"type": {
"type": "string"
},
"example": {
"type": "object",
"required": [
"ok",
"url"
],
"properties": {
"ok": {
"type": "boolean",
"description": "true on success; false on an honest failure (still delivered)"
},
"url": {
"type": "string",
"description": "final URL after redirects"
},
"text": {
"type": "string",
"description": "cleaned, readable page text (or markdown if ?format=markdown)"
},
"bytes": {
"type": "integer",
"description": "raw body size"
},
"error": {
"type": "string",
"description": "present only when ok:false"
},
"links": {
"type": "array",
"items": {
"type": "object",
"properties": {
"url": {
"type": "string"
},
"text": {
"type": "string"
}
}
},
"description": "outbound-link graph, same-origin first (only when ?links=1)"
},
"title": {
"type": "string",
"description": "page <title> (HTML pages only)"
},
"format": {
"enum": [
"markdown"
],
"type": "string",
"description": "echoed only when ?format=markdown was requested"
},
"status": {
"type": "integer",
"description": "upstream HTTP status"
},
"extract": {
"type": "object",
"description": "STRUCTURED JSON record (only when ?extract=<comma-list of fields>). The Firecrawl-JSON-mode wedge: each requested field resolved from JSON-LD/OpenGraph/meta/microdata, absent fields null. Deterministic, keyless, no LLM call. The signed attestation covers this record too.",
"additionalProperties": {
"type": [
"string",
"number",
"boolean",
"null"
]
}
},
"truncated": {
"type": "boolean"
},
"wordCount": {
"type": "integer",
"description": "word count of returned text (only when ?extract=1)"
},
"attestation": {
"type": "object",
"properties": {
"alg": {
"type": "string",
"description": "EIP-191-personal_sign"
},
"keyId": {
"type": "string",
"description": "versioned key id (scheme + signer address)"
},
"nonce": {
"type": "string"
},
"verify": {
"type": "object",
"properties": {
"howTo": {
"type": "string"
},
"message": {
"type": "string"
}
},
"description": "the exact signed `message` + a one-line howTo, so verification needs no MERCURY SDK"
},
"address": {
"type": "string",
"description": "the signer address; recover() must equal this"
},
"signedAt": {
"type": "string"
},
"signature": {
"type": "string",
"description": "0x… 65-byte EIP-191 signature"
},
"contentHash": {
"type": "string",
"description": "0x… sha256 hex of `text`"
}
},
"description": "EIP-191 provenance receipt: a signature over sha256(text)+url+status+time, verifiable OFFLINE by anyone (key pinned at /.well-known/mercury-attestation). Proves the content is genuine + untampered — the non-commodity edge of a signed-payment seller."
},
"contentType": {
"type": "string"
},
"description": {
"type": "string",
"description": "page meta/og description (only when ?extract=1)"
}
},
"additionalProperties": false
}
}
}
}
}
}
}Provenance
- Seen in the source catalog
- 2026-06-03 15:30Z
- Last indexed by Roundhouse
- 2026-06-11 02:40Z
- Last enriched (probe, favicon, geo)
- 2026-09-22 01:15Z
- x402 version
- 2
- Max timeout
- 60s
- 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
Nothing indexed for this service or its provider yet. Not a claim that it is unused — only that we hold no record. Verified volume counts only settlements with an on-chain EIP-3009 marker.
Show the promptHide the prompt
Using Roundhouse, look up the x402 service MERCURY Verifiable Web Fetch 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=MERCURY%20Verifiable%20Web%20Fetch' 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://mercury-x402-jed.fly.dev/buy/fetch, 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. Mint a personal key for $0.01 at GET https://api.roundhouseai.io/v0/test/x402, or use an organization key from https://roundhouseai.io/dashboard/team. If you do not have Roundhouse tools or skills installed, read https://roundhouseai.io/skill.md first — it is the whole procedure.