Developers
Set your API contextPick a region and space ID once. Every sample fills in your base URL.
Where do I find these?

In Coevera: open your space's API application and choose Show Access. It shows the space ID and the base URL, whose host starts with your region.

From the API: if you know the space ID, the discovery endpoint GET /api/discovery/spaces/{space_id} returns its region and base URLs, without credentials.

Only the region and space ID are kept, in this browser. Never paste a key or password here.

More in the quickstart

Coevera Developers

Build on the Coevera CRM API

REST and GraphQL APIs, webhooks, and an MCP server for AI assistants, with examples that work when you copy them.

curl -sS --fail-with-body -G "$COEVERA_BASE/entities/Accounts" \
  -d first=3 \
  -d load-only=id,name,email1,modified \
  -u "$COEVERA_API_KEY:$COEVERA_API_SECRET"
const params = new URLSearchParams({ first: "3", "load-only": "id,name,email1,modified" });
const res = await fetch(`${base}/entities/Accounts?${params}`, {
  headers: { Authorization: `Basic ${auth}` },
});
const body = await res.json();
if (!res.ok) throw new Error(`HTTP ${res.status} ${body.name}: ${body.message}`);
console.log(JSON.stringify(body, null, 2));
response = requests.get(
    f"{BASE}/entities/Accounts",
    params={"first": 3, "load-only": "id,name,email1,modified"},
    auth=AUTH,
    timeout=30,
)
body = response.json()
if not response.ok:
    sys.exit(f"HTTP {response.status_code} {body.get('name')}: {body.get('message')}")
print(json.dumps(body, indent=2))
curl -sS --fail-with-body "$COEVERA_GRAPHQL" \
  -u "$COEVERA_API_KEY:$COEVERA_API_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"query": "{ entities { account { getByCriteria(first: 3) { totalCount pageInfo { hasNextPage endCursor } edges { node { id name email1 modified } } } } } }"}'
const res = await fetch(endpoint, {
  method: "POST",
  headers: { Authorization: `Basic ${auth}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    query: `{
      entities {
        account {
          getByCriteria(first: 3) {
            totalCount
            pageInfo { hasNextPage endCursor }
            edges { node { id name email1 modified } }
          }
        }
      }
    }`,
  }),
});
const body = await res.json();
// GraphQL reports errors in the body, often with HTTP 200: check both.
if (!res.ok || body.errors) throw new Error(`HTTP ${res.status}: ${JSON.stringify(body.errors ?? body)}`);
console.log(JSON.stringify(body.data, null, 2));
QUERY = """
{
  entities {
    account {
      getByCriteria(first: 3) {
        totalCount
        pageInfo { hasNextPage endCursor }
        edges { node { id name email1 modified } }
      }
    }
  }
}
"""
response = requests.post(ENDPOINT, json={"query": QUERY}, auth=AUTH, timeout=30)
body = response.json()
# GraphQL reports errors in the body, often with HTTP 200: check both.
if not response.ok or body.get("errors"):
    sys.exit(f"HTTP {response.status_code}: {json.dumps(body.get('errors', body))}")
print(json.dumps(body["data"], indent=2))

Choose your path

Start where your integration starts. Guides and recipes show REST and GraphQL side by side.

REST API

CRUD, batch and merge on 212 entities. JSON over HTTPS with Basic auth.

GraphQL

One endpoint, 219 repositories, and business actions such as qualify and move.

Webhooks

138 events with HMAC-SHA256 signatures, retries over about 24 hours.

AI & MCP

Connect Claude or ChatGPT to a Coevera space through the MCP server.

Integrations

Zapier and Power Platform when you would rather not write code.

All recipes

Latest API changes

Changelog

Written for people and for AI assistants

Every page has a Markdown twin at the same URL plus .md. Point your assistant at llms.txt for the index.