Skip to content

Fetch parameters

Everything tunable about a fetch rides in the request’s options block. The block itself, and the one-line summary of each option, are on Parameters & Configuration; this page is what each one does and where every field in the response came from.

Fetch tiers are cumulative in the same way. The page body’s wire key is content on every result.

Tier Adds
minimalist content, content_format, canonical_url, title, http_status, warning, provider, cache_state, request_id, latency_ms
default js_rendered, pdf_mode, content_length, content_sha256, description
extended raw_html, html, chunks, screenshot, page_count, content_type, summary, language, author, publish_date, favicon, thumbnail, links, images, metadata, provider_chain, usage
max media, transcript, excerpt, structured, subpages, enrichments

The Python SDK’s fetch() does not expose tier yet — send it in options on a direct POST /v1/fetch call until it does.

Only the page body, title and the failure signal come from all four providers; everything else is best-effort, and a capability_gap warning says which nulls were structural. A 404, a paywall or an empty JS-only page is the target’s answer and comes back as a per-URL diagnostic, not a failed request.

One vocabulary, whoever answered. The chain fails over, so the same fetch can be answered by a different engine tomorrow — these are the raw fields behind each normalized one, per provider.

Five fields never come from a provider at all and are omitted below: provider and provider_chain record who answered and who was tried, and content_length, content_sha256 and latency_ms are measured by Telem over the body it received. Two more work the same way everywhere: enrichments carries whatever provider keys normalization did not consume, verbatim, and title has a fallback the rest do not — when the answering provider supplies none, the title already known for that URL is used.

POST /extract · document at results[0]

Normalized Read from
content raw_content, else content / markdown / text
content_format echoes the format you asked for
canonical_url / title url / title
favicon / images favicon / images
usage / request_id usage / request_id (top level)

A URL that fails lands in failed_results instead of results, and its reason comes back as a warning. The markdown carries site-relative links, flagged by a relative_links warning rather than rewritten — rewriting the body would make content_sha256 disagree with what tavily sent.

Four providers back the endpoint; the deployment walks them in order and the first that answers wins, so a URL one engine cannot render is retried on the next rather than failing. options.providers pins the chain to a subset — and a pinned provider never serves from cache.

Provider Notes
exa Page text, with links and images at max. Declares no output format, so content_format always comes back text whichever format you asked for.
firecrawl The richest of the four: a real browser render, carrying HTML, links, images, a summary and a screenshot alongside the markdown. PDFs are billed by the page.
jina A reader that returns the page as clean markdown. The only one that answers with no key at all — a key raises its rate limit rather than unlocking the API.
tavily One URL in, one document out: page text with the title, favicon and images, and the thinnest metadata of the four. Reports no upstream status — a URL either extracts or comes back failed.

GET /v1/fetch-providers (no auth) is this chain’s live roster — each provider’s name, whether it is in the chain, whether it needs a key, and the fields it structurally cannot supply.

GET /v1/fetch-providers (no auth) is this chain’s live roster — each provider’s name, whether it is in the chain, whether it needs a key, and the fields it structurally cannot supply.

Three options shape the body itself. content_format picks markdown or plain text — those two only. inline_content: false returns every field except the page text: the metadata read, for when you want to know what a page is without paying to carry it. inline_max_chars caps each inline body at 20 000 characters by default; a longer page comes back truncated and flagged rather than silently cut.

Whole pages are the point here, not an opt-in as they are on search — every fetch pays for one, so fetch the URLs you have already decided to keep.

Pass a list of URLs and they fetch concurrently inside a single interaction — faster and cheaper than calling fetch repeatedly. Results come back one per URL, in the order you sent them, each carrying its own status: one URL failing never fails the call.

The deployment sets the batch cap; one URL over it is a 400 (over_url_cap) that names the limit.

The Python SDK spells this client.fetch(["https://a", "https://b"]).