Request and response patterns
Request accessEach Smart Layer Tile Service offers a set of methods, such as getLayerByTileId. You call a method by sending an HTTP POST request to its URL. All methods follow the same patterns: how you build the request, how you read the response, and what your map data component does with each HTTP status code. This page describes them once, so the method pages only list what’s specific to each method.
Requests
URL format
The endpoint URLs in your onboarding email end with /openapi.json. That address returns the service’s OpenAPI description: a JSON file that lists the service’s methods. To call a method, replace /openapi.json with the method name:
https://{serviceURL}/{method}?apiKey={Your_API_Key}| Field | Description |
|---|---|
serviceURL | Your Smart Layer Tile Service endpoint, without /openapi.json. Your onboarding email contains it.Example: api.tomtom.com/ndslive/smart-layer-service/eval/6/ISA-2026-06/XXX-ae556b96e330/ |
method | The method name. Example: getLayerByTileId. |
Your_API_Key | A My.TomTom API key with NDS.Live services enabled. |
For example, for the Intelligent Speed Assistance (ISA) evaluation endpoint from the Endpoint quick start:
https://api.tomtom.com/ndslive/smart-layer-service/eval/6/ISA-2026-06/XXX-ae556b96e330/getLayerByTileId?apiKey={Your_API_Key}Authentication
Add your API key as the apiKey query parameter to every request.
HTTP method and request body
The NDS.Live standard defines each Smart Layer Tile Service as a set of named methods, and the last part of the URL is the method’s name. So the HTTP method doesn’t tell what a request does, as it often does in web APIs: you call every method with POST, including methods that only return data, such as getServiceNodeLegalInfo.
- Call every method with an HTTP
POSTrequest, even if it takes no request body. - Fetch the service description,
openapi.json, withGET.
Whether a method needs a request body depends on its type:
- Tile methods return map data for one tile, so the body tells the service which tile you want, or which layer of it.
- Service metadata methods return information about the service itself, such as the layers it contains, the area it covers, or the methods it implements. They need no body.
| Type | Methods | Request body |
|---|---|---|
| Tile | getLayerByTileIdgetHeaderOnlyByTileIdgetDeltaLayerByTileIdgetSingleDataLayerByTileId | A zserio-encoded object that names the tile or layer, such as TileId |
| Service metadata | getServiceDefinitiongetServiceModuleDefinitiongetServiceNodeLegalInfogetServiceNodeSystemReferencegetTileServiceCapabilitiesgetSpatialExtentgetRegistryMetadata | None |
Each method page lists its request body.
Bodies are zserio
Request and response bodies are binary objects encoded with zserio, the schema language and serialization framework that NDS.Live is defined in. They aren’t JSON or text, so you can’t read or write them by hand. Your map data component encodes every request body and decodes every response:
| Action | How-to |
|---|---|
| Send a body | • Encode the body with zserio • Set the Content-Type header to application/x-zserio-object |
| Read a response | Decode the response with one of: • NDS.Live SDK • Smart Layer Client • MapViewer |
For example, the request body of getLayerByTileId for tile 545419775 is 4 bytes, the tile ID as a 32-bit integer:
20 82 71 FFThe response begins with the same tile ID, followed by the tile’s header: the number of layers, and their IDs.
20 82 71 FF 0A 01 02 03 04 08 09 0A 0B 0C 0D ...tile ID 10 layer IDs 1, 2, 3, 4, 8, 9, 10, 11, 12, 13Because the bodies are binary, two common tools only partly work with this API:
curl: works foropenapi.json, which is plain JSON. Whilecurlis a quick way to validate your API key and endpoint, it can’t encode a request body or decode a tile. It can only send a body you’ve already encoded, from a file, and save the binary response to a file.- OpenAPI client generators, such as OpenAPI Generator: don’t produce a working client, because they expect JSON or XML and don’t support zserio.
Responses
On success, the response body is a zserio-encoded object. The returned object type depends on the method: for example, getLayerByTileId returns a SmartLayerTile, and getHeaderOnlyByTileId returns a SmartLayerHeader. Method pages in this section list zserio objects each method returns.
The methods getLayerByTileId, getHeaderOnlyByTileId, getServiceDefinition and getSpatialExtent answer with 303 See Other and a Location header that points to a file on a TomTom content delivery network. Make sure your HTTP client follows redirects. The Location URL carries a short-lived access token, so don’t cache it or write it to logs.
An error response can have a JSON body, but base your map data component’s error handling on the HTTP status code only.
HTTP status codes
The table lists HTTP status codes, their meaning, and what your map data component should do when it gets one.
| Code | Meaning | What your map data component should do |
|---|---|---|
200 | OK. | Decode the response body. An empty node list from the NDS.Live Registry: no services available for your entitlements. • Check your request • Contact TomTom if you expect data |
204 | No content: there’s no data for this tile at this level. Possible causes: • The tile is empty. • The tile is at a level the service doesn’t serve. • The tile is outside the area your product covers. | Check that the tile is at a level the service serves. • Missing: request the tile at a level the service serves. • Present: a valid answer, not an error. Cache the empty result and don’t retry. |
206 | Partial content. The CDN answers a range request. | Continue with the next range. |
301, 307, 308 | The request was sent over plain HTTP, and the TomTom API gateway or the CDN redirects it to HTTPS. | Always use HTTPS. |
302, 303 | The resource is at another URL, on the CDN. | Follow the URL in the Location response header right away. Don’t cache it or write it to logs: it carries a short-lived access token. If it no longer works, request the content again from the service. |
304 | Not modified since the version you sent in If-None-Match. | Keep using your cached copy. |
400 | Bad request. The request is malformed. For example: • The tile ID is outside the valid range. • The path is invalid. • The request body is invalid. • An entitlement value is invalid. | Fix the request. Don’t retry it unchanged. |
401 | Unauthorized. The API key or token is missing, invalid or expired. | Refresh your credentials and retry once: • For an API key, check the apiKey query parameter. Then check in My.TomTom that the key still exists and wasn’t rotated.• For a token, get a new one from your authorization service. |
4031 | Forbidden. You’re authenticated, but you aren’t allowed to access this resource. For example: • Your API key doesn’t have the NdsLive API. • The Smart Layer Tile Service doesn’t grant the entitlement for this product or area. • Your token no longer carries the right entitlement. • A CDN redirect URL has expired. | • For an API key, check in My.TomTom that it has the NdsLive API, then retry once. • For a token, refresh it, then retry once. • For an expired CDN URL, request the content again from the service. If you get 403 again, stop: the access isn’t granted. Contact TomTom with the request details. |
4041 | Not found. • For a tile request, the tile is outside the coverage of the map. • For any other request, the path, service node or layer version doesn’t exist, or the Smart Layer Tile Service doesn’t know the product. Method names are case-sensitive. | • For a tile outside the coverage, 404 is a valid and final answer: never retry it. Contact TomTom sales if you need data there. A tile inside the coverage without content returns 204.• For any other 404, don’t retry: fix the request, or get the current service nodes from the NDS.Live Registry. |
405 | Method not allowed. Wrong HTTP method. | Use POST, the HTTP method from the service’s OpenAPI description. |
406 | Not acceptable. Wrong Accept header. | Set Accept to the media type from the service’s OpenAPI description, typically application/x-zserio-object. |
410 | Gone. The service node is retired and won’t come back. | Don’t retry the same node. Discard all data and service information you cached from it: there’s no grace period. Ask the NDS.Live Registry which node replaces it, and use that one. |
413 | Payload too large. The request body sent to the NDS.Live Registry is too large. | Reduce the size of the request. |
415 | Unsupported media type. Wrong Content-Type header. | Encode the body with zserio, and set Content-Type to application/x-zserio-object. |
429 | Too many requests. The rate limit or quota is exceeded. | Back off with an exponential delay, then retry. If the response has a Retry-After header, wait at least that long. |
500 | Internal server error. | Retry with exponential backoff. If the error persists, contact TomTom support. |
502, 504 | Bad gateway or gateway timeout. A service behind the gateway wasn’t reachable, or answered too slowly. | Retry with exponential backoff. |
503 | Service unavailable. It’s temporary. | Retry after the time in the Retry-After header, or with exponential backoff if there’s none. |
1When a product isn’t granted or doesn’t exist, the Smart Layer Tile Service returns 403 or 404. The NDS.Live Registry returns 200 with an empty node list.
When you contact TomTom support, include the full request URL without your API key, the HTTP status code and the time of the request in UTC.
Error messages
An error response can have a body that says what went wrong. The formats aren’t aligned yet, and the messages can change, so rely on the HTTP status code only. Depending on which part of TomTom’s platform answers, the body has one of these JSON formats:
{ "message": "Requested layer id 5 was not found", "code": 404}{ "detailedError": { "code": "Unauthorized", "message": "You are missing valid authentication credentials" }}{ "timestamp": "2026-10-12T10:04:31.466Z", "status": 404, "error": "Not Found", "path": "/eval/6/ADAS-road-2026-06/XXX-000000000000/getTileServiceCapabilities"}The table lists the errors seen on TomTom’s ADAS Road Model evaluation service, with their cause:
| Code | Message | Cause | What to do |
|---|---|---|---|
204 | (empty body) | The tile has no data, is outside the area your product covers, or is at a level the service doesn’t serve. | Check the tile’s level against the service’s supportedLevels. |
400 | Required request body is missing: | The request has no body. | Send the zserio-encoded request object as the body. |
400 | Could not convert the input from the message to ZSerio format | The body isn’t a valid zserio object, or is incomplete. | Encode the body with code generated from the NDS.Live schema. |
400 | (empty body) | The tile ID is at a level the service rejects, such as 15. | Request tiles at a level the service serves. |
401 | You are missing valid authentication credentials | The apiKey query parameter is missing or the key is invalid. | Check the apiKey query parameter. If it’s correct, check in My.TomTom that the key still exists and wasn’t rotated, and use its current value. Then retry once. |
403 | You are not allowed to access this endpoint | The API key is valid, but doesn’t have the NdsLive API, or the entitlements for this endpoint. | Add the NdsLive API to your key in My.TomTom. If your key already has it, contact TomTom to check your entitlements. |
404 | (empty body) | The tile is outside the service’s coverage area, or the method name is wrong. | Check the method name and the service’s spatial extent. |
404 | Not Found, with the request path | The endpoint URL doesn’t match a service. | Check the endpoint URL. |
404 | Requested layer id … was not found | The service doesn’t have the layer ID you requested. | Check the layer IDs in the service definition. |
404 | Requested layer version … was not found | The layer version you sent isn’t the current one. | Read the current version from the tile header. |
405 | Request method ‘GET’ is not supported | Wrong HTTP method. | Use POST. |
415 | Content-Type ’…’ is not supported | The Content-Type request header is wrong. | Set Content-Type to application/x-zserio-object. |
Why 410 matters
A Smart Layer Tile Service can be permanently shut down (decommissioned). This can happen, for example, when TomTom moves to a module version that older map data components can’t read. From then on, every method of that service returns 410. There’s no grace period: discard all data your map data component cached from that service.
What happens next depends on how your map data component finds its services:
- Through the NDS.Live Registry — your map data component switches to the replacement on its own, with no change to its code or configuration.
- With a hardcoded service URL, as in an evaluation setup — your map data component stops getting data until you replace the URL in its code or configuration. In a vehicle, that means shipping an update. Get the new URL from the NDS.Live Registry. TomTom also tells you about the decommissioning by email.
A file store isn’t affected, because your integration reads it locally and doesn’t call the service.
Tracking IDs
Every response from the TomTom API gateway, which sits in front of the Smart Layer Tile Services, has a Tracking-Id header that identifies the request. If you send your own Tracking-Id request header, the response returns the same value. Otherwise, the gateway generates one.
A file that a method redirects you to comes from a content delivery network and has no Tracking-Id. For those methods, the tracking ID is in the 303 response. If your HTTP client follows redirects without showing the 303, set your own Tracking-Id request header, so you know the ID.
When you report a problem with a request, include its tracking ID.
Keeping tiles up to date
Map data changes over time: TomTom updates the map regularly, and every layer in a tile carries a version and a lifetime. A map data component that downloads every tile again to stay current wastes bandwidth, which is costly on a vehicle’s mobile data connection, and takes longer to get the data that did change. For example, a full request for one level-13 tile returned about 360 KB. A delta request for the same, unchanged tile returned 637 bytes.
Three patterns help your map data component find out what changed and download only those changes:
- Conditional requests — get a resource only if it changed since your last request
- Header-only checks — read a tile’s layer versions without downloading its payload
- Delta updates — get only the layers of a tile that changed
Conditional requests
A conditional request returns a resource only if it changed since your last request. If nothing changed, the service returns 304, and your map data component keeps its cached copy. You can send conditional requests with these methods:
getRegistryMetadata doesn’t support conditional requests, although its OpenAPI description lists them.
Header-only checks
getHeaderOnlyByTileId returns only a tile’s header, with its layer versions and lifetime, and no payload. Use it to check whether a tile changed before you download it.
Delta updates
To get only the layers of a tile that changed since your map data component last downloaded it, use getDeltaLayerByTileId.
Related resources
- Smart Layer Tile Service: the list of methods
- Access and accounts: Your endpoints
- Endpoint quick start: Step 4: SLS endpoint check
getLayerByTileIdgetHeaderOnlyByTileIdgetDeltaLayerByTileIdgetSingleDataLayerByTileIdgetServiceDefinitiongetServiceModuleDefinitiongetServiceNodeLegalInfogetServiceNodeSystemReferencegetTileServiceCapabilitiesgetSpatialExtentgetRegistryMetadata- Architecture overview: NDS.Live Registry
- Ways to get map data: streaming tiles from an endpoint compared with downloading a file store in bulk
- Access and accounts: get an API key with NDS.Live enabled
- zserio on GitHub
- OpenAPI Generator
- pack.nds.live