Skip to main content
A Contents download is priced by what it returns. A card CSV export carries a flat per-export baseline plus a per-row rate. A web page extraction is a flat per-page rate. Every price below is also readable from the API before you fetch, so you never have to infer a bill from this page.

What a card CSV export costs

rows is the number of rows the export actually returns, which is the smaller of max_rows and the rows the card holds. Every returned row is billed, from the first, and a card with fewer rows than your cap bills only the rows it returns.

A worked example

A 2,000-row card at the base rate, exported in full:
The same card from a premium source that bills $0.10 per 1,000 rows:

Read your exact rate before you fetch

Do not assume the floor rate. Every downloadable card in a Search or Answer response carries an export_pricing object, and its row_cpm_usd is that card’s rate for your account — already adjusted for the card’s source and for any negotiated terms on your account:
Put those numbers into the formula above and you get the charge exactly. That is the reliable way to price an export — a rate table on a docs page cannot account for per-source rates or per-account terms, and export_pricing can.
export_pricing also carries a deprecated free_rows field, always 0. Ignore it; it will be removed.

Quote without fetching

Send quote_only: true on a Contents request to price an export without retrieving it or being charged. You get the cost back with no content and no charge. Search and Answer have no equivalent — see Search inline contents vs. the Contents API.

How max_rows drives the bill

max_rows is the single field that decides the size of a card export, so it is the field that decides the bill. Set max_rows when you need a slice. A 50-row preview of a premium card costs $0.006 where the full 2,000 rows cost $0.201.
On Search and Answer, max_rows is a per-card cap. A response holding five cards bills each one separately, each with its own baseline.

What bounds a multi-card search response

One search response cannot bill without limit, however many cards it holds. All cards share a budget of 2,000 billable rows, spent in card order, so a 20-card request at max_rows: 2000 does not bill 40,000 rows. Once the budget is spent, later cards still return a small preview rather than nothing — they are not dropped, and they still carry their own export_pricing so you can fetch the rest through Contents. truncated and total_rows tell you when this happened: a card can come back with fewer rows than you asked for because the budget ran out, not because the card was small.

Search inline contents vs. the Contents API

Card data reaches you two ways, priced identically per row but shaped very differently: Both charge the same per-export baseline and per-row rate, so the difference in cost is entirely the difference in rows.
quote_only is Contents-only. There is no way to price a Search or Answer response before running it. If you need a quote, read export_pricing off the card and compute it, or call Contents with quote_only: true.
The small inline default is deliberate: a search response can hold many cards, and each one bills separately, so a /contents-sized default would multiply the bill by the number of cards in the response. Reach for inline contents when you want a usable preview alongside the results, and for the Contents API when you want the card’s full data.

What a web page extraction costs

Text extraction from a web page is a flat $0.001 per page. max_rows does not apply — it has no rows.

Where to find what you were charged

  • Per item — every ContentItem carries a cost in USD: what that one download cost.
  • Per request — when your account is billed pay-as-you-go, the response carries a usage object whose total_cost_usd is the request total. (usage.data is only the inline-data component, and is omitted when a request inlined none.) On accounts that are not metered per request the usage key is absent; that is expected, and the per-item cost fields are still populated.