1. readfetch
  2. choose
  3. Core
  4. /v1/text

Data · Core

POST/v1/text

Article text and metadata, boilerplate stripped. No browser by default; falls back to one when a page blocks plain HTTP.

  • $0.005
  • markdown
  • metadata
  • no browser

What it does

One paragraph, no pitch.

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.

Price

Quoted by the 402 before anything runs.

  • $0.005per call
  • 30 s default, 60 s maximumwhole-call budget
  • billedonly when content is delivered
  • no keythe payment is the credential

x402 settlement is live on eip155:8453: sign a USDC transfer and retry with PAYMENT-SIGNATURE.

When to call it

Cheapest endpoint that answers the question, first.

Call it when the sentence above is the whole job. Its neighbours solve the same URL with a different trade-off — a browser instead of plain HTTP, a site instead of one page, one section instead of a document. /choose walks the decision in thirteen routes, cheapest first, browser last.

Not sure the page is worth paying for at all? /v1/probe is free and returns the status, content type, size, title, language and whether a bot wall is waiting — no body.

Request fields

JSON body. Send this to https://readfetch.com/v1/text.

FieldTypeDefaultWhat it does
url requiredstring—Public http(s) URL to read.
egressstring—Egress pool to leave through: `direct` (the default route, no proxy) or any pool the operator configured, e.g. `residential` (the home exit) or `local`. Omit to route by host rules.
egress_fallbackstring—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.
formatstringmarkdownOutput flavour: Markdown keeps headings, lists and tables.
accept_languagestring—Accept-Language header, e.g. 'de-DE,de;q=0.9'. Defaults to en-US.
timeout_snumber30Total budget for the whole call in seconds: DNS, redirects, the render fallback and any retry share it.
max_bytesinteger5000000Abort if the response body exceeds this many bytes.

Make the call

Unpaid, this answers 402 with the quote. Sign accepts[0] and resend with PAYMENT-SIGNATURE.

curl
curl -s https://readfetch.com/v1/text -H 'content-type: application/json' -d '{"url":"https://example.com"}'
json body
{
  "url": "https://example.com"
}

Response

Fields shown are the ones a caller branches on.

200 ok
{
  "format": "markdown",
  "metadata": {
    "author": "A. Writer",
    "date": "2026-04-01",
    "sitename": "Example"
  },
  "size": 48213,
  "status": "success",
  "status_code": 200,
  "text": "# Post title\n\nBody as Markdown...",
  "title": "Post title",
  "url": "https://example.com/blog/post"
}

Limits

Requests are JSON, 1 MiB maximum. Redirects are re-validated at every hop and capped at 5; the final URL is reported. 30 s default, 60 s maximum is the whole-call budget — DNS, connect, redirects, retries and any render share it, and no step starts a fresh clock.

Failures come back as {"error": "…", "hint": "…"} with a status to branch on: 402 for the quote, 429 with Retry-After, 502 and 504 for the upstream. /docs lists the shapes.

Billing

Settled after the work, only when something was delivered.

$0.005 per delivered call. A response with billed: false settles nothing and names the next call to try.

billed: false means nothing settled: a bot wall, an empty extraction, an unsupported type or a transport failure. The hint on that response names the next call to try.

Every settlement carries a signed RECEIPT bound to the transaction. If a paid call delivered nothing, a claim issues a single-use credit for it — the rail cannot refund.