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.
v13.14 fixup: declared on both slash variants directly (mirrors the
Phase 280 fix on POST). 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) — see CONTEXT.md D-01.
Security: extra=“forbid” locks the D-14 scope guardrail: unknown style axes such as dash patterns, line caps, halo blur, and text-font are rejected at validation time (T-1059A-03).
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