NDS.Live

Request and response patterns

Request access

Each 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:

URL request format
https://{serviceURL}/{method}?apiKey={Your_API_Key}
FieldDescription
serviceURLYour 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/
methodThe method name.
Example: getLayerByTileId.
Your_API_KeyA My.TomTom API key with NDS.Live services enabled.

For example, for the Intelligent Speed Assistance (ISA) evaluation endpoint from the Endpoint quick start:

ISA evaluation endpoint example
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.

Never hardcode an API key in a vehicle or a shipped map data component. You can only replace a hardcoded key with a software update to every copy of your map data component that has it, so you can’t rotate or revoke it quickly. Evaluation keys are fine to use from your own computer. For anything you ship, serve keys from a system that can issue, rotate and revoke them.

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 POST request, even if it takes no request body.
  • Fetch the service description, openapi.json, with GET.

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.

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:

ActionHow-to
Send a body• Encode the body with zserio
• Set the Content-Type header to application/x-zserio-object
Read a responseDecode 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:

Request body (hexadecimal)
20 82 71 FF

The response begins with the same tile ID, followed by the tile’s header: the number of layers, and their IDs.

Response body (beginning, hexadecimal)
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, 13

Because the bodies are binary, two common tools only partly work with this API:

  • curl: works for openapi.json, which is plain JSON. While curl is 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.

Building your own map data component

Generate the zserio serializer and deserializer for the programming language of your map data component at pack.nds.live. Your map data component then uses that code to encode request bodies and decode responses.
The NDS.Live SDK, the Smart Layer Client and MapViewer already include it, so you don’t need to generate anything to test or view the data.

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.

CodeMeaningWhat your map data component should do
200OK.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
204No 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.
206Partial content. The CDN answers a range request.Continue with the next range.
301, 307, 308The request was sent over plain HTTP, and the TomTom API gateway or the CDN redirects it to HTTPS.Always use HTTPS.
302, 303The 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.
304Not modified since the version you sent in If-None-Match.Keep using your cached copy.
400Bad 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.
401Unauthorized. 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.
4031Forbidden. 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.
4041Not 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.
405Method not allowed. Wrong HTTP method.Use POST, the HTTP method from the service’s OpenAPI description.
406Not acceptable. Wrong Accept header.Set Accept to the media type from the service’s OpenAPI description, typically application/x-zserio-object.
410Gone. 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.
413Payload too large. The request body sent to the NDS.Live Registry is too large.Reduce the size of the request.
415Unsupported media type. Wrong Content-Type header.Encode the body with zserio, and set Content-Type to application/x-zserio-object.
429Too 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.
500Internal server error.Retry with exponential backoff. If the error persists, contact TomTom support.
502, 504Bad gateway or gateway timeout. A service behind the gateway wasn’t reachable, or answered too slowly.Retry with exponential backoff.
503Service 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:

Error from the Smart Layer Tile Service
{
"message": "Requested layer id 5 was not found",
"code": 404
}
Error from the TomTom API gateway
{
"detailedError": {
"code": "Unauthorized",
"message": "You are missing valid authentication credentials"
}
}
Error for a path that doesn't match a service
{
"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:

CodeMessageCauseWhat 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.
400Required request body is missing:The request has no body.Send the zserio-encoded request object as the body.
400Could not convert the input from the message to ZSerio formatThe 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.
401You are missing valid authentication credentialsThe 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.
403You are not allowed to access this endpointThe 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.
404Not Found, with the request pathThe endpoint URL doesn’t match a service.Check the endpoint URL.
404Requested layer id … was not foundThe service doesn’t have the layer ID you requested.Check the layer IDs in the service definition.
404Requested layer version … was not foundThe layer version you sent isn’t the current one.Read the current version from the tile header.
405Request method ‘GET’ is not supportedWrong HTTP method.Use POST.
415Content-Type ’…’ is not supportedThe 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

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.

Delta updates work per layer, not as a byte-level difference: a changed layer comes back whole.