> ## Documentation Index
> Fetch the complete documentation index at: https://docs.aefer.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Set up a customer

> Your API key, a workspace per customer, a webhook endpoint, and the company defaults: what gets recorded and how the notetaker looks.

Do this once for your integration, then once for each customer who turns on meetings.

## Your API key

Keep your key on your backend. Send it bare in `Authorization`, and pin the API version so
the shapes never change under you:

```bash theme={null}
export AEFER_API_KEY='your_api_key'

curl "https://api.aefer.ai/api/v1/workspaces" \
  -H "Authorization: $AEFER_API_KEY" \
  -H "Aefer-Version: 2026-11-13"
```

Every example in this guide sends `Aefer-Version: 2026-11-13`. Your account key
(`sk_live_…`) comes from \_æfer; it reaches the workspaces your account creates.

## A workspace per customer

Each of your customers gets its own workspace: their users, meetings, recording rules and
branding stay apart from every other customer's. Put your customer's id in
`client_reference_id`, unique in your account and fixed once set (a duplicate answers
`422 taken`):

```bash theme={null}
curl -X POST "https://api.aefer.ai/api/v1/workspaces" \
  -H "Authorization: $AEFER_API_KEY" \
  -H "Aefer-Version: 2026-11-13" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Acme Corp", "client_reference_id": "cus_4821" }'
```

Store the `wks_` id next to your customer. Every other call takes it as `workspace_id`.

`metadata` is yours, on workspaces, members, meetings, calendar events, bots, brand kits
and webhook endpoints: up to 50 keys, keys up to 40 characters, string values up to 500
characters. Updates merge; an empty string removes a key. \_æfer never acts on it,
and it comes back in every webhook that carries the object.

## A webhook endpoint

Register your endpoint in the workspace before its users connect a calendar: connecting
sends events straight away. Name each event you want; wildcards such as `meeting.*` are
rejected.

```bash theme={null}
curl -X POST "https://api.aefer.ai/api/v1/webhook_endpoints" \
  -H "Authorization: $AEFER_API_KEY" \
  -H "Aefer-Version: 2026-11-13" \
  -H "Content-Type: application/json" \
  -d '{
    "workspace_id": "wks_01k6a2r9s8x7c2dvq3m5n6p4ab",
    "url": "https://api.example.com/aefer/webhooks",
    "enabled_events": [
      "calendar_connection.connected", "calendar_connection.disconnected", "calendar_connection.error",
      "meeting.created", "meeting.updated", "meeting.finished"
    ]
  }'
```

Store the `secret` from the response; it is shown once. [Webhooks](https://docs.aefer.ai/api-reference/webhooks.md)
shows how to verify each request, handle retries, and recover events you missed. Treat each
event as a signal: read the resource again and save what the read returns.

## Company defaults

Your customer's admin decides what gets recorded by default and how the notetaker looks
in calls.

![An admin screen: Default for new users, Record meetings with external guests, and Branding: the notetaker name Acme Notetaker with an avatar. Notes: the company default is the workspace's own settings, created with POST /settings assigned to workspaces:wks\_…, and its meetings: categories; Branding is POST /brand\_kits and branding.brand\_kit\_id.](https://mintcdn.com/meeting-kit/QbY7yIbQDf4_fWuU/images/diagrams/admin-settings.svg?fit=max\&auto=format\&n=QbY7yIbQDf4_fWuU\&q=85\&s=ad4e06a0e74085127fc5b3cc204d48ed)

### What a new workspace starts with

Until you change them, a workspace and its members start with these defaults:

| Setting | Field | Default |
| - | - | - |
| Which meetings get recorded | `recording.enabled` | All of them (`true`) |
| Audio or video | `recording.methods.bot.mode` | `audio_and_video` |
| When recording starts | `recording.methods.bot.start` | `on_join`: as soon as the notetaker joins |
| Alert after a long silence | `recording.methods.bot.silence_detection.alert` | On |
| Transcription language | `transcription.language` | [`auto`](https://docs.aefer.ai/api-reference/languages): detected from the audio |
| Summary template | `summary.template` | `general_meeting_notes` |
| Summary language | `summary.language` | `same_as_transcript`: the transcript's language |

The notetaker joins a scheduled meeting three minutes before it starts.

### Which setting wins

For each field of a meeting, the most specific assignment that sets it wins. The full order is in
[Company settings](https://docs.aefer.ai/guides/settings.md#which-setting-wins). Defaults for all your customers go on
your account's settings (`accounts:acc_…`). One customer's defaults go on its workspace's own
settings, below.

### What gets recorded

A new workspace has no settings of its own: it follows your account's (`accounts:acc_…`), which
every workspace shares. Give it its own, assigned to the workspace alone:

```bash theme={null}
curl -X POST "https://api.aefer.ai/api/v1/settings" \
  -H "Authorization: $AEFER_API_KEY" \
  -H "Aefer-Version: 2026-11-13" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Acme company default",
    "recording": { "enabled": false, "methods": { "bot": { "mode": "audio_only" } } },
    "transcription": { "language": "auto" },
    "summary": { "template": "discovery_call", "language": "en" },
    "assignments": [{ "scope": ["workspaces:wks_01k6a2r9s8x7c2dvq3m5n6p4ab"] }]
  }'
```

Keep its `id`, and change it later with `PATCH /settings/{id}`. A second `POST` for the same
scope answers `409 scope_taken` with the assignment. Never PATCH the settings assigned to
`accounts:acc_…` for one customer: they apply to all of them.

`recording.enabled: true` records every meeting. To record only some, set it to `false` and
record each category with its own assignment:

```bash theme={null}
curl -X POST "https://api.aefer.ai/api/v1/settings" \
  -H "Authorization: $AEFER_API_KEY" \
  -H "Aefer-Version: 2026-11-13" \
  -H "Content-Type: application/json" \
  -d '{
    "recording": { "enabled": true },
    "assignments": [{ "scope": ["workspaces:wks_01k6a2r9s8x7c2dvq3m5n6p4ab", "meetings:external"] }]
  }'
```

| Category | Meetings recorded |
| - | - |
| `meetings:organized` | Meetings the user organizes. |
| `meetings:internal` | Meetings where every participant is in the workspace. |
| `meetings:domain` | Meetings where every participant is on the user's email domain. |
| `meetings:external` | Meetings with at least one participant outside the workspace. |

Each user can then choose their own in [meeting settings](https://docs.aefer.ai/guides/meeting-settings.md).

### Branding

A brand kit is how the notetaker presents itself in your customer's calls and in the summary
email: its name, its video tile, its chat messages and the email's look. Build one, show its
preview to your customer, and apply it with `branding.brand_kit_id` in the workspace's
settings: see [Branding](https://docs.aefer.ai/guides/branding.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.