---
title: "Work with several forges"
description: "Register several providers and route calls by ref or by URL."
canonical_url: "https://docs-8831a2g1f-poetry.vercel.app/guides/multiple-forges"
---
# Work with several forges

> Register several providers and route calls by ref or by URL.

`createForges()` takes a list of factories, or of providers you already created. It builds the providers and returns an object that routes calls:

```ts
import { createForges, github, gitlab } from 'forges'

const forges = createForges([
  github({ auth: { type: 'token', token: process.env.GITHUB_TOKEN! } }),
  gitlab({ auth: { type: 'token', token: process.env.GITLAB_TOKEN! } }),
])
```

## Route by ref

Every ref carries `forge` and `instance`. Calls such as `forges.threads.get(ref)` and `forges.repos.get(ref)` go to the provider that matches. A ref for an unregistered forge throws `UnknownForgeError`.

To get the provider itself, use `forges.for(ref)`, `forges.get('github')`, or `forges.all('gitlab')`:

```ts
const provider = forges.for(thread.ref)
if (provider?.can('threads.close', thread.ref.kind)) {
  await provider.threads.close(thread.ref)
}
```

## Read a pasted URL

`forges.parseUrl()` turns a web URL on any registered instance into refs. It returns `undefined` for a URL that no provider serves:

```ts
const parsed = forges.parseUrl('https://github.com/nuxt/nuxt/issues/1')

if (parsed?.thread) {
  const thread = await parsed.provider.threads.get(parsed.thread)
}
```

The reverse is `provider.urlFor()`, which builds a web URL from a ref without a request.

## Fan out reads

Some calls run on every provider that supports them:

- `forges.notifications.list()` lists notifications provider by provider.
- `forges.search.threads()` and `forges.search.repos()` read one page from each provider that supports search, and merge the results, newest first. A provider that fails adds a warning and no items.
- `forges.threads.getMany()` groups refs by provider and keeps the input order.

## Run two instances of one forge

A provider takes its instance from the host of `baseUrl`, so github.com and a GitHub Enterprise Server can be registered together:

```ts
const forges = createForges([
  github({ auth: personal }),
  github({ baseUrl: 'https://ghe.example.com/api/v3', auth: work }),
])
```

`createForges()` throws when two providers share a forge and an instance. To register two providers for the same host, pass a different `instance` to one of them.


## Sitemap

See the full [sitemap](https://docs-8831a2g1f-poetry.vercel.app/sitemap.md) for all pages.
