> 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/_mcp/server. Resource Links are part of the [Cross-space references](https://www.contentful.com/help/references-across-spaces) feature set that allows you to link content across multiple spaces. It mainly uses `ResourceLink` links as a way to represent a relationship between entities from different spaces. `ResourceLink` links are represented as a `sys` object containing `urn`, `linkType` and `type`: | Property | Description | | -------------- | ---------------------------------------------------------------------------------------------------------------------- | | `sys.linkType` | Represents what kind of entity this resource links to. For cross-space entries the value is `Contentful:Entry`. | | `sys.type` | The type of Link. `ResourceLink` is the default for cross-space resources. | | `sys.urn` | The location of the resource. A [CRN](/references/content-management-api/overview) to a Contentful environment entity. | As they are part of another space, resolving cross-space linked entities requires a special header to be passed in each request named `x-contentful-resource-resolution`. #### Extra header for cross-space resolution The `x-contentful-resource-resolution` header is a *base64 encoded JSON object* containing key-value pairs of spaceId/API Key. The plain JSON used to create the header should have the following shape: ```json { "spaces": { "someSpaceId": "", "anotherSpaceId": "" } } ``` > **Info** > > For the Content Preview API, the \ is \. For the Content Delivery API, the \ is \. That then needs to be *stringified* and encoded to base64. You can use `JSON.stringify` and `btoa` (JavaScript) to properly convert the JSON object to a stringified encoded version of it. Here is a full example in JavaScript: ```js const extraTokens = { "spaces": { "IdToR3s0lv3": "ND63YKcYBe335RWDnIuzv...", "4n0th3rSp4c3": "UuVe6icuBuXv..." } } // Converts object to string and uses base64 to encode the string window.btoa(JSON.stringify(extraTokens)) // eyJzcGFjZXMiOnsiSWRUb1I[...]= ``` The value can then be passed to the `x-contentful-resource-resolution` header as-is. All cross-space references of matching space IDs will be returned within the `includes` property of the response. #### Capabilities * The `locale` query parameter is propagated to all extra spaces present in the new header. * Only the first level of references of every extra space in the new header will be resolved. It applies to only one level of space. This is a behavior similar to `include=1`. * The main space (space Id being requested in the URL) will still resolve up to 10 levels. * Publishing new content in any of the extra spaces will cause the cache to be purged on every request that included that space Id. * The `includes` property of the response will include both cross-space entries and assets. * You can pass this new header in the Javascript SDK for automatic resolution. #### Errors Errors from cross-space requests are propagated back to the response payload in the `errors` property. If a request to a single cross-space fails, the main space request and other spaces will still continue to process. | HTTP Status Code | Description | | ---------------- | ------------------------------------------------------------------------------ | | `401` | Missing `Authorization` header | | `400` | Incorrect format for the `x-contentful-resource-resolution` header. | | `400` | Number of extra spaces in the header exceeds the maximum allowed number (`20`) | ##### Errors property example ```json { "errors": [ { "details": { "urn": "crn:contentful:::content:spaces//environments//entries/", "linkType": "Contentful:Entry", "type": "ResourceLink" }, "sys": { "id": "notResolvable", "type": "error" } } ] } ``` #### Limitations * Up to `21` spaces to be resolved in a single request * Only `20` extra space tokens are supported. You can make a single API call that resolves up to `21` spaces at the same time: `20` extra spaces and the entries from the space Id in the initial request. * Up to `1000` references in the `includes` property in the response. * Only the first level of cross-space references is resolved from the original spaceId in the URL * The `Authorization` header is still required for every request and it should enable access to the main space Id in the URL. * Errors from the extra space tokens will be returned in the `errors` property of the response. * Using the new header will also consume the Rate Limiting from the space Ids present in it when the request is *uncached*. * No [Advanced Caching](/platform/advanced-caching) support * No [MRDI](/platform/mrdi) support For more information, see the [Resource Links FAQs](https://www.contentful.com/help/resource-links-faqs). ## Retrieval of linked Resource Links **Notes**: * The `include` parameter resolves links between entries and assets within a space. Links between content types within a space are not included in the response. * The `include` parameter is only available for the entry collection endpoint `/spaces/{space_id}/environments/{environment_id}/entries`. To retrieve linked Resource Links, use the [Get all entries of a Space](/references/content-preview-api/entries/get-all-entries) endpoint.