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 and the failure signal come from every provider, and title from every one but linkup; 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 api.fetch.tinyfish.ai · document at results[0]

Normalized Read from
content text
content_format format — markdown when you asked for text, which tinyfish does not offer
canonical_url / title final_url / title
description description
language / author language / author
publish_date published_date
links / images links / image_links (requested only when the tier includes them)

A page tinyfish cannot fetch still answers 200: the result list is empty and the reason sits in errors[] as a closed-set code (bot_blocked, timeout, page_not_found, …). That code comes back in a provider_error warning, with the upstream status when tinyfish sent one, and the chain moves on. etag, last_modified and not_modified ride in enrichments.

Eight providers back the default chain; 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. A ninth, brightdata, is never walked by default: pin it to read LinkedIn company, job and post records. A pinned chain in which no provider accepts one of your URLs is a 400.

Provider Notes
brightdata LinkedIn records, pinned only. Takes a LinkedIn company, job or company-post URL and declines every other; the record comes back rendered as markdown, and whole in structured.
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 document here: 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.
linkup Page markdown, JavaScript-rendered, with the raw HTML and content type from extended up. Echoes no URL and no title.
parallel Full page markdown with a publish date, a request id and a per-call SKU usage list.
tavily One URL in, one document out: page text with the title, favicon and images. Reports no upstream status — a URL either extracts or comes back failed.
tinyfish Page markdown with the title, description, language, author and publish date, plus links and images from extended up. A page it cannot fetch comes back with tinyfish’s own reason code (bot_blocked, timeout, …).
you Always a fresh crawl: page markdown, the raw HTML and the page’s metadata.

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"]).