> This page is for API Reference.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://contentful.com/developers/docs/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://contentful.com/developers/docs/_mcp/server.

# Introduction

> **Info**
>
> **In active development:** The Destinations Delivery API is shared with design partners while it is being built out. The shape of resources and endpoints may change before general availability.

The Destinations Delivery API, available at *xdn.contentful.com*, is a read-only API that returns the published routing tree of a Destination as a flattened sitemap and resolves Destination paths or Destination Node IDs to hydrated Experiences. Experience resolution can include optional personalization input.

Destinations, their Destination Nodes, and the Channel they implement are authored and published with the [Destinations Management API](/developers/docs/references/experience-management-api/destinations-management).

## Basic API information

API base URL `https://xdn.contentful.com`
*This is a read-only API*

## Authentication

The API is securely accessed via HTTPS. Pass a bearer token in the `Authorization` header or use the `access_token` query parameter.

Do not expose tokens in client-side source code. Query-string tokens can appear in logs and browser history, so prefer the `Authorization` header where possible.

## Environment scope

The route doesn't include an environment segment, so the API always resolves the `master` environment. Selecting another environment through a path or query parameter isn't supported.

## Sitemap response

The published form of a Destination is a flattened sitemap — one entry per routable path, each naming the experience served at that path. The nesting of Destination Folder Nodes is resolved away, so a client reads a single list rather than walking a tree.

The response has the following shape:

```json
{
  "property": {
    "sys": { "type": "Destination" }
  },
  "paths": {
    "sys": { "type": "Array" },
    "limit": 100,
    "items": [
      {
        "sys": { "type": "DestinationExperienceNode" },
        "path": "/products",
        "experienceUrn": "crn:contentful:::experience:spaces/$self/environments/$self/experiences/productIndex"
      }
    ],
    "pages": { "next": "bnVsbDoxMDA" }
  }
}
```

Each entry in `paths.items` includes the following fields:

| Field         | Type   | Description                                                    |
| ------------- | ------ | -------------------------------------------------------------- |
| sys.type      | String | Type of the Destination Node that claims this path             |
| path          | String | The path this entry routes                                     |
| experienceUrn | String | Contentful Resource Name of the experience served at this path |

## Experience resolution

The API can resolve a published Experience by absolute path or Destination Node ID. A successful resolution returns the hydrated Experience and child paths at the next depth level for lazy loading. If the path belongs to a Destination Redirect Node, the response contains the redirect target instead.

Both lookups offer a cacheable `GET` request for unpersonalized resolution and a `POST` request on the same URL for supplying personalization profile and event data:

| Lookup                 | Unpersonalized (`GET`)                                                      | Personalized (`POST`)                                                          |
| ---------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| By path                | `/spaces/{spaceId}/destinations/{destinationId}/experiences?path={path}`    | `/spaces/{spaceId}/destinations/{destinationId}/experiences` with `{ "path" }` |
| By Destination Node ID | `/spaces/{spaceId}/destinations/{destinationId}/nodes/{nodeId}/experiences` | Same URL, with an optional `extensions` body                                   |

### Resolving by path with GET

Pass the absolute path in the `path` query parameter. The path must start with `/`. URL-encode the value, for example with `encodeURIComponent`, so characters such as `&`, `#`, `+`, and `%` are not misread as query syntax:

```http
GET https://xdn.contentful.com/spaces/{spaceId}/destinations/{destinationId}/experiences?path=%2Fproducts%2Ffeatured
Authorization: Bearer {access_token}
```

The response has the same shape as the equivalent `POST` request. A missing or relative `path` returns **422 Unprocessable Entity**, and a path that does not resolve returns **404 Not Found**. The `GET` request does not accept a request body or personalization input; use `POST` for those.

## Pagination

The `paths` collection is cursor-paginated. The default page size is `100` and the maximum allowed limit is `1000`.

The `paths.pages` object contains a `next` key when there are further paths to fetch, and a `prev` key when you have paged forward. Pass the value back as the `pageNext` or `pagePrev` query parameter to retrieve that page. Treat the tokens as opaque, and do not send `pageNext` and `pagePrev` in the same request.

## Publish propagation

Publishing a Destination or one of its Destination Nodes rebuilds and uploads the delivery artifact asynchronously. A successful publish response from the Destinations Management API does not guarantee that this API has observed the new artifact yet, so poll for the paths you expect rather than reading once.

A **404 Not Found** immediately after a first publish can mean the artifact is still being written. A persistent **404** means no artifact has been uploaded for that Destination.

After a Destination is unpublished, the API stops serving its previous sitemap.