# Agent Fetch Hub > URL in, clean Markdown out. Pay per call in USDC over x402. No signup, no API key, no dashboard. ## What this is A machine facing API for agents that need to read the web. It strips navigation, ads, cookie banners and boilerplate, then returns the article body as Markdown, plain text or cleaned HTML. Payment happens inside the request: call the endpoint, receive HTTP 402 with the accepted terms, retry with a signed payment header. ## Endpoints - POST https://fetch.halowerk.com/extract — 0.001 USDC — Fetch one URL and return clean article Markdown without navigation, ads or cookie banners. - POST https://fetch.halowerk.com/metadata — 0.002 USDC — Return title, description, OpenGraph card, canonical URL, feeds, favicon and detected technologies for one URL. - POST https://fetch.halowerk.com/structured — 0.005 USDC — Fill a caller supplied JSON Schema from one web page and report source and confidence for every field. - POST https://fetch.halowerk.com/diff — 0.003 USDC (0.001 USDC for a baseline call) — Compare a page against its last stored state, or two supplied documents, and report only the content changes. - POST https://fetch.halowerk.com/batch/extract — 0.008 USDC — Extract up to ten URLs in one paid call. - POST https://fetch.halowerk.com/product — 0.005 USDC — Return the structured offer of one product page: identifiers, price, availability, shipping, variants, ratings, images and seller, each with its source. ## Structured extraction POST /structured takes your own JSON Schema and returns it filled. Send {"url": "...", "schema": {...}, "strict": true, "max_depth": 3}. schema.org JSON-LD, microdata and OpenGraph are mapped onto your schema first; only the fields those sources left open reach a language model. A value is written only when it occurs verbatim in the document or follows from it by calculation, so a field that is merely plausible stays empty and is named in unavailable_fields instead. Every filled field carries an entry in field_sources (jsonld, microdata, dom or model) and in confidence, which is what lets an agent tell a documented value from a guessed one. The result is validated against your schema with ajv. With strict=true a schema violation is an error and nothing is charged, with strict=false you receive the partial data together with the error list. ## Watching a page for changes POST /diff answers with the content changes only. Removed before comparing: timestamps, counters, session and CSRF values, ads, cookie notices, navigation, footers, shuffled ordering, cache busting parameters and rotating image filenames. Reported: text, prices, availability, headings, link targets, structured data, form fields and meta. Two ways to call it: {"url": "https://example.com/product", "since": "2026-08-01T00:00:00Z"} {"before": "…", "after": "…"} The first form compares against the state this service stored for that URL. If there is none, the current state becomes the baseline, the answer says baseline_created=true and the call costs 0.001 USDC instead of 0.003. Stored states older than 30 days are discarded and the answer says so. changed=false is a normal paid answer. Price and availability changes always carry significance=hoch. ## Discovery without payment - https://fetch.halowerk.com/openapi.json - https://fetch.halowerk.com/.well-known/x402 - https://fetch.halowerk.com/mcp (Model Context Protocol, tools/list needs no payment) - https://fetch.halowerk.com/pricing - https://fetch.halowerk.com/health ## Rules we follow - robots.txt of the target origin is respected; a disallowed path is refused and not charged. - Paywalls and bot walls are not bypassed. A 401, 402 or 403 from the origin ends the request. - Structured extraction never invents a value. Ungrounded fields stay empty rather than being guessed. - Cached copies expire after at most 24 hours, structured results after six. - Private and link local address ranges are refused, so this API cannot be used to reach internal hosts. ## Rules for product data - POST /product parses prices. It never calculates and never converts them. A discount percentage that the page does not state is not returned, and no price is translated into another currency. - The decimal separator is resolved from the page locale and the choice is reported in number_format. - Every field carries a field_evidence entry with source, selector and the raw string as it stood on the page. - Sources are read in this order: schema.org Product JSON-LD, microdata, OpenGraph product, DOM patterns, visible text. The first trustworthy source wins. - A URL that is not a product page answers is_product=false with a reason and is charged, because that answer is the service. Login and region walls are reported, not circumvented. - Product answers are cached for at most 30 minutes, because prices move. ## Operator Die Netzhandwerker, IT-Manufaktur für Digitales und Sensorik. https://netzhandwerker.de