---
title: Regions and base URLs
description: Every Coevera space lives in one of four regions. Its base URLs name the region and the space, and the discovery endpoint finds them from the space ID alone.
canonical: https://developers.coevera.com/get-started/regions-and-base-urls/
section: get-started
verification: behaviour
lastVerified: 2026-10-15
publisher: Coevera
---

# Regions and base URLs

**Answer:** Every space lives in one of four regions: us-east, eu-central, ca-central or ap-southeast. Call https://{region}.api.coevera.com/api/v100/rest/spaces/{space_id}, with the host from Show Access › Service URL or from GET /api/discovery/spaces/{space_id}, which needs no credentials. A call to another region's host still works: it is forwarded, only slower.

A space's data stays in the region the customer chose, and its API answers there. Your base URL
names that region and the space.

## Regions

| Region         | Name         | Data centre        | REST base URL                                                          |
| -------------- | ------------ | ------------------ | ---------------------------------------------------------------------- |
| `us-east`      | US East      | Virginia, USA      | `https://us-east.api.coevera.com/api/v100/rest/spaces/{space_id}`      |
| `eu-central`   | EU Central   | Frankfurt, Germany | `https://eu-central.api.coevera.com/api/v100/rest/spaces/{space_id}`   |
| `ca-central`   | CA Central   | Toronto, Canada    | `https://ca-central.api.coevera.com/api/v100/rest/spaces/{space_id}`   |
| `ap-southeast` | AP Southeast | Sydney, Australia  | `https://ap-southeast.api.coevera.com/api/v100/rest/spaces/{space_id}` |

