Custom layers
List and read layers of zones, locations or H3 cells.
GET /v1/custom/layers lists custom layers: sets of your own data (or data we hold), served next to the built-in boundaries. A layer holds one kind of item: polygons (zone), points (location) or H3 cell sets (cell). Use layers for service territories, store lists, coverage maps and any other data you query by place.
These routes are read-only. Read the items of a layer on the zones and locations pages.
Not Geoapify-compatible. /v1/custom/ is our own API. Geoapify has no equivalent, so there is nothing to migrate from.
How it works
- List the layers with
GET /v1/custom/layers, or read one withGET /v1/custom/layers/{layer}. Note itskind. - Read the items with the route for that kind: zones for
zoneandcelllayers, locations forlocationlayers. - Show each item's
datasource.attributionwherever you display results.
Layers are stored in a database that monthly data releases never replace. Every write to a layer or its items raises its revision, which also appears in each item's datasource.raw.revision. Only enabled layers are visible: any other slug answers 404.
Quick start
curl -s "https://api.data.graphitelab.ai/v1/custom/layers?apiKey=$GRAPHITE_API_KEY"{
"layers": [
{
"slug": "dead_zones",
"kind": "zone",
"name": "Dead zones",
"source_name": "Example Co",
"enabled": true,
"requires_attribution": true,
"attribution": "© Example Co",
"license": "CC BY 4.0",
"source_backed": false,
"revision": 3,
"item_count": 12,
"created_at": "2026-11-04T02:09:49.089Z",
"updated_at": "2026-11-04T02:09:49.089Z"
}
]
}Columns that are null are left out. The list is ordered by slug and carries item_count but no bbox. Read one layer to get its extent:
curl -s "https://api.data.graphitelab.ai/v1/custom/layers/dead_zones?apiKey=$GRAPHITE_API_KEY"You can send the key as Authorization: Bearer $GRAPHITE_API_KEY instead. See Authentication. Every request costs 1 rivet.
Endpoints
| Operation | Path |
|---|---|
| List | GET /v1/custom/layers |
| Read one | GET /v1/custom/layers/{layer} |
{layer} is a slug: lowercase letters, digits and underscores, 2 to 40 characters (^[a-z0-9_]{2,40}$). Neither route takes other parameters.
Layer members
| Member | Notes |
|---|---|
slug | The layer's name in URLs. |
kind | zone, location or cell. |
name, description, absence_note | Display text. absence_note says what an empty answer means for the layer, so show it to your users. |
source_name | Who supplied the data. Default The Graphite Lab. |
enabled | Always true for a layer you can read. |
requires_attribution | When true, you must show attribution wherever you display the layer's items. |
attribution, license, usage_restriction, source_url | Copied into each item's datasource. |
h3_resolution, cell_value_keys, fallback_rings | Cell layers only: the H3 resolution (0 to 15), the names of the per-cell integer values (up to 8) and how many neighbouring rings to try when a point's own cell has no data (0 to 3). |
revision | Raised by every write to the layer or its items. |
item_count | Number of zones, locations or cell zones in the layer. |
bbox | [west, south, east, north] of the items. Single-layer read only; null when the layer is empty. |
created_at, updated_at | ISO timestamps. |
Every item carries the layer's datasource: sourcename (default "The Graphite Lab"), attribution (default "© The Graphite Lab"; another source_name falls back to © <source_name>), the optional license, usage_restriction and url, and raw: {layer, revision}. Surface the attribution wherever you display results.
Public layers
Two layers are maintained by The Graphite Lab and are readable by every key:
-
fcc_fixed: FCC National Broadband Map availability, a cell layer for the US. See Public layer: fcc_fixed. -
mlab_ndt_zip: M-Lab measured internet speed by ISP for each US ZIP and Canadian FSA, a zone layer. See Public layer: mlab_ndt_zip.
Errors and limits
| Status | When |
|---|---|
| 401 | Missing or invalid API key. |
| 402 | Your organization is out of rivets (insufficient_rivets) or has no plan (no_plan). |
| 403 | Your organization does not have data API access. |
| 404 | Unknown layer. |
| 429 | Over 60 requests per minute. |
| 500, 503 | Unexpected gateway error, or the custom layer store is unavailable or busy. Retry. |
Errors use the error shape.
Try in Playground (signed in to your Graphite Lab organization). Signed out, use the paste-your-key widget on the reference page.