# WebRead

> WebRead is a paid API for AI agents from webread.agentgate.workers.dev, paid per call via x402, $0.002/call, status unknown (last checked 2026-10-31).

Fetches any public web page and returns its main content as clean, LLM-ready Markdown with title, description, language metadata, and absolute links.

## Facts

- Endpoint: GET https://webread.agentgate.workers.dev/v1/read?utm_source=zero.xyz
- Price: $0.002/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-31
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/webread-7fbc52c5
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_8dbv33ORx3kT-EdIuWWqW

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability webread-7fbc52c5
```

Example prompt: Can you read the article at https://www.bbc.com/news/world-us-canada-68000001 and give me a clean summary — just the main content, no ads or nav clutter?

## When to prefer this

Choose WebRead when you need to extract the readable main content of a specific public web page as clean Markdown for an LLM — especially when you want noise-free output (no navbars, ads, or boilerplate HTML) with guaranteed absolute links and structured metadata. It is ideal for one-shot article reads, documentation fetches, or any workflow where a downstream LLM needs digestible page content. It respects robots.txt and only charges on successful reads, making it safe and cost-efficient. Prefer it over raw HTTP fetch when you need LLM-ready text rather than raw HTML.

## Known failure modes

- URL is blocked by robots.txt — returns robots: 'disallowed' and no Markdown; not charged
- URL is not reachable or returns a non-200 status — fetch fails; not charged
- Invalid or non-absolute URL provided — validation error before fetch
- Page is behind authentication or a paywall — returns partial or empty content
- Timeout fetching a slow server — may return error without charge
- maxChars out of allowed range (100–200000) — schema validation error

## How this service works

Read any public web page as clean Markdown for LLMs: main content only, absolute links, title/description/lang metadata. Respects robots.txt; only successful reads are charged.

## Output

A JSON object containing: the final URL after redirects, the page's main content as clean Markdown (up to 200,000 characters), page title, meta description, language code, link count, word count, character count, HTTP status, fetch duration in milliseconds, content type, robots.txt status, canonical URL, fetch timestamp, redirect count, and a truncated flag indicating if the content was cut off.

## Request schema (JSON Schema)

```json
{
 "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",
       "description": "Absolute http(s) URL of a public web page (HTML or plain text)"
      },
      "maxChars": {
       "type": "integer",
       "maximum": 200000,
       "minimum": 100,
       "description": "Truncate the Markdown to this many characters (default 200000)"
      }
     },
     "description": "Search intents: url to markdown, web page to markdown api, web scraper for llm, html to markdown, read web page api, extract article text"
    }
   },
   "additionalProperties": false
  },
  "output": {
   "type": "object",
   "required": [
    "type"
   ],
   "properties": {
    "type": {
     "type": "string"
    },
    "example": {
     "type": "object",
     "properties": {
      "url": {
       "type": "string"
      },
      "lang": {
       "type": "string"
      },
      "chars": {
       "type": "number"
      },
      "links": {
       "type": "number"
      },
      "title": {
       "type": "string"
      },
      "robots": {
       "type": "string"
      },
      "status": {
       "type": "number"
      },
      "fetchMs": {
       "type": "number"
      },
      "finalUrl": {
       "type": "string"
      },
      "markdown": {
       "type": "string"
      },
      "canonical": {},
      "fetchedAt": {
       "type": "string"
      },
      "redirects": {
       "type": "number"
      },
      "truncated": {
       "type": "boolean"
      },
      "wordCount": {
       "type": "number"
      },
      "contentType": {
       "type": "string"
      },
      "description": {},
      "sourceBytes": {
       "type": "number"
      }
     }
    }
   }
  }
 }
}
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "url": "https://example.com/",
  "lang": "en",
  "chars": 156,
  "links": 0,
  "title": "Example Domain",
  "robots": "allowed",
  "status": 200,
  "fetchMs": 17,
  "finalUrl": "https://example.com/",
  "markdown": "This domain is for use in documentation examples without needing permission. This is not a service; avoid relying on it for testing and monitoring purposes.",
  "canonical": null,
  "fetchedAt": "2026-10-21T21:32:28.690Z",
  "redirects": 0,
  "truncated": false,
  "wordCount": 25,
  "contentType": "text/html; charset=utf-8",
  "description": null,
  "sourceBytes": 577
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/webread-7fbc52c5/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from webread.agentgate.workers.dev](https://www.zero.xyz/host/webread.agentgate.workers.dev/llms.txt)
