> 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.

# Resource Links

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 in the GraphQL Content API as a `sys` object containing `urn` and `linkType`:

| Property       | Description                                                                                                     |
| -------------- | --------------------------------------------------------------------------------------------------------------- |
| `sys.linkType` | Represents what kind of entity this resource links to. For cross-space entries the value is `Contentful:Entry`. |
| `sys.urn`      | The location of the resource. A [CRN](/concepts/external-references) 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": "<cda-token>",
    "anotherSpaceId": "<cda-token>"
  }
}
```

That then needs to be stringified and encoded to base64. You can use `JSON.stringify` and `btoa` (JavaScript) properly convert the JSON object to a stringified encoded version of it.

```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.

## Example query

```graphql
query pageEntryQuery {
  landingPage(id: "7wGhPNCZNLknpSaJVWfnHf") {
    # ResourceLink field
    headline {
      sys {
        urn
      }
      node {
        ... on Headline_SpaceB_Alias-1 {
          title
          # ResourceLink field, but does not resolve because only 1 level is supported.
          subheadline {
            sys {
              urn
            }
          }
        }
      }
    }
  }
}
```

## Capabilities

* The `locale` and `useFallbackLocale` query parameters are propagated to all extra spaces present in the `x-contentful-resource-resolution` header.
* Publishing new content in any of the extra spaces will cause the cache to be purged on every request that included that space ID.
* Cross-space queries support preview requests if the preview token is provided.

## Usage

Cross-space references can be resolved through the use of a special `node` field for content types which have a linked reference from another space. Fields of the referenced content type are accessed with an inline fragment with a type name in the following format: `{CONTENT_TYPE}_{SPACE}_{ENVIRONMENT}`.

```graphql
query {
  authorCollection {
    items {
      writings {
        node {
          ... on novel_4n0th3rSp4c3_Master {
            title
          }
        }
        # ResourceLink properties
        sys {
          linkType
          urn
        }
      }
    }
  }
}
```

## Limitations

* Up to 4 spaces can be resolved in a single request.
* Only `3` extra space tokens are supported. You can make a single API call that resolves up to `4` spaces at the same time: `3` extra spaces and the entries from the space ID in the initial request.
* Only the first level of cross-space references is resolved from the original space ID 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 `x-contentful-resource-resolution` header will also consume Rate Limiting from the space IDs present in it when the request is *uncached*.
* No [Advanced Caching](/platform/advanced-caching) support.

For more information, see the [Resource Links FAQs](https://www.contentful.com/help/resource-links-faqs).