Skip to main content
The same request body works on two endpoints:

Measured sizes

The same rows, from real responses: The fields are those of Estimating costs. JSON doubles every binary byte (hex) and adds the column names to every row. Because you’re billed by the bytes you receive, the same data costs 2–2.5× more as JSON.

Use Arrow when

  • You’re reading more than a few thousand rows, or running the same query repeatedly.
  • The data goes into a dataframe, a database or a file: pandas, Polars, DuckDB, Spark, ClickHouse and BigQuery all read Arrow without conversion.
  • You want typed columns: UInt64 block numbers, fixed-size binary hashes and addresses, nested lists of structs.

Use JSON when

  • You’re exploring with curl and jq.
  • You’re debugging a filter and want to read the rows.
  • The script is tiny, and adding an Arrow library isn’t worth it.
A common workflow: build and check a query with /query/json on a small range, then change the path to /query for the real run. The request body is identical.

What’s the same

  • The request body, the filters, the fields and the validation.
  • Which rows come back and in what order.
  • Pagination: both return next_block and stop at the same kinds of limits.
  • The metadata values (archive_height, finalized_block, next_block, …). Arrow puts them in the schema metadata as bl.* strings; JSON puts them in the body as numbers. See Response metadata.
Next: Reading Arrow or The JSON format.