# Clarify API

> Guidelines for working with the Clarify CRM API - includes authentication, endpoints, pagination, filtering, and CRUD operations for records

- Skill: `clarifyhq/clarify-api` (Agent Skill)
- Install (CLI): `npx skillmds@latest add clarifyhq/clarify-api`
- Raw SKILL.md: https://api.skillmd.com/api/skills/clarifyhq/clarify-api/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- Author: clarifyhq (https://skillmd.com/u/clarifyhq)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/clarifyhq/clarify-api

---


# Clarify API

> **Note:** The Clarify API is under active development and subject to breaking changes. Contact support@clarify.ai with any questions.

## Root URL

```
https://api.clarify.ai/v1/workspaces/{slug}/*
```

The `slug` is the workspace ID assigned to the customer's organization. You can find it in the URL when logging in or by clicking your avatar in the application.

## Authentication

### API Key Authentication

1. Generate a new API key from workspace settings. Generated keys have admin level permissions to your workspace:
   - They have access to records within the workspace and can read, write, and delete data
   - They only have access to redacted email metadata, sensitive fields like bodies are not available
   - They have the same permissions for viewing meeting data as other users

2. Include this API key in the `Authorization` header with the `api-key` scheme:

```bash
curl --header "Authorization: api-key $APIKEY" \
  https://api.clarify.ai/v1/workspaces/$WORKSPACE_SLUG/schemas
```

### Partner OAuth 2.0 Authentication

Clarify uses OAuth and supports Authorization Code, Authorization Code with PKCE, and Refresh Token grants.

**OAuth Endpoints:**
- Authorization: `https://auth1.clarify.ai/oauth2/authorize`
- Token: `https://auth1.clarify.ai/oauth2/token`
- Refresh Token: `https://auth1.clarify.ai/oauth2/token`
- Scopes: `openid profile email offline_access`

**OAuth Flow:**

1. Get authorization code:
```http
GET https://auth1.clarify.ai/oauth2/authorize?response_type=code&client_id={your_client_id}&scope=openid%20profile%20email%20offline_access&redirect_uri={your_redirect_url}
```

2. Exchange for tokens:
```http
POST https://auth1.clarify.ai/oauth2/token
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
code={your-code}
redirect_uri={your_redirect_uri}
client_id={your_client_id}
client_secret={your_client_secret}
```

3. Use access token in API calls:
```
Authorization: Bearer {access-token}
```

## API Structure

The API follows the [JSON:API spec](https://jsonapi.org/).

### Pagination

Maximum response size is 1000 items.

**Request:**
- `page[limit]={number}` — maximum number of items to return

**Response fields:**
- `data` — array of returned items
- `meta` — pagination metadata: `total_records`, `total_pages`, `offset`, `limit`
- `links` — URL references: `prev` (if available), `next` (if available)

### Ordering

Control record order with the `sortOrder` query parameter:
- `sortOrder[column]` — field name to order by
- `sortOrder[dir]` — direction: `ASC` or `DESC`

### Filtering

Filter records with `filter` query parameters. Conditions are always AND (OR not supported).

**Basic syntax:**
```
filter[{field_name}]={field_value}
```

**Advanced syntax with operators:**
```
filter[{field_name}][{operator}]={field_value}
```

**Supported operators by field type:**

| Field Type | Operators |
|------------|-----------|
| Text, Multiline Text | `Is`, `Is not`, `Contains`, `Does not contain`, `Starts with`, `Ends with` |
| Number, Currency | `Is`, `Greater than`, `Less than`, `Greater than or equal`, `Less than or equal` |
| Dates | `Is`, `Is after`, `Is before`, `Is on or after`, `Is on or before` |
| Single select | `Is`, `Is not`, `One of`, `Not one of` |
| Multi select | `Contains`, `Does not contain` |
| Checkbox | `Is`, `Is not` |
| Location | `Contains`, `Does not contain` |
| Record IDs | `Is`, `Is not` |
| Collections (Email, Domains) | `Contains`, `Does not contain` |

## Endpoints

### Get Objects & Schemas

```http
GET /schemas
```

Returns an array of schema JSONs:
- `core/*` — internal schemas referenced in other schemas
- `entities/*` — objects available: company, deal, meeting, meeting_recording, person, task, user

Each entity has its JSON Schema definition in the `attributes` field.

### Get Records

```http
GET /objects/{object}/resources
```

**Parameters:**
- `sortOrder` — field to order by with optional direction
- `filters` — one or more criteria to filter records
- `include` — comma-separated list of relationship fields to include

### Create Record

```http
POST /objects/{object}/records
```

**Request body:**
```json
{
  "data": {
    "type": "{object}",
    "attributes": {
      "{field-name}": "{field-value}"
    }
  }
}
```

**Unique fields for upsert behavior:**

| Object | Unique Field |
|--------|--------------|
| Person | `email_addresses` (any one) |
| Company | `domains` (any one) |
| Deal | `name` |
| Meeting | N/A |
| Meeting Recording | N/A |
| User | N/A |

### Get Record

```http
GET /objects/{object}/records/{id}
```

**Parameters:**
- `include` — comma-separated list of relationship fields to include

### Update Record

```http
PATCH /objects/{object}/records/{id}
```

**Request body:**
```json
{
  "data": {
    "id": "{id}",
    "type": "{object}",
    "attributes": {
      "{field-name}": "{field-value}"
    }
  }
}
```

### Bulk Upsert Records

```http
POST /objects/{object}/records/bulk
```

**Request body:**
```json
{
  "data": [{
    "type": "{entity}",
    "attributes": {
      "{field-name}": "{field-value}"
    }
  }]
}
```

### Bulk Delete Records

There is no way to bulk delete records today.

### Set Relationship

```http
PATCH /objects/{object}/records/{id}/relationships/{field-name}
```

**Request body:**
```json
{
  "data": [
    {
      "id": "{id-of-record-to-associate}",
      "type": "{object}"
    }
  ]
}
```

### Unset Relationship

```http
DELETE /objects/{object}/records/{id}/relationships/{field-name}
```

**Request body:**
```json
{
  "data": [
    {
      "id": "{id-of-record-to-disassociate}",
      "type": "{object}"
    }
  ]
}
```

### Get Recording Artifacts

```http
POST /meetings/{id}/recordings/{id}/artifacts
```

**Response:**
```json
{
  "data": {
    "videoUrl": "{signed-video-url}",
    "transcriptionUrl": "{signed-transcription-url}"
  }
}
```

## Swagger Documentation

Full API documentation: https://api.clarify.ai/swagger

