Docs / Shared / Response envelope

Response envelope

Every response — success or failure, collection or single resource — has the same three top-level keys. Write your client once and point it at any dataset.

The shape

{
  "data": [ … ],
  "meta": { "count": 25, "next": "eyJvIjoyfQ", "request_id": "req_9Fv3" },
  "error": null
}

Fields

FieldTypeDescription
data array | object The result. An array for collections, one object for a single resource.
meta object Pagination and request metadata. Always present.
meta.next string · nullable Opaque cursor for the following page. null on the last page.
meta.count integer · nullable Items in data. Present for collections only.
meta.total integer · nullable Rows the FILTER matches across every page, not just this one. Present only when you ask with ?count=true, because it costs a second query.
meta.requested integer · nullable Ids you sent. Batch endpoints only.
meta.answered integer · nullable Ids this API had a row for. Batch endpoints only. answered plus the length of meta.not_found always equals requested — a batch never drops an id quietly. Where not_found is absent, nothing can go missing, so answered equals requested: those endpoints answer every id or fail. data holds the answered rows, except on GET /v1/entities/countries and GET /v1/entities/people, which also return a row of nulls for every id in not_found — so there data always has one row per distinct id sent, in the order sent.
meta.not_found array of string · nullable The ids you sent that have no row here, named rather than left for you to diff two lists. Present only where a miss is an ordinary answer rather than a failure — today GET /v1/cyber/epss, where a CVE that FIRST has published no score for is expected, GET /v1/cyber/nvd, where a CVE outside CISA's catalog is not held, and the two /v1/entities lookups, where an id the daily run never read is — and on those endpoints it is always present, [] when every id was found. Absent elsewhere, including on POST /v1/jobs/liveness: absence means no id was missed, never that the endpoint declines to say.
meta.model_run timestamp · nullable The forecast run the answer was read from — its base time, never a fetch time. On /v1/weather responses only, and on every one of them: null only when nothing was served. On /v1/weather/forecast/runs it is the newest run in the answer. On /v1/weather/cities it is the run the forecast endpoints serve by default, and null there until the first run has landed — when they answer 503.
meta.licence string · nullable SPDX identifier of the licence the data comes under, CC-BY-4.0. On /v1/weather responses, on the three World Bank routes that serve WDI's values — /v1/worldbank/context, /v1/worldbank/indicators and /v1/worldbank/indicators/{code} — and on /v1/climate/ghsl responses; CC0-1.0 on the gene constraint collection and its by-symbol route.
meta.licence_url string · nullable The World Bank's licence page, which carries the terms it adds to CC BY 4.0: a dispute goes to non-binding mediation, then to arbitration. On the three WDI routes only.
meta.attribution string · nullable The statement to display with the data if you republish it — on /v1/weather, the one ECMWF's terms require with what was modified; on the three WDI routes, the World Bank's source line; on gene constraint, gnomAD's release-specific attribution; on /v1/genome/expression, GTEx's acknowledgement — the GTEx Portal, the date softon read the file and the dbGaP accession; on /v1/climate/ghsl, European Commission, Joint Research Centre - Global Human Settlement Layer, verbatim, which #130 makes mandatory. If you republish this data, display it. On those responses. On gene constraint it names the object read from gnomAD's bucket.
meta.source_name string · nullable World Bank World Development Indicators. On the three WDI routes only.
meta.source_url string · nullable Where the data and its terms are published — the link to display beside meta.attribution. On /v1/weather responses, the three WDI routes and /v1/climate/ghsl responses. On gene constraint it names the object read from gnomAD's bucket.
meta.snapshot_date date · nullable WDI's own lastupdated for the release the answer's values come from, 2026-10-08 — the date to pin a copy to. The oldest among the series the answer reads: a release the short-read guard refused leaves its series served under the release before, and an answer is never dated newer than its stalest value. Null only when none of them holds a series. On the three WDI routes only.
meta.retrieved_at timestamp · nullable When this platform fetched and stored what the answer comes from. On the three WDI routes, that release — likewise the oldest among the series read. On /v1/genome/expression, when softon read GTEx's file for the release: it moves only when the release is read again from a replaced file, so a conditional request stays a 304. On those responses only.
meta.release string · nullable The release the answer was read from. On /v1/climate/ghsl, the GHSL release, R2023A: a release bump changes every value, so this is what tells two answers apart. On /v1/genome/expression, GTEx's own name for the release meta.dataset names, v10. On the gene constraint collection and its by-symbol route, the gnomAD release every row comes from, such as 4.1.2.
meta.boundary_set string · nullable The district set the totals were summed over — az-adm2-gb-9469f09-simplified-naftalan-osm-3812595v20, whose outlines GET /v1/climate/districts serves. Null on /v1/climate/ghsl/builtup/zones, whose wedges owe nothing to a district outline. On /v1/climate/ghsl responses only.
meta.tiles array · nullable The GHSL tiles the answer's epochs were read from, four per epoch, by epoch and tile: the provenance #130 says its consumer never recorded. See meta.tiles[].*. On /v1/climate/ghsl responses only.
meta.tiles[].epoch integer The epoch the tile is of, 2010.
meta.tiles[].tile string GHSL's tile id, R5_C23: four 10° tiles cover the grid, R5_C23, R5_C24, R6_C23 and R6_C24.
meta.tiles[].url string The resolved download URL the tile was fetched from — a zip holding one GeoTIFF — under https://jeodpp.jrc.ec.europa.eu/ftp/jrc-opendata/GHSL/.
meta.tiles[].bytes integer The zip's size as fetched: 3.6 to 14.2 MB, 80.5 MB for the eight.
meta.tiles[].sha256 string The zip's sha256 as fetched, checked against a pin before a byte of it was read. A tile that is not the pinned one is refused, never summed.
meta.tiles[].last_modified string · nullable The Last-Modified JRC answered with, verbatim — Mon, 27 Jan 2025 17:44:43 GMT: the day JRC re-packed the zips. The GeoTIFFs inside are dated 2023-10-06, the release's publication.
meta.grid object · nullable The analysis grid every GHSL number is summed on: EPSG:4326, bounds [44, 37.8, 51, 42.2], 1680 × 1056 pixels of 1/240° — published so a grid half a pixel off is a visible diff rather than a silent drift in every district. See meta.grid.*. On /v1/climate/ghsl responses only.
meta.grid.crs string EPSG:4326.
meta.grid.width integer 1680 pixels.
meta.grid.height integer 1056 pixels.
meta.grid.bounds array of number West, south, east, north, exactly: [44, 37.8, 51, 42.2].
meta.grid.pixel_deg number 1/240 of a degree, 0.004166666666666667.
meta.grid.pixel_arcsec number 15: five GHSL pixels to a side.
meta.grid.transform array of number The affine transform as rasterio writes it — pixel width, row rotation, west edge, column rotation, pixel height (negative), north edge — so a raster on this grid can be checked against it to the last digit.
meta.method object · nullable How every number in the answer was made, verbatim as the computation recorded it: version, and one key per step in words — mosaic, resampling, units, rasterize. Compare it as an object; its key order means nothing. A release recomputed by another method REPLACES the one held under the same meta.release, so this, meta.inputs_sha256 and the ETag are what say its numbers moved: compare them, not the release alone, to know you still hold the same answer. On /v1/climate/ghsl responses only.
meta.method.version string The method's version, 1: the tiles mosaicked as rasterio.merge does, each pixel moved half a pixel north-west and counted wholly in one grid pixel, then summed 5 × 5 in whole square metres. A new version is a change to the numbers.
meta.inputs_sha256 string · nullable sha256 over everything the computation read — the tiles' pins, the boundary set's geometry digest, the grid, the zone sets and meta.method.version — 64 hex digits. Equal digests are the same computation over the same inputs. On /v1/climate/ghsl responses only.
meta.boundary_licence string · nullable The terms of the district outlines the totals were summed over, CC-BY-SA-3.0 AND ODbL-1.0, beside GHSL's own. Null on /v1/climate/ghsl/builtup/zones. On /v1/climate/ghsl responses only.
meta.boundary_attribution string · nullable The credit lines those outlines require — geoBoundaries' and OpenStreetMap's. Null on /v1/climate/ghsl/builtup/zones. On /v1/climate/ghsl responses only.
meta.last_poll_at timestamp · nullable When this platform last polled USGS ComCat successfully — RFC 3339, UTC, three fractional digits. On /v1/seismic/quakes and /v1/seismic/quakes/{id} only, and on every answer of theirs. A failed poll does not move it; the snapshot says what the newest run found.
meta.dataset string · nullable The GTEx release the answer was read from, gtex_v10 or gtex_v8 — named even when data is null, because a gene absent from one release can be in another. On /v1/genome/expression responses only.
meta.gencode_version string · nullable The GENCODE release it was quantified against, v39. On /v1/genome/expression responses only.
meta.genome_build string · nullable GRCh38/hg38. On /v1/genome/expression responses only.
meta.tissue_count integer · nullable How many tissues the release has, 54. On /v1/genome/expression responses only.
meta.file_url string · nullable The GTEx median TPM file the release was read from. On /v1/genome/expression responses only.
meta.reason string · nullable Why data is null on a 200: not_in_reference, the release's GENCODE has no gene by that name or id. Present only then, on GET /v1/genome/expression/{symbol}.
meta.found_in array of string · nullable Beside meta.reason: the other releases served here that do name the gene, ["gtex_v10"] for SEPTIN7 asked of gtex_v8. [] when none does. Present only with meta.reason.
meta.newest_release string · nullable GTEx's newest published release when softon last checked, v11 — null if that could not be read. On /v1/genome/expression responses only.
meta.release_notice string · nullable Null when the release answered from is GTEx's newest; otherwise a sentence saying it is not the most current data the GTEx Portal publishes, which GTEx's licence asks a service redistributing an older release to make known. If you republish this data, display it. On /v1/genome/expression responses only.
meta.terms_url string · nullable The terms the data comes under, https://gtexportal.org/home/license. On /v1/genome/expression responses only.
meta.columns_absent array of string · nullable The optional columns that release's table lacks — mis.oe, syn.oe or lof.oe_ci.upper_bin_decile — whose fields are therefore null on every gene. [] when it has them all, as every release served today does. On /v1/genome/constraint and /v1/genome/constraint/{symbol} only.
meta.source object · nullable Where the answer was read from. On /v1/genome/gwas responses, and on every one of them: the parse — release, when it was read, parser, the zip's sha256 and the row-count check, and the attribution — the same object the documents carry as data.source. On /v1/genome/genes/snapshot: the NCBI Gene release's file and what was found in it, meta.source.* below. Absent elsewhere.
meta.source.source_id string On /v1/genome/genes/snapshot: ncbi_gene — also the file's row on /v1/genome/releases, which says which day NCBI last wrote it.
meta.source.source_name string On /v1/genome/genes/snapshot: NCBI Gene.
meta.source.authority string On /v1/genome/genes/snapshot: NCBI.
meta.source.url string On /v1/genome/genes/snapshot: https://ftp.ncbi.nlm.nih.gov/gene/DATA/GENE_INFO/Mammalia/Homo_sapiens.gene_info.gz.
meta.source.last_modified string · nullable On /v1/genome/genes/snapshot: The Last-Modified NCBI sent with those bytes, verbatim. The release is named for its UTC day; a second content written the same day is .2.
meta.source.content_length integer On /v1/genome/genes/snapshot: The gzipped file's size as served, 5,194,256 bytes on 2026-10-09.
meta.source.gz_sha256 string On /v1/genome/genes/snapshot: sha256 of the gzipped bytes as served.
meta.source.decompressed_bytes integer On /v1/genome/genes/snapshot: The size of the TSV sha256 is over.
meta.source.header string On /v1/genome/genes/snapshot: The file's first line, verbatim: the sixteen tab-separated column names every field was read by. A file whose header lacks one, repeats one or adds one is refused whole, and the release before it stays served.
meta.source.rows integer On /v1/genome/genes/snapshot: The file's data rows across every taxon, 193,998 on 2026-10-09.
meta.source.rows_by_tax_id array of object On /v1/genome/genes/snapshot: Per taxon: tax_id, rows, and ambiguous_symbols — every symbol more than one of its genes bears, each a lookup that answers several genes. Seventeen for 9606 today.
meta.source.parser_version integer On /v1/genome/genes/snapshot: The parse rules. A release is its content read by one parser, so a new parser reading the same file is a new release.
meta.source.fetched_at timestamp On /v1/genome/genes/snapshot: When the file this release was read from was first read.
meta.source.served_at timestamp On /v1/genome/genes/snapshot: When the release became served — when the last of its genes landed.
meta.source.checked_at timestamp · nullable On /v1/genome/genes/snapshot: The newest morning that found NCBI's file still holding this release.
meta.source.withdrawn array of integer On /v1/genome/genes/snapshot: GeneIDs held when this release was read that its file no longer lists: the genes its promotion removed. Gone from every route from this release on.
meta.source.attribution string On /v1/genome/genes/snapshot: The line to carry with any gene you republish: NCBI Gene (National Center for Biotechnology Information, U.S. National Library of Medicine); NCBI places no restrictions on the use or distribution of the data.
meta.source.terms_url string On /v1/genome/genes/snapshot: NCBI's Website and Data Usage Policies: "NCBI itself places no restrictions on the use or distribution of the data contained therein."
meta.source.rows_by_tax_id[].tax_id integer On /v1/genome/genes/snapshot: The taxon.
meta.source.rows_by_tax_id[].rows integer On /v1/genome/genes/snapshot: Its rows in the file.
meta.source.rows_by_tax_id[].ambiguous_symbols array of string On /v1/genome/genes/snapshot: Every symbol more than one of its genes bears, compared without regard to case, as the file spells it.
meta.upstream_release string · nullable The newest release EBI's stats endpoint has named on a daily check. When it differs from meta.source.release_version, a newer release has not been read whole yet — not published, or refused — and the one before stays served. On /v1/genome/gwas responses only.
meta.version string · nullable The O*NET release the answer was read from -- 31.0. On /v1/labour/onet responses only, and on every one of them. Every page of one walk carries the same value: a walk stays in the release it began in.
meta.release string · nullable The NCBI Gene release the answer was read from, 2026-10-09: NCBI's gene_info as it stood on the day it is named for. It moves only when a gene did — equal to the one you hold, nothing has changed. On /v1/genome/genes responses only, and on every one of them.
meta.tax_id integer · nullable The taxon served; 9606 unless requested otherwise.
meta.record_count integer · nullable The number of records in data. Reject a truncated body.
meta.sha256 string · nullable SHA-256 of NCBI's decompressed source TSV, identifying the release.
meta.generated_at timestamp · nullable When this release became complete and served.
meta.request_id string Quote this when reporting a problem.
error object · nullable null on success. On failure, carries code and message, and reason where one code covers several causes: today only unauthorized, whose reason is invalid_api_key or revoked_api_key.