MERCURY Verifiable Web Fetch

MERCURY is an agent-to-agent storefront that sells over HTTP 402. Your agent discovers what

SearchLiveeip155:8453Exactvia cdp
Verifiable-web-fetchAgent-web-fetchWeb-fetchAttestationProvenance
Activity
Nothing indexed for this service or its provider yet. Not a claim that it is unused — only that we hold no record.
$0.05
Verified settled volume
13 settlements proven x402 by their on-chain EIP-3009 marker.
$0.0030
Listed price
As published in the catalog. Always read the live 402 before paying.
1
Calls · 30d
Upstream's own call count for this endpoint, not ours.
1
Unique payers · 30d
Last called 2026-06-03 15:30Z
Upstream on-chain volume
Reported by the source catalog.
Paid to
0xe10B9d44e72A29B9c19da02981FFCd875308e3C1

The wallet the 402 directs payment to. Its whole payment record — every payer, every chain — is on the merchant page.

Asset 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913

Provider

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.

0.003USDC≈ $0.003 USD
on Base · exact scheme

Pay 0.003 USDC on Base to 0xe10B…8e3C1. The signed payment is good for 1 minute.

USD Coin contract
0x8335…02913
Payment window
1 minute
As published
3000 smallest units
0.006USDC≈ $0.006 USD
on Base · exact scheme

Pay 0.006 USDC on Base to 0xe10B…8e3C1. The signed payment is good for 1 minute.

USD Coin contract
0x8335…02913
Payment window
1 minute
As published
6000 smallest units
0.012USDC≈ $0.012 USD
on Base · exact scheme

Pay 0.012 USDC on Base to 0xe10B…8e3C1. The signed payment is good for 1 minute.

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
Report

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.

Open skill.md
Show 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.