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
| Field | Type | Description |
|---|---|---|
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. |