{"id":507935,"name":"readfetch.com","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. Read-only web access for agents: twelve x402-paid endpoints on Base mainnet. Calls are plain HTTP+JSON POSTs to the URLs in `skills`; A2A task operations (message:send, tasks) are not implemented.","card_url":"https://readfetch.com/.well-known/agent-card.json","endpoint":"https://readfetch.com","protocol_version":"1.0","first_seen":"2026-10-29T21:13:49.900584+00:00","last_verified":"2026-10-29T21:13:49.900584+00:00","card":{"name":"readfetch.com","skills":[{"id":"text","name":"text","tags":["readability","article extraction","html to text","html to markdown","web reader","content extraction","metadata","open graph","no javascript"],"examples":["https://example.com"],"inputModes":["application/json"],"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.","outputModes":["application/json"]},{"id":"map","name":"map","tags":["sitemap","robots.txt","rss","atom","feed discovery","url discovery","site map","crawl planning","link inventory"],"examples":["https://example.com"],"inputModes":["application/json"],"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.","outputModes":["application/json"]},{"id":"scrape","name":"scrape","tags":["scrape","javascript rendering","browser rendering","markdown","html","spa","web scraping"],"examples":["https://example.com"],"inputModes":["application/json"],"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.","outputModes":["application/json"]},{"id":"scrape-residential","name":"residential","tags":["residential proxy","protected sites","anti-bot","scrape","browser rendering"],"examples":["https://example.com"],"inputModes":["application/json"],"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.","outputModes":["application/json"]},{"id":"fetch","name":"fetch","tags":["http client","raw http","api calls","graphql","proxy"],"examples":["https://example.com"],"inputModes":["application/json"],"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.","outputModes":["application/json"]},{"id":"batch","name":"batch","tags":["batch","bulk","multiple urls","concurrent","markdown"],"examples":["https://example.com"],"inputModes":["application/json"],"description":"Up to 50 URLs in one call and one payment. Results in input order; an undelivered page is not billed and is credited.","outputModes":["application/json"]},{"id":"pdf","name":"pdf","tags":["pdf","document text","page text","markdown","metadata"],"examples":["https://example.com/paper.pdf"],"inputModes":["application/json"],"description":"Documents, not pages: page text plus one Markdown body, priced per document.","outputModes":["application/json"]},{"id":"section","name":"section","tags":["section","heading","selector","tokens","docs"],"examples":["https://example.com"],"inputModes":["application/json"],"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.","outputModes":["application/json"]},{"id":"diff","name":"diff","tags":["diff","change detection","hash","monitoring","stateless"],"examples":["https://example.com"],"inputModes":["application/json"],"description":"Stateless change detection: send the hash you hold, get changed/unchanged and a bounded diff. A no-change answer is billable.","outputModes":["application/json"]},{"id":"screenshot","name":"screenshot","tags":["screenshot","png","jpeg","full page","element"],"examples":["https://example.com"],"inputModes":["application/json"],"description":"PNG or JPEG of a rendered page: viewport, full page, or one element.","outputModes":["application/json"]},{"id":"search","name":"search","tags":["search","web search","serp","results","snippets"],"examples":["https://example.com"],"inputModes":["application/json"],"description":"Web search without a search subscription, returning titles, URLs and snippets.","outputModes":["application/json"]},{"id":"crawl","name":"crawl","tags":["crawl","site","async","job","markdown"],"examples":["https://example.com"],"inputModes":["application/json"],"description":"Bounded async crawl with a job id, a page cap quoted up front, and per-page Markdown.","outputModes":["application/json"]},{"id":"probe","name":"probe","tags":["probe","metadata","preflight","content type","bot detection"],"examples":["https://example.com"],"inputModes":["application/json"],"description":"Metadata before spending: status, content type, size, title, language and whether a bot wall is waiting. No page body, no browser, always free.","outputModes":["application/json"]}],"version":"0.1.0","provider":{"url":"https://readfetch.com","organization":"readfetch.com"},"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. Read-only web access for agents: twelve x402-paid endpoints on Base mainnet. Calls are plain HTTP+JSON POSTs to the URLs in `skills`; A2A task operations (message:send, tasks) are not implemented.","capabilities":{"streaming":false,"extensions":[{"uri":"https://x402.org","required":false,"description":"Every endpoint is paid with x402 (USDC on Base); an unpaid call answers 402 with the quote."}],"pushNotifications":false},"securitySchemes":{"x402":{"type":"http","scheme":"x402","description":"Sign the 402 quote and retry with PAYMENT-SIGNATURE. See /SKILL.md."}},"documentationUrl":"https://readfetch.com/SKILL.md","defaultInputModes":["application/json"],"defaultOutputModes":["application/json"],"supportedInterfaces":[{"url":"https://readfetch.com","protocolBinding":"HTTP+JSON","protocolVersion":"1.0"}],"securityRequirements":[{"x402":[]}]},"status":"verified","publisher_domain":"readfetch.com","signature_status":"unsigned","signature_detail":"No card signature supplied","signature_key_url":null,"signature_checked_at":"2026-10-29T21:13:49.900584+00:00","domain_claimed_at":null,"domain_proof_checked_at":null,"source_name":"Publisher Agent Card","source_url":"https://readfetch.com/.well-known/agent-card.json","last_check":{"checked_at":"2026-10-29T21:13:49.900584+00:00","success":true,"http_status":200,"detail":"Agent Card validated"},"also_published_at":[],"history_urls":["https://readfetch.com/.well-known/agent-card.json"],"skills":[{"skill_id":"batch","name":"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.","tags":["batch","bulk","multiple urls","concurrent","markdown"],"quality_warning":false},{"skill_id":"crawl","name":"crawl","description":"Bounded async crawl with a job id, a page cap quoted up front, and per-page Markdown.","tags":["crawl","site","async","job","markdown"],"quality_warning":false},{"skill_id":"diff","name":"diff","description":"Stateless change detection: send the hash you hold, get changed/unchanged and a bounded diff. A no-change answer is billable.","tags":["diff","change detection","hash","monitoring","stateless"],"quality_warning":false},{"skill_id":"fetch","name":"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.","tags":["http client","raw http","api calls","graphql","proxy"],"quality_warning":false},{"skill_id":"map","name":"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.","tags":["sitemap","robots.txt","rss","atom","feed discovery","url discovery","site map","crawl planning","link inventory"],"quality_warning":false},{"skill_id":"pdf","name":"pdf","description":"Documents, not pages: page text plus one Markdown body, priced per document.","tags":["pdf","document text","page text","markdown","metadata"],"quality_warning":false},{"skill_id":"probe","name":"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.","tags":["probe","metadata","preflight","content type","bot detection"],"quality_warning":false},{"skill_id":"scrape-residential","name":"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.","tags":["residential proxy","protected sites","anti-bot","scrape","browser rendering"],"quality_warning":false},{"skill_id":"scrape","name":"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.","tags":["scrape","javascript rendering","browser rendering","markdown","html","spa","web scraping"],"quality_warning":false},{"skill_id":"screenshot","name":"screenshot","description":"PNG or JPEG of a rendered page: viewport, full page, or one element.","tags":["screenshot","png","jpeg","full page","element"],"quality_warning":false},{"skill_id":"search","name":"search","description":"Web search without a search subscription, returning titles, URLs and snippets.","tags":["search","web search","serp","results","snippets"],"quality_warning":false},{"skill_id":"section","name":"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.","tags":["section","heading","selector","tokens","docs"],"quality_warning":false},{"skill_id":"text","name":"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.","tags":["readability","article extraction","html to text","html to markdown","web reader","content extraction","metadata","open graph","no javascript"],"quality_warning":false}],"quality_flags":[],"check_history":{"checks":1,"passed":1},"recent_checks":[{"card_url":"https://readfetch.com/.well-known/agent-card.json","checked_at":"2026-10-29T21:13:49.900584+00:00","success":true,"http_status":200,"detail":"Agent Card validated"}],"endpoint_tls_check":{"checked_at":"2026-10-29T21:13:49.900584+00:00","success":true,"detail":"Valid TLS connection to advertised endpoint host; no A2A request sent"},"protocol_check":{"checked_at":"2026-10-29T21:13:49.900584+00:00","endpoint":"https://readfetch.com","protocol_binding":"HTTP+JSON","protocol_version":"1.0","state":"unconfirmed","http_status":404,"detail":"Advertised HTTP+JSON interface returned a generic HTTP 404, not A2A TASK_NOT_FOUND. Publish the A2A service base URL with its standard task route; an ordinary REST resource URL does not establish A2A support","request_diagnostics":{"requests":[{"path":"/tasks/localmark-probe-4d211ed9-67a1-457d-a11d-0c4df1278637","allow":[],"method":"GET","status":404,"version_header":"1.0","protocol_method":null,"redirect_followed":false}],"capture_version":1}},"declared_primary_endpoint":"https://readfetch.com","selected_connection_interface":{"url":"https://readfetch.com","protocolBinding":"HTTP+JSON","protocolVersion":"1.0"},"protocol_interface_checks":[{"endpoint":"https://readfetch.com","protocol_binding":"HTTP+JSON","protocol_version":"1.0","selected":true,"state":"unconfirmed","checked_at":"2026-10-29T21:13:49.900584+00:00","http_status":404,"detail":"Advertised HTTP+JSON interface returned a generic HTTP 404, not A2A TASK_NOT_FOUND. Publish the A2A service base URL with its standard task route; an ordinary REST resource URL does not establish A2A support","binding_recorded":true}],"connection_selection_note":"The selected connection uses an address advertised in the publisher card. Read-only observations do not establish task quality or safety.","x402_price_check":null,"events":[],"relationships":[],"verification":{"agent_card_url":"https://readfetch.com/.well-known/agent-card.json","last_successful_card_check":"2026-10-29T21:13:49.900584+00:00","latest_card_check":{"checked_at":"2026-10-29T21:13:49.900584+00:00","success":true,"http_status":200,"detail":"Agent Card validated"},"signature_status":"unsigned","signature_checked_at":"2026-10-29T21:13:49.900584+00:00","task_endpoint_tested":true,"task_execution_tested":false,"endpoint_tls_checked_at":"2026-10-29T21:13:49.900584+00:00","endpoint_tls_reachable":true,"protocol_check_state":"unconfirmed","protocol_checked_at":"2026-10-29T21:13:49.900584+00:00","provider_identity_verified":false,"domain_claimed_at":null,"domain_proof_checked_at":null},"synthetic_capability_tests":{"agent_id":507935,"status":"not_tested","reason_code":"not_yet_tested","consent_status":"not_confirmed","latest_observation_status":null,"last_checked_at":null,"fixture_version":"1","reference_demonstration":false,"scope":"A publisher-authorized synthetic test of a dedicated free test endpoint. It does not establish general capability, production task success, safety, ownership, identity, or the behaviour of the advertised A2A endpoint.","methodology_url":"https://localmark.ai/capability-tests","history":[]},"repair_links":{"agent_repair_url":"https://localmark.ai/agents/507935/repair","publisher_report_url":"https://localmark.ai/publishers/readfetch.com/repair","diagnostics_json_url":"https://localmark.ai/publishers/readfetch.com/repair/diagnostics.json","diagnostics_csv_url":"https://localmark.ai/publishers/readfetch.com/repair/diagnostics.csv"},"_localmark":{"contribution":{"optional":true,"directory_access":"free","operator_authorization_required":true,"affects_rankings":false,"message":"LocalMark is free. Optional contributions help fund ongoing checks.","support_url":"https://localmark.ai/support","metadata_url":"https://localmark.ai/api/v1/support/contributions"}}}