Query by coordinate, H3 cell or geohash
You can query the Data API in three ways: by coordinate, by H3 cell or by geohash. This page explains each one and when to use it.
Which one to use
All three return the same data. Use the one that matches what you already have.
| What you have | What to use |
|---|---|
| A point, such as a dropped pin or a geocoded address | A coordinate on GET /v1/pois/near |
| A rectangle, such as a map viewport | bbox on GET /v1/pois/in-bbox or any /v1/h3/* endpoint |
| An area as H3 cells, such as a TravelTime API result | cells on any /v1/h3/* endpoint |
| An area as geohashes | geohashes on GET /v1/geohash/pois |
We recommend H3 cells when you need two datasets for the same area. Send the same cell list
to each endpoint and the results cover the same hexagons. A 500 m circle on /v1/pois/near
and a bbox on /v1/h3/population cover different areas, so a ratio between them means
nothing.
If you have a coordinate, send it as a coordinate. The endpoints convert it to cells. H3 is the only query type every dataset supports. Geohash is for places only.
Query by coordinate
| Shape | Endpoint | Parameters |
|---|---|---|
| Point and range | GET /v1/pois/near | lat, lng, then radius_m or k |
| Rectangle | GET /v1/pois/in-bbox | bbox=south,west,north,east |
| Name | GET /v1/pois/search | q |
| Rectangle | /v1/h3/* | bbox=south,west,north,east |
| Circle | /v1/h3/* | center_lat, center_lng, radius_m |
radius_m returns everything within that distance. k returns the nearest k places,
however far they are. Send both to cap the nearest k by distance. Send neither and the
response is 400 with code range_required.
bbox is latitude first: south, west, north, east.
This request returns cafés within 500 m of Trafalgar Square that are verified or that at least two sources list.
bash
curl -H "Authorization: Bearer $POI_API_KEY" \
"$POI_BASE/v1/pois/near?country=GB&lat=51.5074&lng=-0.1278&radius_m=500&category=cafe&min_sources=2&limit=5"This request returns cafés in a rectangle over central London.
bash
curl -H "Authorization: Bearer $POI_API_KEY" \
"$POI_BASE/v1/pois/in-bbox?country=GB&bbox=51.50,-0.15,51.52,-0.10&category=cafe&limit=5"This request returns places whose name matches Tate.
bash
curl -H "Authorization: Bearer $POI_API_KEY" \
"$POI_BASE/v1/pois/search?country=GB&q=Tate&limit=5"Each response is a GeoJSON FeatureCollection with one feature per place.
Points of interest describes every property.
/v1/h3/population and /v1/h3/transit-coverage take bbox, cells or division only.
A circle on its own returns 400 invalid_input. A circle sent with a bbox is ignored.
Query by H3 cell
An H3 cell is a hexagon in the H3 grid, addressed by a hex string such
as 89195da494bffff. A resolution 9 cell has edges of about 175 m. Every dataset has
resolution 9. A resolution 10 cell has edges of about 65 m, and an area has about 7 times
as many of them. Lower resolutions total a city in fewer cells.
GET /v1/h3 lists the resolutions each dataset has.
bash
curl -H "Authorization: Bearer $POI_API_KEY" \
"$POI_BASE/v1/h3"Send cells as a comma-separated list. When you send cells, their resolution is used and
resolution is ignored.
bash
curl -H "Authorization: Bearer $POI_API_KEY" \
"$POI_BASE/v1/h3/pois?country=GB&cells=89195da494bffff,89195da4947ffff&resolution=9"A cell with no data is absent from the response. It is not an error and it is not a zero row.
/v1/h3/population and /v1/h3/transit-coverage also accept division, an administrative
area id from GET /v1/divisions. The server expands it to the area's cells. Other /v1/h3/*
endpoints ignore division. See Population and areas.
Query by geohash
GET /v1/geohash/pois and GET /v1/geohash/pois/records take geohashes. Only the places
dataset supports geohash. GET /v1/geohash lists what it serves.
Two precisions are available. Precision 6 cells are about 1.2 km across. Precision 7 cells
are about 150 m across. The parameter is precision, never resolution. Sending
resolution returns 400 invalid_input on a GET and 422 in a POST body. Every geohash in a request must be the same length. Mixed
lengths return 400 mixed_precision.
bash
curl -H "Authorization: Bearer $POI_API_KEY" \
"$POI_BASE/v1/geohash/pois?country=GB&geohashes=gcpvj0,gcpvj1"Geohashes you send win over precision. The response says which precision was used.
bbox and circle work here too, covered at precision. A cell is included when its centre
is inside the shape, the same rule as /v1/h3/*.
bash
curl -H "Authorization: Bearer $POI_API_KEY" \
"$POI_BASE/v1/geohash/pois?country=GB&bbox=51.50,-0.15,51.52,-0.10&precision=7"precision defaults to 6. A request can cover at most 10,000 cells. At precision 6 that is
a bbox of about 0.76°, at precision 7 about 0.13°. Above the cap the response is
400 too_many_cells.
For a list too long for a URL, send the same array in a POST body.
bash
curl -X POST -H "Authorization: Bearer $POI_API_KEY" -H "Content-Type: application/json" \
-d '{"geohashes": ["gcpvj0", "gcpvj1"], "limit": 100}' \
"$POI_BASE/v1/geohash/pois"Rows are keyed geohash, and the response says precision instead of resolution. The
category filter, min_sources, verified, include_closed, per_cell_limit and
breakdown work as they do on /v1/h3/*.
Choose a country
Every endpoint accepts country, an ISO 3166-1 alpha-2 code such as GB. country is
optional. If you leave it out, the API works out the country from the coordinate, bbox
or first cell in your request. If your app covers more than one country, we recommend you
always send it.
The response says which country it used. The X-Country header carries the code on every
response. Responses with a country field also have country_resolved, which is true
when the API worked the country out.
This request has no country. The response header is X-Country: GB.
bash
curl -i -H "Authorization: Bearer $POI_API_KEY" \
"$POI_BASE/v1/pois/near?lat=51.5074&lng=-0.1278&radius_m=500&category=cafe&limit=5"Resolution fails in two ways, both 422: country_required when the request has no
geography, and country_unresolved when the geography is outside every country the Data
API covers.
A code that is not a country returns 400. A country the Data API does not cover returns
503. GET /v1/countries lists the countries it covers.
bash
curl -H "Authorization: Bearer $POI_API_KEY" \
"$POI_BASE/v1/countries"H3 response format
Every /v1/h3/* endpoint that returns cells uses the same envelope. This is the response
to the cells request above.
json
{
"country": "GB",
"country_resolved": false,
"resolution": 9,
"count": 2,
"limit": 10000,
"truncated": false,
"generated_at": "2026-09-21T10:18:07Z",
"cells": [
{
"h3": "89195da4947ffff",
"count": 109,
"top_categories": ["restaurant", "clothing_store", "bar"]
},
{
"h3": "89195da494bffff",
"count": 20,
"top_categories": ["uncategorised", "landmark", "bus_stop"]
}
]
}cells differs by dataset. Places put counts and categories in it, green space puts
polygons, population puts residents and demographics. A dataset may add a field of its own
beside cells. POST /v1/h3/population/aggregate has its own shape.
truncated is true when limit cut the list short. Do not infer completeness from
count.
resolution says which resolution was used. When you send cells, their resolution wins
over any resolution you pass. /v1/h3/transit-coverage accepts cells at resolution 9
only. Other resolutions return 400 invalid_cell_resolution.
Reduce response size
counts_only=true on GET /v1/h3/pois and GET /v1/geohash/pois drops the category list,
so each cell carries no categories. It cannot be combined with breakdown. Sending both returns
422 invalid_input.
bash
curl -H "Authorization: Bearer $POI_API_KEY" \
"$POI_BASE/v1/h3/pois?country=GB&cells=89195da494bffff,89195da4947ffff&counts_only=true"fields=slim on GET /v1/h3/pois/records and GET /v1/geohash/pois/records trims each
place to id, name, category, lat, lng and source_count (see
Source counts and min_sources).
bash
curl -H "Authorization: Bearer $POI_API_KEY" \
"$POI_BASE/v1/h3/pois/records?country=GB&cells=89195da494bffff&fields=slim&limit=3"Where next
- Use with the TravelTime API: get the cells inside a travel time and query them.
- Points of interest: what a place record contains and how a place is verified.
- Population and areas: the dataset that uses H3 cells most.
- API reference: every parameter of every endpoint.