# Federation Supergraph

You can use GraphQL Mesh as a [Federation](https://the-guild.dev/graphql/hive/federation] supergraph
in multiple ways. You can either provide each source, and let Mesh build your supergraph, or you can
provide prebuilt Supergraph SDL.

## Consuming prebuilt Supergraph SDL

If you use Apollo Rover CLI or [GraphQL Hive](https://the-guild.dev/graphql/hive) to compose your
subgraphs, you can easily consume the prebuilt supergraph SDL by using Supergraph handler;

```sh npm2yarn
npm i @graphql-mesh/supergraph
```

```yaml
sources:
  - name: Supergraph
    handler:
      supergraph:
        source: http://some-source.com/supergraph.graphql # it can be a path from the file system `./supergraph.graphql`
        schemaHeaders:
          myTokenHeader: MY_TOKEN_VALUE
```

### Configuring subgraphs within the supergraph

You can also configure subgraphs within the supergraph by providing the subgraph name in order to
change the endpoint and headers for each subgraph.

```yaml
sources:
  - name: Supergraph
    handler:
      supergraph:
        source: http://some-source.com/supergraph.graphql
        subgraphs:
          - name: accounts
            endpoint: http://localhost:9871/graphql
            operationHeaders: # You can use context variables here
              Authorization: "Bearer {context.headers['x-accounts-token']}"
          - name: reviews
            endpoint: '{env.REVIEWS_ENDPOINT:https://default-reviews.com/graphql}'
            operationHeaders:
              Authorization: "Bearer {context.headers['x-reviews-token']}"
```

### Config API Reference

import API from '../../../generated-markdown/SoapHandler.generated.md'

<API />

## Using Mesh to build the supergraph

You can provide the existing subgraphs within GraphQL Mesh, or you can use
[Federation Subgraph](/docs/transforms/federation) to create subgraphs from regular sources.

```yaml
sources:
  - name: accounts
    handler:
      graphql:
        endpoint: http://localhost:9871/graphql
    transforms:
      - federation:
          types:
            - name: User
              config:
                key:
                  - fields: id
                resolveReference:
                  queryFieldName: user
                  args:
                    id: '{root.id}'
  - name: reviews
    handler:
      graphql:
        endpoint: http://localhost:9872/graphql
  - name: products
    handler:
      graphql:
        endpoint: http://localhost:9873/graphql
  - name: inventory
    handler:
      graphql:
        endpoint: http://localhost:9874/graphql
```

> You can check
> [our working example on the repo.](https://github.com/ardatan/graphql-mesh/tree/master/examples/federation-example)
