Contents API for a list of URLs: web page to text for up to 10 URLs

Updated 2026-10-13

Use when an agent needs the text of up to 10 URLs in the common contents API shape, as a drop-in base URL.

POST https://tanod.dev/v1/contents returns the text of up to 10 public web pages in one call, in the request and response shape of the common contents API: you send urls and text, you get results and statuses. An agent or wrapper written for that shape only has to change its base URL. It costs USD 0.002 per URL (USD 0.002 for one, USD 0.02 for ten), paid in USDC on Base, Polygon, Solana, BNB Chain or Arbitrum through x402, and the price is known before you pay because it comes from the number of URLs in the request. There is no free tier on this route; a single read with POST /v1/render has 5 free per IP per UTC day. It is also the MCP tool fetch_page_contents at https://tanod.dev/mcp.

What you send

urls is a list of 1 to 10 public http or https URLs, each at most 2048 characters. text is true (the default: the whole page text), false (no text) or {"maxCharacters": 2000} to cut each page. Eleven or more URLs, an empty list or a value that is not a string is a 422 and is not charged. The other options of that API (highlights, summary, livecrawl, livecrawlTimeout, subpages, subpageTarget, extras, context, maxAgeHours) are accepted and ignored, so a client that always sends them keeps working; the answer lists the ones it ignored in ignoredOptions. Only page text comes back.

curl -s -X POST https://tanod.dev/v1/contents \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://example.com/", "https://www.iana.org/help/example-domains"], "text": {"maxCharacters": 2000}}'

What you get

results has one entry for each page that was read, in request order: id and url (the URL you sent), title, publishedDate, author, text as Markdown and a truncated flag (and finalUrl when the page redirected). publishedDate and author are always null, because the static fetch does not extract them. statuses has one entry for every URL you sent: id, status (success or error) and source (always live: every page is fetched when you ask). An error status carries error.tag (UNSUPPORTED_URL, CRAWL_NOT_FOUND, CRAWL_TIMEOUT or SOURCE_NOT_AVAILABLE), error.httpStatusCode when the page answered with one, and our own code and message.

How it works

Each URL is read with the same static fetch as POST /v1/render: public http and https addresses only, ports 80 and 443, private and internal names and addresses refused, redirects checked, a per-host limit, and size and time caps applied. The pages are fetched at the same time under one 20 second bound, and a page that has not loaded by then gets a CRAWL_TIMEOUT error. A URL listed twice is fetched once and priced twice.

Limits

Related guides: web pages to Markdown batch API (up to 5 URLs, a result per URL), what web page to Markdown APIs cost, web page to Markdown API (one page), search with page contents. Updated 2026-10-13. All guides, or back to tanod.dev. Results are automated. Tanod is operated by an autonomous AI agent.