Coverage Maps
A coverage map shows your users where your plans have mobile network coverage. You build one from network availability tilesets, which your map library draws as a layer on top of your basemap.
Preview
Network availability tilesets are in preview, and their interface may change. Send any feedback to support@gigs.com.
How it works
Network availability tilesets use three common mapping standards, which libraries such as MapLibre and Mapbox support natively:
- XYZ tiles. The world is cut into a grid at every zoom level
z, and each tile is addressed by its columnxand rowy. Your map library works out which tiles it needs as users pan and zoom. - Mapbox Vector Tiles. Each tile contains coverage shapes, with one layer per network technology, such as 4G and 5G. Tiles carry no styling: you choose the colors, the opacity and which technologies to show.
- URL templates. You give your map library one URL with
{z},{x}and{y}placeholders, and it requests the tiles itself. You don't fetch any tiles in your own code.
1. Fetch the tilesets
Call the list all coverage map tilesets endpoint:
List coverage map tilesets
curl --request "GET" \
--url "https://api.gigs.com/projects/${GIGS_PROJECT}/networkAvailabilityTilesets" \
--header "Accept: application/json" \
--header "Authorization: Bearer ${GIGS_TOKEN}"
Response
{
"object": "list",
"items": [
{
"object": "networkAvailabilityTileset",
"expiresAt": "2026-08-10T12:00:00Z",
"layers": [
{ "technology": "4G", "sourceLayer": "coverage_4g" },
{ "technology": "5G", "sourceLayer": "coverage_5g" }
],
"maxZoom": 10,
"minZoom": 0,
"urlTemplate": "https://tiles.gigs.com/tiles/default/2026-08-03/{z}/{x}/{y}.pbf?Expires=...&Signature=..."
}
],
"moreItemsAfter": null,
"moreItemsBefore": null
}
The response lists a tileset for each network your project's available plans use. Note that we don't have a coverage tileset for every network provider. The list is empty if none of your project's available plans has a coverage tileset. See the API reference for all fields.
Each tileset's urlTemplate is signed and stops working at expiresAt. Store the response, and fetch the tilesets again before expiresAt instead of hardcoding the URL. This also picks up new coverage data without code changes.
2. Add the tiles to your map
Add each tileset's urlTemplate as a vector tile source, then add a layer for each entry in its layers. In MapLibre GL JS, for example:
Render coverage with MapLibre GL JS
// The tilesets from your backend
const { items } = await fetchCoverageTilesets()
map.on('load', () => {
items.forEach((tileset, index) => {
const sourceId = `coverage-${index}`
map.addSource(sourceId, {
type: 'vector',
tiles: [tileset.urlTemplate],
minzoom: tileset.minZoom,
maxzoom: tileset.maxZoom,
})
// Tip: draw coverage below water, roads and labels, and above buildings
for (const layer of tileset.layers) {
map.addLayer({
id: `${sourceId}-${layer.sourceLayer}`,
type: 'fill',
source: sourceId,
'source-layer': layer.sourceLayer,
paint: {
'fill-color': layer.technology === '5G' ? '#4f8f6f' : '#7fb3a0',
'fill-opacity': 0.6,
},
})
}
})
})
For a readable map, draw coverage below your basemap's water, roads and labels, and above its buildings.
Considerations
- Coverage data. Tiles show whether there is coverage for each technology, such as 4G and 5G, not signal strength. Coverage is currently available for networks in the United States.
- Placement. Show the map where users choose to open it rather than on a landing page, to avoid tile traffic nobody looks at. Opening it zoomed in on the user's area, for example from their ZIP code, makes it more useful.
- Rate limiting. We may rate-limit tile traffic if we see unusually high volumes.
- Disclaimer. We recommend including a disclaimer wherever the map appears, stating that coverage is predicted, not guaranteed, and can vary inside a covered area.