The data centres are the ones the [Coevera security page](https://www.coevera.com/security/)
lists, which also says that customer data is not moved between regions.

Take the host from **Service URL** in **Show Access**, or from the discovery endpoint below. Do
not build it by hand from the space ID. Each region's host has the form
`{region}.api.coevera.com`, the form the discovery endpoint returns.

## Base URLs

| What                   | URL                                                                                                                                         |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| REST                   | `https://{region}.api.coevera.com/api/v100/rest/spaces/{space_id}`                                                                          |
| GraphQL                | `https://{region}.api.coevera.com/api/v100/app/space/{space_id}/graphql/public`, `POST` only: a `GET` answers `405`                         |
| OpenAPI for your space | `…/rest/spaces/{space_id}/openapi.json`. It needs your credentials and is built for your space, with its custom fields and custom entities. |
| Public GraphQL schema  | `…/graphql/public/schema.json`, the introspection result as JSON. It needs no credentials.                                                  |
| Version                | `v100`, the only API version; see [Versioning and deprecation](/changelog/versioning-and-deprecation/).                                     |

The published contract, without your space's custom fields, is in the [REST](/reference/rest/)
and [GraphQL](/reference/graphql/) reference and its [downloads](/reference/downloads/).

## Find a space's region

The discovery endpoint answers `GET /api/discovery/spaces/{space_id}`. It needs no credentials,
and each of the four regional hosts answers it for every space, so the request works whichever
region the context bar shows. It returns the space's region and its REST and GraphQL URLs:

**REST · cURL**

```bash
DISCOVERY_URL="https://{region}.api.coevera.com/api/discovery/spaces/{space_id}"

# Public: no credentials. Prints the region's host and the space's REST base URL.
curl -sS --fail-with-body "$DISCOVERY_URL" | jq -r '.region_url, .rest.space.endpoint'
```

**REST · TypeScript**

```ts
import process from "node:process";

const discoveryUrl = `https://{region}.api.coevera.com/api/discovery/spaces/{space_id}`;

// Public: no credentials.
const res = await fetch(discoveryUrl);
const space = await res.json();
if (!res.ok) {
  console.error(`HTTP ${res.status} ${space.name}: ${space.message}`);
  process.exit(1);
}
console.log(space.region_url);
console.log(space.rest.space.endpoint);
```

**REST · Python**

```python
import os
import sys

import requests

DISCOVERY_URL = "https://{region}.api.coevera.com/api/discovery/spaces/{space_id}"

# Public: no credentials.
response = requests.get(DISCOVERY_URL, timeout=30)
space = response.json()
if not response.ok:
    sys.exit(f"HTTP {response.status_code} {space.get('name')}: {space.get('message')}")
print(space["region_url"])
print(space["rest"]["space"]["endpoint"])
```

**GraphQL · cURL**

```bash
DISCOVERY_URL="https://{region}.api.coevera.com/api/discovery/spaces/{space_id}"

# Public: no credentials. Prints the region's host and the space's GraphQL endpoint.
curl -sS --fail-with-body "$DISCOVERY_URL" | jq -r '.region_url, .graphql.space.endpoint'
```

**GraphQL · TypeScript**

```ts
import process from "node:process";

const discoveryUrl = `https://{region}.api.coevera.com/api/discovery/spaces/{space_id}`;

// Public: no credentials.
const res = await fetch(discoveryUrl);
const space = await res.json();
if (!res.ok) {
  console.error(`HTTP ${res.status} ${space.name}: ${space.message}`);
  process.exit(1);
}
console.log(space.region_url);
console.log(space.graphql.space.endpoint);
```

**GraphQL · Python**

```python
import os
import sys

import requests

DISCOVERY_URL = "https://{region}.api.coevera.com/api/discovery/spaces/{space_id}"

# Public: no credentials.
response = requests.get(DISCOVERY_URL, timeout=30)
space = response.json()
if not response.ok:
    sys.exit(f"HTTP {response.status_code} {space.get('name')}: {space.get('message')}")
print(space["region_url"])
print(space["graphql"]["space"]["endpoint"])
```

This is the response for a space in eu-central:

**Recorded response · REST · 200 OK**

```json
{
  "space_id": "nv2_northwind_docs",
  "region_url": "https://eu-central.api.coevera.com",
  "space_version": 100,
  "server_time": "2026-10-15T09:00:00",
  "graphql": {
    "space": {
      "endpoint": "https://eu-central.api.coevera.com/api/v100/app/space/nv2_northwind_docs/graphql/public",
      "schema": "https://eu-central.api.coevera.com/api/v100/app/space/nv2_northwind_docs/graphql/public/schema.json"
    }
  },
  "rest": {
    "space": {
      "endpoint": "https://eu-central.api.coevera.com/api/v100/rest/spaces/nv2_northwind_docs",
      "schema": "https://eu-central.api.coevera.com/api/v100/rest/spaces/nv2_northwind_docs/openapi.json"
    }
  }
}
```

**Recorded response · GraphQL · 200 OK**

```json
{
  "space_id": "nv2_northwind_docs",
  "region_url": "https://eu-central.api.coevera.com",
  "space_version": 100,
  "server_time": "2026-10-15T09:00:00",
  "graphql": {
    "space": {
      "endpoint": "https://eu-central.api.coevera.com/api/v100/app/space/nv2_northwind_docs/graphql/public",
      "schema": "https://eu-central.api.coevera.com/api/v100/app/space/nv2_northwind_docs/graphql/public/schema.json"
    }
  },
  "rest": {
    "space": {
      "endpoint": "https://eu-central.api.coevera.com/api/v100/rest/spaces/nv2_northwind_docs",
      "schema": "https://eu-central.api.coevera.com/api/v100/rest/spaces/nv2_northwind_docs/openapi.json"
    }
  }
}
```

_Recorded on 2026-10-15 against API 6.5.2 in the docs sandbox, de-identified._

| Field                                            | What it holds                                      |
| ------------------------------------------------ | -------------------------------------------------- |
| `region_url`                                     | The host of the space's region                     |
| `space_version`                                  | `100`, the platform version of every current space |
| `server_time`                                    | The server's clock, in UTC                         |
| `rest.space.endpoint`, `rest.space.schema`       | The REST base URL and the space's OpenAPI document |
| `graphql.space.endpoint`, `graphql.space.schema` | The GraphQL endpoint and the public schema         |

An unknown space answers `404` with `ERROR_NO_ENTITY` (code `143`). A space that is not on the
current platform answers `400` with `ERROR_UNKNOWN_VERSION` (code `7`).

Ask a `coevera.com` host: the URLs in the answer use the domain of the host you ask. The
[migration page](/support/migrating-from-pipeliner/) covers the former domain.

## Calling the wrong region

> **It still works, just more slowly:** REST and GraphQL calls sent to another region's host are forwarded to the region that holds the
> space. The forwarded call answers `200` with the normal body; there is no redirect, and the same
> credentials work. Every call takes an extra hop. Set the right region in the context bar and in
> your configuration.

How much slower depends on where you call from. From Central Europe, a call to a space in
eu-central takes about 0.2 s through its own host, about 1 s through the us-east host and 2.5 to
3.6 s through the ap-southeast host. Use the region the discovery endpoint returns.

## Limits

- A space lives in exactly one region, and every URL carries its space ID. There is no API
  across spaces: a credential works in one space only.
- Read the host from the discovery endpoint or from **Show Access**; do not hard-code a region
  per customer.
- The MCP server for AI assistants runs in the United States for every space; see
  [Hosting and your data](/ai/hosting-and-data/).
