Skip to content

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 haveWhat to use
A point, such as a dropped pin or a geocoded addressA coordinate on GET /v1/pois/near
A rectangle, such as a map viewportbbox on GET /v1/pois/in-bbox or any /v1/h3/* endpoint
An area as H3 cells, such as a TravelTime API resultcells on any /v1/h3/* endpoint
An area as geohashesgeohashes 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

ShapeEndpointParameters
Point and rangeGET /v1/pois/nearlat, lng, then radius_m or k
RectangleGET /v1/pois/in-bboxbbox=south,west,north,east
NameGET /v1/pois/searchq
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