{"description":"Web reading for AI agents: readable text and site maps without a browser, browser rendering when JavaScript is required, and raw HTTP for everything else.","name":"readfetch.com","protocolVersion":"2025-06-18","skill":"https://readfetch.com/SKILL.md","tools":[{"annotations":{"openWorldHint":true,"readOnlyHint":true,"title":"/v1/text"},"description":"Fetch a public URL and return its main readable content as Markdown or plain text, plus title, author, published date and site name. Strips navigation, ads and boilerplate. No JavaScript rendering, so it costs a fraction of a browser scrape; use /v1/scrape when the content only appears after JavaScript runs.","free":false,"inputSchema":{"properties":{"accept_language":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Accept-Language header, e.g. 'de-DE,de;q=0.9'. Defaults to en-US.","title":"Accept Language"},"egress":{"description":"Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.","title":"Egress","type":"string"},"egress_fallback":{"description":"Pool to retry through once when the first attempt is refused (bot check, wall, empty extraction, origin 403/429/5xx); must differ from `egress`. Absent keeps one exit for the whole call.","title":"Egress Fallback","type":"string"},"format":{"default":"markdown","description":"Output flavour: Markdown keeps headings, lists and tables.","enum":["markdown","text"],"title":"Format","type":"string"},"max_bytes":{"default":5000000,"description":"Abort if the response body exceeds this many bytes.","maximum":20000000,"minimum":1024,"title":"Max Bytes","type":"integer"},"timeout_s":{"default":30,"description":"Total budget for the whole call in seconds: DNS, redirects, the render fallback and any retry share it.","maximum":60,"minimum":1,"title":"Timeout S","type":"number"},"url":{"description":"Public http(s) URL to read.","format":"uri","maxLength":2083,"minLength":1,"title":"Url","type":"string"}},"required":["url"],"title":"TextRequest","type":"object"},"method":"POST","name":"readfetch_text","path":"/v1/text","price_usd":0.005},{"annotations":{"openWorldHint":true,"readOnlyHint":true,"title":"/v1/map"},"description":"Discover a site's crawlable surface without crawling it: parse robots.txt allow/disallow rules, collect URLs from sitemap.xml and sitemap indexes, find RSS, Atom and JSON feeds, and count internal and external links on the homepage. Use the returned URLs to plan a /v1/scrape or /v1/crawl.","free":false,"inputSchema":{"properties":{"egress":{"description":"Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.","title":"Egress","type":"string"},"egress_fallback":{"description":"Pool to retry through once when the first attempt is refused (bot check, wall, empty extraction, origin 403/429/5xx); must differ from `egress`. Absent keeps one exit for the whole call.","title":"Egress Fallback","type":"string"},"limit":{"default":200,"description":"Maximum number of URLs to return (1-1000).","maximum":1000,"minimum":1,"title":"Limit","type":"integer"},"max_bytes":{"default":5000000,"description":"Abort if any single document exceeds this many bytes.","maximum":20000000,"minimum":1024,"title":"Max Bytes","type":"integer"},"timeout_s":{"default":60,"description":"Total budget for the whole call in seconds; every sitemap fetch and the browser fallback share it. 95 s is the edge ceiling (Cloudflare closes at 100 s).","maximum":95,"minimum":1,"title":"Timeout S","type":"number"},"url":{"description":"Public http(s) URL of the site to map.","format":"uri","maxLength":2083,"minLength":1,"title":"Url","type":"string"}},"required":["url"],"title":"MapRequest","type":"object"},"method":"POST","name":"readfetch_map","path":"/v1/map","price_usd":0.005},{"annotations":{"openWorldHint":true,"readOnlyHint":true,"title":"/v1/scrape"},"description":"JavaScript rendering and web scraping for agents: load a public URL in a real browser session, optionally scroll, wait for selectors, run JS, set headers, cookies or auth, and return Markdown, text or HTML with the page's links.","free":false,"inputSchema":{"$defs":{"Auth":{"description":"Agent-friendly authentication: cookie, bearer token, or basic auth.","properties":{"cookies":{"anyOf":[{"items":{"$ref":"#/$defs/Cookie"},"type":"array"},{"type":"null"}],"default":null,"title":"Cookies"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Password"},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Token"},"type":{"enum":["cookie","bearer","basic"],"title":"Type","type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Username"}},"required":["type"],"title":"Auth","type":"object"},"Cookie":{"properties":{"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Domain"},"name":{"title":"Name","type":"string"},"path":{"default":"/","title":"Path","type":"string"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Url"},"value":{"title":"Value","type":"string"}},"required":["name","value"],"title":"Cookie","type":"object"},"ScrapeOptions":{"description":"Advanced browser/interaction controls (the `advanced` object).","properties":{"cookies":{"anyOf":[{"items":{"$ref":"#/$defs/Cookie"},"type":"array"},{"type":"null"}],"default":null,"title":"Cookies"},"delay_before_return_ms":{"default":0,"maximum":60000,"minimum":0,"title":"Delay Before Return Ms","type":"integer"},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"default":null,"title":"Headers"},"include_html":{"default":false,"title":"Include Html","type":"boolean"},"include_links":{"default":false,"title":"Include Links","type":"boolean"},"js_code":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Js Code"},"locale":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Browser locale, e.g. 'en-US'. Sets Accept-Language inside the render.","title":"Locale"},"max_scroll_steps":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"title":"Max Scroll Steps"},"scan_full_page":{"default":false,"title":"Scan Full Page","type":"boolean"},"sticky_session":{"default":false,"description":"Pin one outbound address for the whole call instead of one per connection. A render already runs under one egress session, so the page load never spreads across exits; accepted for compatibility with callers that set it.","title":"Sticky Session","type":"boolean"},"timezone_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Browser timezone, e.g. 'America/New_York'.","title":"Timezone Id"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"User Agent"},"wait_for":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Wait For"},"wait_for_timeout_ms":{"default":10000,"maximum":120000,"minimum":0,"title":"Wait For Timeout Ms","type":"integer"}},"title":"ScrapeOptions","type":"object"}},"properties":{"advanced":{"anyOf":[{"$ref":"#/$defs/ScrapeOptions"},{"type":"null"}],"default":null},"auth":{"anyOf":[{"$ref":"#/$defs/Auth"},{"type":"null"}],"default":null},"egress":{"description":"Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.","title":"Egress","type":"string"},"egress_fallback":{"description":"Pool to retry through once when the first attempt is refused (bot check, wall, empty extraction, origin 403/429/5xx); must differ from `egress`. Absent keeps one exit for the whole call.","title":"Egress Fallback","type":"string"},"format":{"default":"markdown","enum":["markdown","text","html"],"title":"Format","type":"string"},"fresh":{"default":false,"title":"Fresh","type":"boolean"},"mode":{"default":"render","enum":["fast","render","full"],"title":"Mode","type":"string"},"options":{"anyOf":[{"$ref":"#/$defs/ScrapeOptions"},{"type":"null"}],"default":null,"deprecated":true},"url":{"format":"uri","maxLength":2083,"minLength":1,"title":"Url","type":"string"}},"required":["url"],"title":"ScrapeRequest","type":"object"},"method":"POST","name":"readfetch_scrape","path":"/v1/scrape","price_usd":0.005},{"annotations":{"openWorldHint":true,"readOnlyHint":true,"title":"/v1/scrape/residential"},"description":"Identical request and response to /v1/scrape, but the render leaves through a residential address instead of the datacentre. For targets that block by IP reputation (DataDome, PerimeterX, Cloudflare, AWS WAF). One attempt, no retries: residential bandwidth is the cost, and four times the scrape price is what it takes to cover it honestly.","free":false,"inputSchema":{"$defs":{"Auth":{"description":"Agent-friendly authentication: cookie, bearer token, or basic auth.","properties":{"cookies":{"anyOf":[{"items":{"$ref":"#/$defs/Cookie"},"type":"array"},{"type":"null"}],"default":null,"title":"Cookies"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Password"},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Token"},"type":{"enum":["cookie","bearer","basic"],"title":"Type","type":"string"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Username"}},"required":["type"],"title":"Auth","type":"object"},"Cookie":{"properties":{"domain":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Domain"},"name":{"title":"Name","type":"string"},"path":{"default":"/","title":"Path","type":"string"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Url"},"value":{"title":"Value","type":"string"}},"required":["name","value"],"title":"Cookie","type":"object"},"ScrapeOptions":{"description":"Advanced browser/interaction controls (the `advanced` object).","properties":{"cookies":{"anyOf":[{"items":{"$ref":"#/$defs/Cookie"},"type":"array"},{"type":"null"}],"default":null,"title":"Cookies"},"delay_before_return_ms":{"default":0,"maximum":60000,"minimum":0,"title":"Delay Before Return Ms","type":"integer"},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"default":null,"title":"Headers"},"include_html":{"default":false,"title":"Include Html","type":"boolean"},"include_links":{"default":false,"title":"Include Links","type":"boolean"},"js_code":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null,"title":"Js Code"},"locale":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Browser locale, e.g. 'en-US'. Sets Accept-Language inside the render.","title":"Locale"},"max_scroll_steps":{"anyOf":[{"maximum":200,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"title":"Max Scroll Steps"},"scan_full_page":{"default":false,"title":"Scan Full Page","type":"boolean"},"sticky_session":{"default":false,"description":"Pin one outbound address for the whole call instead of one per connection. A render already runs under one egress session, so the page load never spreads across exits; accepted for compatibility with callers that set it.","title":"Sticky Session","type":"boolean"},"timezone_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Browser timezone, e.g. 'America/New_York'.","title":"Timezone Id"},"user_agent":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"User Agent"},"wait_for":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Wait For"},"wait_for_timeout_ms":{"default":10000,"maximum":120000,"minimum":0,"title":"Wait For Timeout Ms","type":"integer"}},"title":"ScrapeOptions","type":"object"}},"properties":{"advanced":{"anyOf":[{"$ref":"#/$defs/ScrapeOptions"},{"type":"null"}],"default":null},"auth":{"anyOf":[{"$ref":"#/$defs/Auth"},{"type":"null"}],"default":null},"format":{"default":"markdown","enum":["markdown","text","html"],"title":"Format","type":"string"},"fresh":{"default":false,"title":"Fresh","type":"boolean"},"mode":{"default":"render","enum":["fast","render","full"],"title":"Mode","type":"string"},"options":{"anyOf":[{"$ref":"#/$defs/ScrapeOptions"},{"type":"null"}],"default":null,"deprecated":true},"url":{"format":"uri","maxLength":2083,"minLength":1,"title":"Url","type":"string"}},"required":["url"],"title":"ScrapeRequest","type":"object"},"method":"POST","name":"readfetch_residential","path":"/v1/scrape/residential","price_usd":0.02},{"annotations":{"openWorldHint":true,"readOnlyHint":true,"title":"/v1/fetch"},"description":"Send an arbitrary HTTP request (GET, POST, PUT, PATCH, DELETE, HEAD) and return the response with status, headers and body, as text or base64. Intended for APIs, GraphQL, PDFs, byte ranges and large payloads where a browser is not needed.","free":false,"inputSchema":{"properties":{"binary":{"default":false,"title":"Binary","type":"boolean"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"title":"Body"},"egress":{"description":"Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.","title":"Egress","type":"string"},"egress_fallback":{"description":"Pool to retry through once when the first attempt is refused (bot check, wall, empty extraction, origin 403/429/5xx); must differ from `egress`. Absent keeps one exit for the whole call.","title":"Egress Fallback","type":"string"},"follow_redirects":{"default":true,"title":"Follow Redirects","type":"boolean"},"headers":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"default":null,"title":"Headers"},"json_body":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"title":"Json Body"},"max_bytes":{"default":10000000,"maximum":50000000,"minimum":1024,"title":"Max Bytes","type":"integer"},"method":{"default":"GET","enum":["GET","POST","PUT","PATCH","DELETE","HEAD"],"title":"Method","type":"string"},"timeout_s":{"default":95,"description":"Total budget for the whole call in seconds, redirect hops included.","maximum":95,"minimum":1,"title":"Timeout S","type":"number"},"url":{"format":"uri","maxLength":2083,"minLength":1,"title":"Url","type":"string"}},"required":["url"],"title":"FetchRequest","type":"object"},"method":"POST","name":"readfetch_fetch","path":"/v1/fetch","price_usd":0.003},{"annotations":{"openWorldHint":true,"readOnlyHint":true,"title":"/v1/batch"},"description":"Up to 50 URLs in one call and one payment. Results in input order; an undelivered page is not billed and is credited.","free":false,"inputSchema":{"properties":{"accept_language":{"default":null,"type":["string","null"]},"egress":{"description":"Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.","title":"Egress","type":"string"},"format":{"default":"markdown","enum":["markdown","text"],"type":"string"},"fresh":{"default":false,"type":"boolean"},"pipeline":{"default":"text","description":"text = HTTP-first; render needs the browser tier.","enum":["text","render"],"type":"string"},"timeout_s":{"default":95,"description":"Total budget for the whole batch in seconds; every item shares it and no item restarts it.","maximum":95,"minimum":1,"type":"number"},"urls":{"description":"URLs to read, deduped before quoting.","items":{"format":"uri","type":"string"},"maxItems":50,"minItems":1,"type":"array"}},"required":["urls"],"type":"object"},"method":"POST","name":"readfetch_batch","path":"/v1/batch","price_usd":0.0015},{"annotations":{"openWorldHint":true,"readOnlyHint":true,"title":"/v1/pdf"},"description":"Documents, not pages: page text plus one Markdown body, priced per document.","free":false,"inputSchema":{"anyOf":[{"required":["url"]},{"required":["content_base64"]}],"properties":{"content_base64":{"description":"Inline PDF, up to 20 MB.","type":"string"},"egress":{"description":"Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.","title":"Egress","type":"string"},"filename":{"type":"string"},"max_pages":{"default":50,"maximum":200,"minimum":1,"type":"number"},"url":{"description":"PDF URL, fetched through egress.","example":"https://example.com/paper.pdf","format":"uri","type":"string"}},"type":"object"},"method":"POST","name":"readfetch_pdf","path":"/v1/pdf","price_usd":0.005},{"annotations":{"openWorldHint":true,"readOnlyHint":true,"title":"/v1/section"},"description":"One heading or one selector instead of the whole page. A heading that is not found returns 200, an empty body and the list of headings that do exist.","free":false,"inputSchema":{"oneOf":[{"required":["heading"]},{"required":["selector"]}],"properties":{"egress":{"description":"Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.","title":"Egress","type":"string"},"format":{"default":"markdown","enum":["markdown","text"],"type":"string"},"heading":{"description":"Case-insensitive, whitespace-normalised.","example":"Introduction","type":["string","null"]},"max_chars":{"default":8000,"maximum":20000,"minimum":100,"type":"number"},"mode":{"default":"render","enum":["fast","render"],"type":"string"},"selector":{"description":"CSS selector; up to 20 matches concatenated.","type":["string","null"]},"url":{"format":"uri","type":"string"}},"required":["url"],"type":"object"},"method":"POST","name":"readfetch_section","path":"/v1/section","price_usd":0.003},{"annotations":{"openWorldHint":true,"readOnlyHint":true,"title":"/v1/diff"},"description":"Stateless change detection: send the hash you hold, get changed/unchanged and a bounded diff. A no-change answer is billable.","free":false,"inputSchema":{"properties":{"egress":{"description":"Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.","title":"Egress","type":"string"},"format":{"default":"text","enum":["text","markdown"],"type":"string"},"previous_content":{"description":"Previous text, for an added/removed diff.","type":["string","null"]},"previous_hash":{"description":"sha256:... from a previous call.","type":["string","null"]},"timeout_s":{"maximum":120,"minimum":1,"type":"number"},"url":{"format":"uri","type":"string"}},"required":["url"],"type":"object"},"method":"POST","name":"readfetch_diff","path":"/v1/diff","price_usd":0.003},{"annotations":{"openWorldHint":true,"readOnlyHint":true,"title":"/v1/screenshot"},"description":"PNG or JPEG of a rendered page: viewport, full page, or one element.","free":false,"inputSchema":{"properties":{"delay_ms":{"maximum":30000,"minimum":0,"type":"number"},"egress":{"description":"Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.","title":"Egress","type":"string"},"format":{"default":"png","enum":["png","jpeg"],"type":"string"},"full_page":{"default":true,"type":"boolean"},"height":{"maximum":2160,"minimum":1,"type":"number"},"mode":{"default":"render","enum":["fast","render","full"],"type":"string"},"selector":{"description":"Capture one element.","type":["string","null"]},"url":{"format":"uri","type":"string"},"width":{"maximum":3840,"minimum":1,"type":"number"}},"required":["url"],"type":"object"},"method":"POST","name":"readfetch_screenshot","path":"/v1/screenshot","price_usd":0.003},{"annotations":{"openWorldHint":true,"readOnlyHint":true,"title":"/v1/search"},"description":"Web search without a search subscription, returning titles, URLs and snippets.","free":false,"inputSchema":{"properties":{"egress":{"description":"Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.","title":"Egress","type":"string"},"lang":{"description":"e.g. en, de-DE","type":["string","null"]},"limit":{"default":5,"maximum":20,"minimum":1,"type":"number"},"query":{"minLength":1,"type":"string"},"tbs":{"description":"Time range.","enum":["h","d","w","m","y",null],"type":["string","null"]}},"required":["query"],"type":"object"},"method":"POST","name":"readfetch_search","path":"/v1/search","price_usd":0.005},{"annotations":{"openWorldHint":true,"readOnlyHint":true,"title":"/v1/crawl"},"description":"Bounded async crawl with a job id, a page cap quoted up front, and per-page Markdown.","free":false,"inputSchema":{"properties":{"egress":{"description":"Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.","title":"Egress","type":"string"},"exclude":{"items":{"type":"string"},"type":"array"},"include":{"description":"Path prefixes; * suffix wildcard.","items":{"type":"string"},"type":"array"},"max_depth":{"default":2,"maximum":3,"minimum":1,"type":"number"},"max_pages":{"default":20,"maximum":100,"minimum":1,"type":"number"},"url":{"format":"uri","type":"string"}},"required":["url"],"type":"object"},"method":"POST","name":"readfetch_crawl","path":"/v1/crawl","price_usd":0.003},{"annotations":{"openWorldHint":true,"readOnlyHint":true,"title":"/v1/probe"},"description":"Metadata before spending: status, content type, size, title, language and whether a bot wall is waiting. No page body, no browser, always free.","free":true,"inputSchema":{"properties":{"accept_language":{"default":null,"description":"Accept-Language header, e.g. 'de-DE,de;q=0.9'. Defaults to en-US.","type":["string","null"]},"egress":{"description":"Exit to leave through: `direct` (this service's own datacentre egress) or `residential` (a residential address pool, for targets that refuse datacentre addresses). Omit to use the default route.","title":"Egress","type":"string"},"timeout_s":{"default":10,"description":"Total budget for the whole call in seconds.","maximum":60,"minimum":1,"type":"number"},"url":{"description":"Public http(s) URL to inspect.","format":"uri","maxLength":2083,"minLength":1,"type":"string"}},"required":["url"],"type":"object"},"method":"POST","name":"readfetch_probe","path":"/v1/probe","price_usd":0.0}],"transport":{"type":"streamable-http","url":"https://readfetch.com/mcp"},"version":"0.1.0"}