Patch Map Layers Endpoint
const url = 'https://example.com/maps/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/layers';const options = { method: 'PATCH', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"added":[{"id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","dataset_id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","sort_order":0,"visible":true,"opacity":1,"paint":{},"layout":{},"display_name":"example","filter":["example"],"label_config":{},"popup_config":{"enabled":true,"expression":"example","visible_fields":["example"]},"style_config":{},"layer_type":"example","show_in_legend":true}],"updated":[{"id":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","sort_order":1,"visible":true,"opacity":1,"paint":{},"layout":{},"display_name":"example","filter":["example"],"label_config":{},"popup_config":{"enabled":true,"expression":"example","visible_fields":["example"]},"style_config":{},"layer_type":"example","show_in_legend":true}],"removed":["2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"],"order":["2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"],"fallback_full_replace":false}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PATCH \ --url https://example.com/maps/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/layers \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "added": [ { "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "dataset_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "sort_order": 0, "visible": true, "opacity": 1, "paint": {}, "layout": {}, "display_name": "example", "filter": [ "example" ], "label_config": {}, "popup_config": { "enabled": true, "expression": "example", "visible_fields": [ "example" ] }, "style_config": {}, "layer_type": "example", "show_in_legend": true } ], "updated": [ { "id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "sort_order": 1, "visible": true, "opacity": 1, "paint": {}, "layout": {}, "display_name": "example", "filter": [ "example" ], "label_config": {}, "popup_config": { "enabled": true, "expression": "example", "visible_fields": [ "example" ] }, "style_config": {}, "layer_type": "example", "show_in_legend": true } ], "removed": [ "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" ], "order": [ "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" ], "fallback_full_replace": false }'Apply incremental layer additions, patches, removals, and ordering.
Declared on both slash variants directly, mirroring the POST route
below. FastAPI’s default redirect_slashes builds a relative Location
header that resolves against the request’s Host header, which would
leak the in-container api:8000 hostname through Vite’s dev proxy
on a 307 redirect. The canonical (OpenAPI-published) form is the
no-slash sub-collection convention documented in the GeoLens API guide
(https://docs.getgeolens.com/guides/api/); the trailing-slash form is
a hidden alias.
Authorizations
Section titled “ Authorizations ”Parameters
Section titled “ Parameters ”Path Parameters
Section titled “ Path Parameters ”Request Body required
Section titled “ Request Body required ”object
Layers to append (max 200)
object
Draw order (lower draws first)
Layer opacity 0.0-1.0
Per-layer popup configuration: enable/disable + custom title template
- ordered visible-fields allowlist. Persisted as JSONB on map_layers.
object
Whether to include in the map legend
object
Per-layer popup configuration: enable/disable + custom title template
- ordered visible-fields allowlist. Persisted as JSONB on map_layers.
object
Client hint only; PATCH never performs full replacement
Responses
Section titled “ Responses ”Successful Response
object
object
Basemap label prominence.
Road and transit sublayer visibility where supported.
Administrative boundary sublayer visibility where supported.
Whether supported building/3D building basemap layers are shown.
Land and water color treatment where supported.
Master basemap opacity 0.0-1.0
object
Per-sublayer style override for a single basemap sublayer.
All fields are nullable — a None value means “use the basemap default”.
Only #RRGGBB hex strings are accepted for color fields; None means
the basemap default color is preserved. Numeric ranges are clamped at
validation time (Pydantic ge/le constraints).
The key set of BasemapConfig.sublayer_overrides is treated as opaque
(forward-compatible with future sublayer IDs).
Security: extra=“forbid” locks the scope guardrail: unknown style axes such as dash patterns, line caps, halo blur, and text-font are rejected at validation time.
object
Whether the basemap renders below (‘bottom’, default) or above (‘top’) data layers.
Map projection. ‘mercator’ (default) or experimental ‘globe’.
object
object
object
object
Per-layer popup configuration: enable/disable + custom title template
- ordered visible-fields allowlist. Persisted as JSONB on map_layers.
object
Example
{ "basemap_config": { "label_mode": "full", "road_visibility": "full", "boundary_visibility": "full", "building_visibility": true, "land_water_tone": "default", "relief_contrast": "soft", "opacity": 1, "basemap_position": "bottom", "projection": "mercator" }, "terrain_config": { "enabled": false, "exaggeration": 1 }, "visibility": "private", "layers": [ { "layer_type": "vector_geolens", "show_in_legend": true } ]}Bad request — invalid payload
Unauthorized — missing or invalid credentials
Forbidden — caller lacks write access
Not found
Conflict — resource state prevents the operation
Validation error
Too many requests — retry after the advertised interval
Headers
Section titled “ Headers ”Seconds until the request may be retried
Internal server error
Service unavailable — the database could not serve the request