# Regions & endpoints (/arpc/regions)

> All nine aRPC Solana streaming endpoints, from Frankfurt to Tokyo, and how to pass them to a gRPC client.



aRPC runs in **all nine Corvus metros**, and every endpoint follows the same shape:

```text
http://arpc.<region>.corvus-labs.io:20202
```

| Metro               | Code  | aRPC endpoint                          |
| ------------------- | ----- | -------------------------------------- |
| 🇩🇪 Frankfurt      | `fra` | `http://arpc.fra.corvus-labs.io:20202` |
| 🇳🇱 Amsterdam      | `ams` | `http://arpc.ams.corvus-labs.io:20202` |
| 🇬🇧 London         | `lon` | `http://arpc.lon.corvus-labs.io:20202` |
| 🇮🇪 Dublin         | `dub` | `http://arpc.dub.corvus-labs.io:20202` |
| 🇱🇹 Šiauliai       | `sqq` | `http://arpc.sqq.corvus-labs.io:20202` |
| 🇺🇸 New York       | `nyc` | `http://arpc.nyc.corvus-labs.io:20202` |
| 🇺🇸 Salt Lake City | `slc` | `http://arpc.slc.corvus-labs.io:20202` |
| 🇯🇵 Tokyo          | `tyo` | `http://arpc.tyo.corvus-labs.io:20202` |
| 🇸🇬 Singapore      | `sgp` | `http://arpc.sgp.corvus-labs.io:20202` |

Every hostname resolves, but you're only allowlisted in the regions you've rented; your [dashboard](https://dashboard.corvus-labs.io) shows which.

## Pass the endpoint to a gRPC client

Keep the `http` scheme, never `https` ([transport security](/platform/access#transport-security)). tonic takes the URL directly. `@grpc/grpc-js` dials a bare `host:port` target, so hand it the URL's `host`:

<Tabs items={['TypeScript', 'Rust (tonic)']}>
  <Tab value="TypeScript">
    ```javascript
    const { host } = new URL('http://arpc.fra.corvus-labs.io:20202');

    const client = new arpc.ARPCService(host, grpc.credentials.createInsecure());
    ```
  </Tab>

  <Tab value="Rust (tonic)">
    ```rust
    // No TLS config on the channel.
    let channel = Channel::from_static("http://arpc.fra.corvus-labs.io:20202")
        .connect()
        .await?;
    ```
  </Tab>
</Tabs>

## Pick a region

Choose by measured round trip from the host that will actually run the client.

aRPC covers nine metros to Solana RPC's five ([regions](/platform/regions)), so if you stream from a metro where Solana RPC isn't offered, your confirmation calls will go to a different region than your stream.

## Fail over

A region that loses its aRPC backend fails over on its own: the endpoint keeps serving from a healthy region, rented or not. There's still no replay, so every reconnect starts from scratch: open a new stream, re-register your complete filter set, wait for the `FilterValidationResult` messages if you're on v2, and reset that stream's `sequence` baseline.
