Demographics
Copy link

Who lives here: people, households, age, renting, car ownership and income, per hexagon, per boundary, or in total over a catchment.

Questions this page answers

  • How many people live within 30 minutes?
  • How many people in my catchment have no car?
  • What share of households have no car?

Every JSON answer names its sources once, in sources (a list when it drew on several): population is WorldPop's 2020 grid (worldpop_2020); census is the 2021 Census for England and Wales (ons_census_2021_ew), Scotland's 2022 census (nrs_census_2022) or Northern Ireland's 2021 census (nisra_census_2021), and, where income is present, ONS small-area income for the financial year ending 2020 (ons_income_fye2020_msoa). /v1/catalog/gb carries updated_at, the date the data was last loaded.

Request headers
Copy link

Required authentication header. The same application id as the TravelTime API.

string

Required authentication header.

Who lives in each hexagon, per boundary, or in total
Copy link

GET /v1/demographics/cells

People (WorldPop) and a census block per hexagon, or totals over what you send: one row per boundary with group_by=borough, one row for everything with group_by=all. Resolution 9 only; a group_by=all total also takes coarser ids. POST /v1/demographics/cells takes the same fields as JSON, for long cell lists (Long requests).

How many people live in each hexagon around King's Cross: 39 hexagons in the box, one row each.

Request

curl -H "X-Application-Id: YOUR_APP_ID" -H "X-Api-Key: YOUR_APP_KEY" \
  "https://data.traveltimeapp.com/v1/demographics/cells?bbox=51.522,-0.140,51.538,-0.110"
200 · 39 hexagons, one page

Shade = population543,10639 hexagons; a hexagon opens its row.

People in hexagons you choose, in the order sent. Add group_by=all for one total over the seven: 9,587 people in 2,813 households.

How many people live within 45 minutes of King's Cross by public transport: send the 8,526 hexagons the TravelTime API returns for that journey and ask for one row. 6,441,313 people, 2,419,928 households, 48% of them without a car. Use with the TravelTime API shows the call that gives you the hexagons; the body is elided here.

Camden's 233 hexagons, from GET /v1/boundaries/gb-camden?include=cells, as one row: 243,784 people, 93,281 households, 64% of them without a car. Totals are always over what you send; the body is elided here.

Parameters
Copy link

ParameterTypeDefaultWhat it doesExample
min_populationinteger—Only hexagons with at least this many people.min_population=100

Also takes Where: near, radius_m, bbox, cells, at · Per-hexagon routes: group_by · Paging: limit, cursor · Output: format · Long requests: the POST body.

Each row: cell (or cell_count in totals, and boundary with group_by=<type>), population (people, WorldPop) and a census block: residents and households (counts), age_0_15_share, age_16_34_share, age_65_plus_share, private_renter_share and no_car_share (shares 0–1), net_household_income (local currency a year). census is null where the census has no block for the hexagon, and missing says why: no_residents when WorldPop counts nobody there either, outside_source_coverage otherwise; a single field such as census.net_household_income can be null the same way. Rollup: sum for people, residents, households and cell_count; population_weighted_mean for the age shares; household_weighted_mean for renting, cars and income.

Errors

CodeHTTPWhen
invalid_min_population400min_population is negative or not an integer.

… and every Where, Per-hexagon routes and Paging code.

Request

curl -H "X-Application-Id: YOUR_APP_ID" -H "X-Api-Key: YOUR_APP_KEY" \
  "https://data.traveltimeapp.com/v1/demographics/cells?bbox=51.522,-0.140,51.538,-0.110"
200 · 39 hexagons, one page

Shade = population543,10639 hexagons; a hexagon opens its row.