Places
Copy link

Shops, cafés, gyms, schools, surgeries: 4,710,961 places in the United Kingdom. Each comes from Foursquare, OpenStreetMap or Overture (listed_by says which) and is verified when a government register or TravelTime's transport data confirms it (How we verify places).

Questions this page answers: What is near this address? · Which gyms are in my catchment? · How dense are restaurants across this area?

Request headers
Copy link

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

string

Required authentication header.

A list of places
Copy link

GET /v1/places

Places matching your filters, in the location you give. Best match first with q, otherwise nearest first with near, in the order sent with cells, otherwise by id. POST /v1/places takes the same fields as a JSON body, for cells lists too long for a URL.

The 42 cafés within 300 m of King's Cross, nearest first. Each says how far away it is.

Request

curl -H "X-Application-Id: YOUR_APP_ID" -H "X-Api-Key: YOUR_APP_KEY" \
  "https://data.traveltimeapp.com/v1/places?near=51.5307,-0.1238&radius_m=300&category=cafe"
200 · 42 places, one page

42 pins inside the 300 m circle; a pin opens its row.Drawn from the response on this page; the playground runs it live.

Everything inside a rectangle: no near, so no distance_m.

Everything inside seven hexagons around Euston Square: 500 places.

Gyms you can reach in 30 minutes by public transport: the TravelTime API returns the reachable hexagons with your own key. Seven of them here, between Euston and St Pancras: 9 places in the gym group. category matches any of a place's categories: the Living Centre is filed as cultural_center and also lists gym. The whole 45-minute catchment from King's Cross is 8,526 hexagons and 3,173 gyms: see it live in the demo →

Best match first, across the whole country. Add category to keep the museum rather than the bus stop named after it.

Narrow any list: here, the 6 Pret branches within 1 km that a government register has verified.

A FeatureCollection of points: the row fields land in properties, lat and lng become the geometry.

The same idea on the geohash grid, for teams already using it. The response says which grid it is on, and each row carries its geohash as well as its cell.

Parameters
Copy link

ParameterType · defaultWhat it doesExample
qtext · —Search by name. A name has no location, so give one, or country=gb for the whole country.q=british+museum
categorycategory ids · —Only these categories, from /v1/categories. A group id covers everything under it.category=gym,swimming_pool
brandbrand slug · —Only this brand.brand=pret
verifiedtrue | false · —true keeps only places a government register (FHRS, CQC, NHS…) or TravelTime's transport data confirms.verified=true
gridh3 | geohash · h3With geohash, cells takes geohash squares instead of hexagons.grid=geohash
precision6 | 7 · —Geohash square size, with grid=geohash.precision=7

Also takes Where: near, radius_m, bbox, cells, at, country · Paging: limit, cursor · Output: format · POST body

Each row: id, name, category, brand, lat, lng, cell, verified; distance_m with near; geohash with grid=geohash.

CodeHTTPWhen
location_required400No near, bbox, cells or at; q with neither a location nor country.
country_not_allowed400country with anything but q.
invalid_category400Not a group, category or detail id from /v1/categories.
grid_not_supported · invalid_precision · invalid_cells400grid=geohash with q or at; precision not 6 or 7; geohash cells whose precision differs from precision.
invalid_cell_resolution400H3 cells not all resolution 9.
Every Where and Paging code

One place
Copy link

GET /v1/places/{id}

One place with everything we know; the id comes from a list.

Also takes: —

Each row: the list row plus every source that lists it (listed_by: fsq, osm, overture), its address (street, postcode, city), the registers that verify it (verified_by), all its categories and updated_at.

CodeHTTPWhen
invalid_id400Not a place id (pl_gb_…).
not_found404No place with this id.

Places per hexagon
Copy link

GET /v1/places/cells

How many places are in each hexagon, per boundary, or in total. POST /v1/places/cells takes the same fields as a JSON body, for long cells lists.

How many places are in each hexagon: a density map.

Counts for every hexagon within 1 km of a point.

Counts for hexagons you choose, with include=categories for a count per category.

The same density map on geohash squares; each row says geohash, not cell.

Parameters
Copy link

ParameterType · defaultWhat it doesExample
categorycategory ids · —Count only these categories.category=gym
includecategories, groups · —categories adds category_counts to each row: per category, the places category= would count; a place counts once per category. groups adds group_counts, the same per group: a place in two groups counts in each.include=categories,groups
grid, precisionh3 | geohash · h3; 6 | 7 · —As on /v1/places: geohash squares instead of hexagons.grid=geohash&precision=6

Also takes Where · Per-hexagon routes: group_by, resolution · Paging · Output · POST body

Each row: cell and count; category_counts with include=categories and group_counts with include=groups; geohash instead of cell on the geohash grid. Rollup: sum.

CodeHTTPWhen
invalid_resolution400Places has resolutions 6 to 10; allowed lists them.
invalid_group_by400Not cell, all or a boundary type the country has; allowed lists them.
invalid_include400include other than categories and groups.
invalid_format400geojson with a group_by other than cell, or on the geohash grid.
invalid_category · grid_not_supported · invalid_precision · invalid_cells400As on /v1/places; grid_not_supported here is grid=geohash with at.
Every Where and Paging code

Request

curl -H "X-Application-Id: YOUR_APP_ID" -H "X-Api-Key: YOUR_APP_KEY" \
  "https://data.traveltimeapp.com/v1/places?near=51.5307,-0.1238&radius_m=300&category=cafe"
200 · 42 places, one page

42 pins inside the 300 m circle; a pin opens its row.Drawn from the response on this page; the playground runs it live.