Migrating from Maps SDK for Web V6
Maps SDK for Web V6 was deprecated on February 1, 2025, and its CDN endpoints were withdrawn on February 1, 2026: they answer 404 unless your contract runs past that date, and then only until it ends. The SDK receives no further updates, security patches, or bug fixes.
The new Maps SDK for JavaScript is TomTom's strategic investment for web developers — built from the ground up with modern standards and designed to grow with your application.
⚡ Migration carries zero additional cost. Your existing API key, contract, and pricing all remain the same. Every API call is billed identically whether it originates from V6 or the new SDK.
Why migrate
| Benefit | What it means for you |
|---|---|
| Map + services integration | Service results plug directly into map modules. A route, a place search, or a traffic query renders on the map with production-quality styling in one step — no manual addSource/addLayer boilerplate. Defaults are polished; every module is customizable when you need more control. |
| Future-proof foundation | Built on MapLibre GL JS (open-source, BSD-licensed). No vendor lock-in on the rendering engine. Active community, frequent releases, growing plugin ecosystem. |
| Orbis Maps access | First SDK with native support for TomTom Orbis Maps — the next generation of TomTom's map data platform, combining open and proprietary sources for industry-leading freshness and accuracy. |
| Smaller bundles | Modular ESM architecture with full tree-shaking. Import only what you use. Typical production bundles are significantly smaller than V6's monolithic UMD files. |
| First-class TypeScript | Complete type definitions ship with the package. IntelliSense, compile-time safety, and self-documenting APIs — no separate @types install needed. |
| Cross-platform ready | The services bundle runs in the browser, Node.js 24+, and React Native from a single codebase. Build server-side geocoding, routing enrichment, or mobile services without separate packages. |
| Native GeoJSON | Places, routes, reachable ranges, geometries and traffic come back as standard GeoJSON (the POI category, EV availability and search-suggestion services return plain objects). No conversion steps — pass results directly to the map, to deck.gl, to your database, or to any GeoJSON-compatible tool. |
| Your brand on the map | Restyle the map at runtime without a style editor: semantic knobs for label sizes, road widths and traffic colours, your brand colours in one call, and a theme derived from your site's CSS or an image. Routes, areas and pins follow the same accent colour. |
| Built for AI | A coding-agent skill teaches Claude Code, Cursor, Copilot and others the SDK, and the Agent Toolkit turns the map into something your users can talk to. |
| Same pricing | Your API key, contract terms, and per-call pricing are unchanged. Migration is a code change, not a commercial change. |
Feature comparison
Map display
| Capability | V6 | New SDK | Notes |
|---|---|---|---|
| Vector map rendering | ✅ | ✅ | MapLibre-based |
| Map styles (Light, Dark, Driving, Mono, Satellite) | ✅ | ✅ | Built-in themes |
| Custom styles via Map Maker | ✅ | ✅ | Styles from Map Maker |
| Style switching keeps your data | — | ✅ | V6's setStyle dropped added layers; SDK modules restore themselves |
| Map language | ✅ | ✅ | map.setLanguage, or once for map and services in the global config |
| Geopolitical views | Map tiles only | ✅ | One setting covers the map and every service call |
| 3D buildings | ✅ | ✅ | The buildings.3d styling knob |
| Hillshade and 3D terrain | — | ✅ | New |
| Globe projection and sky | — | ✅ | New |
| Semantic styling (label sizes, road widths, traffic colours, presets) | — | ✅ | New: every setting is a knob with a stable id |
| Brand colours and the accent | — | ✅ | New: setMapColors, and exportStyle to save the result |
| Markers, popups, controls | ✅ | ✅ | MapLibre API |
| Search results as map pins | Manual | ✅ | Places module: pins, clustering, entry points and connections |
| Built-in POI filtering and icons | Show/hide only | ✅ | POIs module: by category, with your own icons |
| Route display | Manual | ✅ | Routing module: alternatives, waypoints, sections, speed-limit signs |
| Reachable ranges on the map | Manual | ✅ | Reachable ranges module |
| GeoJSON layers / custom data | ✅ | ✅ | Geometries and the Custom GeoJSON module, which keeps your layer specs across style changes |
| Bring-your-own-data (heatmaps, etc.) | Manual | ✅ | Example included |
| Click and hover on map features | Manual | ✅ | Module events with hover and click states |
| Orbis Maps support | — | ✅ | New map data |
| Layer group toggling | — | ✅ | Base map module |
| Style part lazy loading | — | ✅ | Faster initial load |
Services
| Capability | V6 | New SDK | Notes |
|---|---|---|---|
| Calculate route (A→B, waypoints) | ✅ | ✅ | GeoJSON response |
| Route alternatives | ✅ | ✅ | |
| Route guidance (arrows) | ✅ | ✅ | Example included |
| Route with live traffic | Manual | ✅ | Built-in module |
| Route reconstruction | ✅ | ✅ | Interactive playground |
| Long Distance EV Routing | ✅ | ✅ | Through calculateRoute, with charging preferences |
| Reachable ranges | ✅ | ✅ | Several origins and budgets in one call; private preview, your key needs access |
| EV Charging Availability | ✅ | ✅ | Attaches live availability to your search results |
| Fuzzy, category and nearby search | ✅ | ✅ | One discoverPlaces function; playground included |
| Geometry search / along-route search | ✅ | ✅ | Same discoverPlaces function |
| Search suggestions | Autocomplete | ✅ | Places, brands and categories ranked together |
| Geocoding / reverse geocoding | ✅ | ✅ | Web + Node.js |
| Place details | ✅ | ✅ | Opening hours, entry points, related POIs |
| POI categories | ✅ | ✅ | Match categories by name in any supported language |
| Geometry data (place boundaries) | ✅ | ✅ | V6's additionalData |
| Traffic flow tiles | ✅ | ✅ | Config playground |
| Traffic incidents | ✅ | ✅ | Typed filters by magnitude, category and road |
| Traffic incident details | ✅ | ✅ | Drawn on the map by the incident details module |
| Traffic area analytics | — | ✅ | New: historical speed and congestion over any area, drawn as a heatmap or 3D grid; needs a Move Portal key |
| Server-side services (Node.js) | Services only | ✅ | Full support |
| React Native services | — | ✅ | New platform |
Developer experience
| Capability | V6 | New SDK | Notes |
|---|---|---|---|
| TypeScript support | Annotations only | ✅ Full types | No @types needed |
| Tree-shaking / ESM | UMD bundles | ✅ ESM | Smaller bundles |
| Centralized config (singleton) | — | ✅ | Set once, use everywhere |
| Framework examples (React, Vue) | Limited | ✅ | In docs |
| CodeSandbox examples | — | ✅ | 110+ runnable examples |
| API reference docs | ✅ | ✅ | Full TypeDoc |
| Per-call API key override | ✅ | ✅ | Flexible key management |
| Keeping the API key off the page | Manual | ✅ | Proxy mode: your server adds the key |
| 39 languages supported | ✅ | ✅ | Global config |
| Settings as data | — | ✅ | Every module setting has an id: save, replay, or build a UI from the catalogue |
| AI coding-agent skill | — | ✅ | npx skills add for Claude Code, Cursor, Copilot and others |
| Open-source rendering engine | Mapbox GL (proprietary) | MapLibre (BSD) | No license risk |
Plugins
| V6 plugin or capability | New SDK |
|---|---|
| SearchBox | No drop-in plugin yet: build on getSearchSuggestions() |
| Zoom and pan controls | MapLibre's NavigationControl, through map.mapLibreMap |
| Minimap, DrawingTools | MapLibre community plugins |
| — | Viewport places: search results that follow the visible map |
| — | Map theme: the map's colours from your brand colours, your site's CSS, an image or a mood |
| — | Map effects: bloom, depth of field, colour grade, tint, fog, vignette and your own GPU passes |
| — | Fly-over: a camera that flies a route, framing the junctions ahead |
| — | Landmarks 3D: detailed 3D meshes of landmark buildings, in private preview |
| — | Agent Toolkit: LLM tools that search, route and restyle the map from a conversation |
Estimating migration effort
Every integration is different. Use the table below to estimate effort based on which V6 features you currently use.
| What you use today | Effort | What to expect |
|---|---|---|
| Basic map display only | Low | Replace map initialization (tt.map → TomTomMap). Update CSS import. Typically under 1 day. |
| Map + markers + popups | Low | Markers use MapLibre's API — nearly identical pattern. Popups are the same concept. Expect a few hours of find-and-replace. |
| Map + routing display | Low–Medium | Route calculation returns GeoJSON natively — simpler than V6. |
| Map + traffic layers | Low–Medium | Traffic is integrated into the map module. Replace stylesVisibility config with the new traffic module configuration. |
| Search / geocoding services | Low | Import from @tomtom-org/maps-sdk/services instead of tt.services. Fuzzy, category, nearby, geometry and along-route search become one discoverPlaces function; see the service mapping below. Typed responses. Server-side Node.js code works with minimal changes. |
| EV routing / charging | Low | EV routing has dedicated examples with custom charging stops. getPlacesWithEVAvailability attaches live availability to the stations a search returns, and the places module draws it under each pin. |
| Custom map styles (Map Styler) | Low–Medium | Rebuild the look in Map Maker, or start from a standard style and restyle it in code with styling knobs and setMapColors. |
| SearchBox plugin | Medium | No drop-in SearchBox plugin yet. Build on getSearchSuggestions(), with the search playground as a starting point, or use a MapLibre geocoder plugin. |
| Minimap / DrawingTools plugins | Medium | No first-party equivalents yet. Use MapLibre community plugins. |
| Custom data visualization | Low | Your layer specs carry over unchanged: through MapLibre's addSource/addLayer as before, or the Custom GeoJSON module, which keeps them across style switches and adds SDK events. GeoJSON heatmaps, clusters, and choropleth maps work out of the box. |
| CDN-only deployment (no bundler) | Medium | The new SDK requires npm and a bundler (Vite, Webpack). If your project has no build step, you will need to introduce one. This is a one-time setup cost. |
💡 For most integrations using map display + routing + traffic, expect 2–4 developer-days of migration work. The API patterns are intentionally similar, and the 110+ runnable examples make it easy to validate each feature.
V6 API to new SDK
Find each V6 call you use, and its replacement. Services come from @tomtom-org/maps-sdk/services and map classes from @tomtom-org/maps-sdk/map; none takes a key, which the global configuration holds instead.
Map
| V6 | New SDK |
|---|---|
tt.map({ key, container, center, zoom }) |
new TomTomMap({ mapLibre: { container, center, zoom } }) (TomTom map) |
map.setStyle(style) |
await map.setStyle('standardDark'): modules keep their data and settings (Map styles) |
stylesVisibility, showTrafficFlow(), hideTrafficFlow() |
(await TrafficFlowModule.get(map)).setVisible(true) (Traffic flow) |
showTrafficIncidents(), hideTrafficIncidents() |
(await TrafficIncidentsModule.get(map)).setVisible(true) (Traffic incidents) |
showPOI(), hidePOI() |
(await POIsModule.get(map)).setVisible(false) (POIs) |
map.setLanguage(language) |
map.setLanguage(language), or language in the global configuration for the map and services |
map.setGeopoliticalView(view), tiles only |
map.setGeopoliticalView(view), or geopoliticalView in the global configuration for the map and services (Geopolitical views) |
tt.Marker, tt.Popup |
Marker, Popup from maplibre-gl, or the Places module for many pins |
map.addLayer(…) with a route's toGeoJson() |
(await RoutingModule.create(map)).showRoutes(routes) (Routes) |
map.addLayer(…) with your own GeoJSON |
the Geometries or Custom GeoJSON module, or map.mapLibreMap.addLayer(…) |
Services
V6 tt.services.… |
New SDK |
|---|---|
fuzzySearch, poiSearch, categorySearch, nearbySearch |
discoverPlaces, or discoverOnePlace for the best match |
geometrySearch |
discoverPlaces({ geometries }) (Geometry search) |
alongRouteSearch |
discoverPlaces({ route, maxDetourTimeSeconds }) (Along-route search) |
autocomplete |
getSearchSuggestions |
geocode |
geocode, or geocodeOne for the best match |
reverseGeocode |
reverseGeocode |
placeById |
getPlaceDetails |
poiCategories |
getPOICategories |
additionalData |
geometryData |
calculateRoute |
calculateRoute |
longDistanceEVRouting |
calculateRoute with vehicle.preferences.chargingPreferences (Long distance EV routing) |
calculateReachableRange |
calculateReachableRange, or calculateReachableRanges for several |
evChargingStationsAvailability |
getPlacesWithEVAvailability, getPlaceWithEVAvailability |
incidentDetails, incidentDetailsV5 |
trafficIncidentDetails |
matrixRouting, structuredGeocode, crossStreetLookup, staticImage, trafficFlowSegmentData, incidentViewport |
No equivalent yet, as listed under What's not yet available below |
Responses are GeoJSON as returned, with no toGeoJson(), and positions are [longitude, latitude] arrays throughout.
Step-by-step migration
You can migrate incrementally. Tackle only the sections relevant to your integration.
The new SDK operates at two levels — and you can mix them freely.
- At the high level, map modules and services are tightly integrated: a route calculation, a place search, or a traffic query can flow directly into the map with production-quality visualization in just a few lines — no manual layer management, no custom styling boilerplate.
- At the low level, the underlying MapLibre GL JS instance is always accessible via
map.mapLibreMap, giving you MapLibre's full raw API. That escape hatch is also the most direct migration path for V6 code that called the map's low-level methods; move each feature up to a module as you go, for what the SDK adds.
Install the new SDK
Remove the legacy packages and CDN references. Install the new SDK:
# Remove legacy packages
npm uninstall @tomtom-international/web-sdk-maps @tomtom-international/web-sdk-services
# Install new SDK (peer dependencies installed automatically)
npm install @tomtom-org/maps-sdk
Also remove any V6 CDN <script> and <link> tags from your HTML.
🔑 Your existing TomTom API key works with the new SDK. No new key or contract change is needed.
Set up centralized configuration
The new SDK uses a singleton configuration pattern. Set your API key once at application startup and it applies to all maps and service calls automatically.
Before (V6):
// API key passed to every call individually
var map = tt.map({ key: 'YOUR_API_KEY', container: 'map' });
tt.services.fuzzySearch({ key: 'YOUR_API_KEY', query: 'pizza' });
After:
import { TomTomConfig } from '@tomtom-org/maps-sdk/core';
// Set once at app startup — used by all maps and service calls
TomTomConfig.instance.put({
apiKey: 'YOUR_API_KEY',
language: 'en-GB',
});
You can still override the key per-call or per-map instance when needed.
Migrate map initialization
Before (V6):
var map = tt.map({
key: 'YOUR_API_KEY',
container: 'map',
center: [4.8156, 52.4414],
zoom: 8,
});
After:
import { TomTomMap } from '@tomtom-org/maps-sdk/map';
const map = new TomTomMap({
mapLibre: {
container: 'map',
center: [4.8156, 52.4414],
zoom: 8,
},
});
Map options (center, zoom, bearing, pitch, and all other MapLibre options) are passed through unchanged under the mapLibre key.
Available styles:
| V6 style name | New SDK style ID |
|---|---|
basic_main / basic_night, 2/basic_street-light / 2/basic_street-dark |
standardLight / standardDark |
driving_main / driving_night |
drivingLight / drivingDark |
hybrid_main, or labels_main over your own imagery |
satellite, which carries imagery, roads and labels in one style |
| — | monoLight / monoDark, muted backdrops for your own data |
V6's separate trafficFlow, trafficIncidents and poi styles have no names of their own: the traffic parts are loaded with include (see Migrate traffic layers), and the style's own POIs are shown, hidden and filtered with the POIs module.
const map = new TomTomMap({
style: 'standardDark',
mapLibre: { container: 'map' },
});
Switching style at runtime is await map.setStyle('standardLight'). Unlike V6, where setStyle dropped every layer you had added, the SDK's modules keep their data and settings and redraw on the new style (Map styles).
Migrate routing
Before (V6):
tt.services.calculateRoute({
key: 'YOUR_API_KEY',
locations: '4.89,52.37:4.88,52.36',
}).then(function(routeData) {
var geojson = routeData.toGeoJson();
map.addLayer({ /* ... */ });
});
After:
import { calculateRoute } from '@tomtom-org/maps-sdk/services';
import { RoutingModule } from '@tomtom-org/maps-sdk/map';
const routes = await calculateRoute({
locations: [
[4.89, 52.37], // [longitude, latitude]
[4.88, 52.36],
],
travelMode: 'car',
});
// Pass directly to RoutingModule — no .toGeoJson() or manual layer setup needed
const routingModule = await RoutingModule.create(map);
await routingModule.showRoutes(routes);
The response is standard GeoJSON. No .toGeoJson() conversion step. RoutingModule handles all layer management, default styling, waypoint icons, and traffic-section coloring automatically — the route renders on the map with a single call and looks production-ready by default. If you need a different color scheme, custom line widths, or your own waypoint markers, the module exposes configuration options for each.
If you prefer to manage the map layers yourself (closer to how V6 worked), the GeoJSON response passes directly to map.mapLibreMap.addSource / addLayer:
// Low-level approach — use the MapLibre instance directly
map.mapLibreMap.addSource('route', { type: 'geojson', data: routes });
map.mapLibreMap.addLayer({ id: 'route-line', type: 'line', source: 'route', paint: { 'line-color': '#0080ff', 'line-width': 4 } });
Layers added this way are dropped by setStyle and get no SDK events. To keep your own layer specs with both, give them to the Custom GeoJSON module instead.
Migrate search and geocoding
Search and geocoding responses are standard GeoJSON — you can pass them directly to the map. For a fully integrated experience, PlacesModule renders search results on the map as styled, interactive markers with minimal setup. For a lean, data-only integration, the GeoJSON features work equally well with any MapLibre data source.
Before (V6):
tt.services.fuzzySearch({
key: 'YOUR_API_KEY',
query: 'restaurant',
center: { lat: 52.37, lng: 4.89 },
}).then(function(results) { /* ... */ });
After:
import { discoverPlaces } from '@tomtom-org/maps-sdk/services';
const results = await discoverPlaces({
query: 'restaurant',
geoBias: { position: [4.89, 52.37] }, // [longitude, latitude]
});
// results is a typed GeoJSON FeatureCollection — access via results.features
For reverse geocoding:
Before (V6):
tt.services.reverseGeocode({
key: 'YOUR_API_KEY',
position: { lat: 52.37, lng: 4.89 },
}).then(response => { /* ... */ });
After:
import { reverseGeocode } from '@tomtom-org/maps-sdk/services';
const place = await reverseGeocode({ position: [4.89, 52.37] });
const address = place.properties.address;
Migrate traffic layers
Traffic is one of the areas where the tight map + services integration pays off most visibly. TrafficFlowModule and TrafficIncidentsModule connect the live TomTom traffic data to the map with pre-styled, interactive layers. Incident markers are clickable and richly styled out of the box; you can filter by magnitude, category, or road type without writing any rendering logic. The modules are also directly customizable if you need a different visual treatment.
Before (V6):
var map = tt.map({
key: 'YOUR_API_KEY',
container: 'map',
stylesVisibility: { trafficFlow: true, trafficIncidents: true },
});
// Toggle later:
map.showTrafficFlow();
map.hideTrafficFlow();
After:
import { TomTomMap, TrafficFlowModule, TrafficIncidentsModule } from '@tomtom-org/maps-sdk/map';
// Include traffic layers when initializing the map style
const map = new TomTomMap({
style: { type: 'standard', id: 'standardLight', include: ['trafficFlow', 'trafficIncidents'] },
mapLibre: { container: 'map' },
});
const trafficFlow = await TrafficFlowModule.get(map, { visible: true });
const trafficIncidents = await TrafficIncidentsModule.get(map, { visible: true });
// Toggle visibility
trafficFlow.setVisible(false);
trafficIncidents.setVisible(true);
// Typed filtering — show only major and moderate incidents
trafficIncidents.updateConfig({
filters: {
any: [{
magnitudes: { show: 'only', values: ['major', 'moderate'] },
}],
},
});
Migrate custom styling
In V6, restyling the map meant editing a style in Map Styler and loading its JSON. Map Maker remains the tool for a style of your own, but most brand adjustments need none: the Styling module changes a standard style at runtime, and the change survives style switches.
import { StylingModule } from '@tomtom-org/maps-sdk/map';
const styling = await StylingModule.get(map);
styling.set('labels.sizeFactor', 1.2); // every base-map label 20% bigger
styling.set('buildings.3d', true); // extruded buildings
styling.setMapColors({ land: '#f3f5f7', water: '#accbe2', roadMajor: '#a1b8ce' });
The map theme plugin derives those colours for you from your brand colours, your site's CSS or an image, and exportStyle saves the result as a style file.
Update CSS
Before (V6):
<link rel='stylesheet' href='https://api.tomtom.com/maps-sdk-for-web/cdn/6.x/.../maps.css'>
After:
The SDK applies the MapLibre CSS itself, from its own bundle. You only need this import to use the CSS of the MapLibre version you installed.
// In your JS/TS entry point
import 'maplibre-gl/dist/maplibre-gl.css';
Performance improvements
Bundle size
The modular ESM architecture means you only ship the code you use. With tree-shaking enabled:
| Component | V6 (min + gzip) | New SDK |
|---|---|---|
| Maps library | ~720 KB monolithic | ~220 KB MapLibre + SDK modules (tree-shaken) |
| Services library | ~175 KB monolithic | Import only what you use (significantly smaller) |
| Total (maps + routing) | ~895 KB | Substantially reduced |
Rendering engine
- MapLibre GL JS is actively maintained with performance improvements in every release
- Vector tile rendering leverages WebGL 2 on supported browsers
- Style part lazy loading enables faster initial map display by loading layers on demand
- Layer group visibility animation support for smooth UX transitions
API response handling
- Native GeoJSON responses eliminate the serialisation/deserialisation overhead of V6's
.toGeoJson()conversion - Typed responses enable compile-time validation, reducing runtime errors
Developer velocity
- 110+ runnable examples with Sandpack — copy, modify, ship
- An AI coding-agent skill that gives your agent the SDK's patterns and APIs
- Full TypeScript IntelliSense means less time reading docs, more time coding
- Centralised configuration eliminates the "forgot the API key" class of bugs
Future-proof with Orbis Maps
The new SDK is the first to offer native support for TomTom Orbis Maps — the next-generation map data platform that combines open data (OpenStreetMap) with TomTom's proprietary data assets.
| What Orbis Maps delivers | Details |
|---|---|
| Fresher data | Community-contributed open data combined with TomTom's own map-making operations for faster update cycles |
| Richer detail | More granular POI data, improved address precision, and better coverage in emerging markets |
| Same APIs, better data | Orbis Maps work with the same Routing, Search, and Traffic APIs you already use — the data quality improves, your code stays the same |
| Forward investment | TomTom's roadmap is centred on Orbis. New features, coverage improvements, and data quality investments will land on Orbis first |
Migrating to the new SDK positions your application to benefit from every Orbis Maps improvement automatically.
Pricing and commercial impact
Migration to the new SDK has zero pricing impact. Your existing contract, API key, and billing terms remain unchanged.
- Same API key — your existing TomTom API key works with the new SDK. No new key is required.
- Same per-call pricing — every API call (map tiles, routing, search, traffic) is billed at the same rate regardless of which SDK initiated the call. Both SDKs call the same backend APIs.
- Same contract terms — your existing agreement covers the new SDK. No contract amendment or renegotiation is needed.
- Free evaluation — TomTom's free evaluation plan provides enough daily API requests to prototype and test your full migration.
- Enterprise plans — enterprise customers retain their tailored plans, QPS limits, and support levels through migration.
Migration is a code change, not a commercial event.
Using TomTom map with MapLibre directly
TomTomMap exposes the underlying MapLibre GL JS instance via map.mapLibreMap. Once you have that reference, the full MapLibre API is available — addSource, addLayer, on, queryRenderedFeatures, and everything else — exactly as it works in a standalone MapLibre project.
This is the most direct migration path for V6 code that calls TomTom's tt.map methods directly. You can replace tt.map(...) with new TomTomMap(...), swap the CSS import, and then address the rest of the codebase incrementally: each time a feature is ready to adopt a high-level module, replace the manual layer code; everything else keeps working unchanged via map.mapLibreMap.
import { TomTomMap } from '@tomtom-org/maps-sdk/map';
const map = new TomTomMap({ mapLibre: { container: 'map' } });
map.mapLibreMap.on('load', () => {
// Standard MapLibre API
map.mapLibreMap.addSource('my-data', { type: 'geojson', data: myGeojson });
map.mapLibreMap.addLayer({ id: 'my-layer', type: 'fill', source: 'my-data' });
});
Custom data visualization — heatmaps, clustering, choropleth maps, deck.gl layers — all work through map.mapLibreMap without any SDK-specific code. The high-level modules and the raw MapLibre API coexist on the same map instance, so you can use both at once. For GeoJSON layers, the Custom GeoJSON module takes the same layer specs and restores them after every style switch.
What's not yet available
The new SDK is in Public Preview (0.x versions): until 1.0, a minor release can carry a breaking change, each listed in Upgrading to 1.0. Some V6 capabilities are not yet available as first-party SDK features:
- SearchBox plugin — no drop-in replacement yet; build on
getSearchSuggestions(), starting from the search playground - Minimap / DrawingTools plugins — use MapLibre community plugins, listed in awesome-maplibre
- Turn-by-turn navigation UI — in-car navigation UI components are not yet available
- Matrix routing, structured geocoding, cross-street lookup, static map images, traffic flow segment data and incident viewport — no SDK function yet; call those TomTom APIs over HTTP. For structured geocoding, pass the full address to
geocode - CDN-only deployment — the new SDK requires a bundler (Vite, Webpack, etc.)
For GeoJSON data no first-party module covers, use the Custom GeoJSON module; for anything else, map.mapLibreMap gives you the full MapLibre GL JS API as a fallback — see the section above.
Further reading
- How the SDK works — Architecture overview and key concepts
- Project setup — Installation and API key configuration
- Map quickstart — Your first map in minutes
- Services quickstart — Search and routing
- Core quickstart — What glues map and services together
- Map modules — Traffic, routing, places, and more
- Map styles — Built-in themes and custom styles
- Map styling — Restyle the map at runtime with knobs, brand colours and presets
- Terrain — Hillshade and 3D elevation
- Geopolitical views — One view for the map and every service call
- About MapLibre — What the SDK adds over raw MapLibre, and when to use
map.mapLibreMapdirectly - Traffic flow — Configuring live traffic flow layers
- Traffic incidents — Filtering and displaying incidents
- Routing guide — Route calculation parameters and options
- Search guide — Fuzzy, geometry and along-route search
- Search suggestions — Search-as-you-type over places, brands and categories
- Geocoding / Reverse geocoding
- EV Charging Availability — Live availability on your search results
- Long Distance EV Routing
- Proxying your API calls — Keep the API key on your server
- Map theme, Map effects, Fly-over, Viewport places, Agent Toolkit — Plugins with no V6 counterpart
- AI coding with the SDK — The skill for your coding agent
- Upgrading to 1.0 — Breaking changes between 0.x releases
- API reference — Complete TypeDoc reference