> ## 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.

# Company settings

> What gets recorded and how: settings, the scopes you assign them to, and which one wins.

Two objects decide what happens in a meeting. [Settings](https://docs.aefer.ai/api-reference/settings/object.md) hold
values: record or not, how the bot records, the transcription language, the summary, the
branding. [Assignments](https://docs.aefer.ai/api-reference/settings-assignments/object.md) say where they apply: a
`scope`, a list of conditions that must all hold. Every workspace, member and meeting carries the
result as [its `settings` block](https://docs.aefer.ai/api-reference/settings/block-object).

## Scopes

A condition is `<kind>:<set>`: the kind is plural, the set is one item or a group. A scope names
exactly one who: your account, a workspace or a member. A meeting condition stands alone: it
implies its workspace. A member implies their workspace, and a workspace your account.

| Condition | Means |
| - | - |
| `accounts:acc_…` | Every workspace of your account, partner-wide. |
| `workspaces:wks_…` | The workspace's members and meetings. |
| `members:mem_…` | One member's meetings. |
| `meetings:organized`, `meetings:internal`, `meetings:domain`, `meetings:external` | A category, relative to the member whose calendar it is on. |
| `calendar_event_series:<ical_uid>` | Every occurrence of a recurring event, from now on. |
| `meetings:mtg_…` | One meeting, this occurrence only. |

What you want, as scopes:

| Want | `scope` |
| - | - |
| Partner-wide defaults | `["accounts:acc_…"]` |
| Company defaults | `["workspaces:wks_acme"]` |
| Record external meetings | `["workspaces:wks_acme", "meetings:external"]` |
| External *or* organized | two assignments, same `settings_id` |
| External meetings I organize | `["workspaces:wks_acme", "meetings:external", "meetings:organized"]` |
| Ana: Catalan | `["members:mem_ana"]` |
| Ana: never my internal ones | `["members:mem_ana", "meetings:internal"]` |
| One meeting on, or off | `["meetings:mtg_…"]` |
| Skip the all-hands series | `["workspaces:wks_acme", "calendar_event_series:<ical_uid>"]` |
| Same setup for 50 customers | 50 assignments of one `settings_id` |

An `accounts:` scope takes no other condition yet. A scope with a category sets only
`recording.enabled`. Branding is set on a `workspaces:` scope
alone. A meeting takes no `recording.methods.bot.start`: the bot's start is chosen before it is
dispatched. A meeting started by a bot keeps what [`POST /bots`](https://docs.aefer.ai/api-reference/bots/create-a-bot)
sent; it takes no assignment. A bot sent to a calendar meeting with `POST /bots` decides that
meeting's settings the same way while it is the meeting's latest bot: the meeting shows what the bot
records with, what it was sent and, for the rest, its member's and workspace's settings. The
meeting's own, series and category assignments apply again once that bot is cancelled or fails.

## Set them

Create settings and assign them in one call. A `name` helps you find them again:

```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": "Catalan",
    "transcription": { "language": "ca" },
    "assignments": [{ "scope": ["members:mem_01k69x9s8x7c2dvq3m5n6p4ab"] }]
  }'
```

A scope set is assigned once: a second `POST` for the same scope answers `409 scope_taken`
naming the assignment. Change the settings it applies instead:

```bash theme={null}
curl -X PATCH "https://api.aefer.ai/api/v1/settings/set_01k6sa1es0000000000000000a" \
  -H "Authorization: $AEFER_API_KEY" \
  -H "Aefer-Version: 2026-11-13" \
  -H "Content-Type: application/json" \
  -d '{ "recording": { "methods": { "bot": { "mode": "audio_only" } } } }'
```

Reuse one object anywhere, here for one more category:

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

Delete an assignment to stop applying it there. Delete settings once nothing assigns them
(`409 settings_in_use` until then).

A change reaches bots already scheduled. A bot it would send differently (another recording mode
or start, or for other members) is sent again under the same `bot_` id, a bot it switches off
reads `cancelled`, and the rest stay as they are.

Your account starts with its own settings detecting the language (`transcription.language: auto`),
assigned to the account: every workspace you create inherits them, with nothing to set per
workspace.

## Values and codes

A field is a value or a code, never `null` (`422 invalid`):

| Code | Field | Means |
| - | - | - |
| `inherit` | any | Nothing here: the next assignment down decides. |
| `same_as_transcript` | `summary.language` | The summary is in the transcript's language. |
| `none` | `branding.brand_kit_id` | \_æfer's own branding. |

`inherit` is stored: a member whose language is `inherit` follows the workspace's language, now
and after you change it.

## Summary email

`summary.email` says whether a meeting's summary is emailed and to whom. It is off by default:

```json theme={null}
{ "summary": { "email": { "enabled": true, "recipients": ["meeting_participants:organizer"] } } }
```

`recipients` is a list of who gets it, and the values add up: `meeting_participants:organizer`,
`members`, `domain` or `all` (see [the settings object](https://docs.aefer.ai/api-reference/settings/object.md)). The
organizer is the calendar organizer when they are a member of the workspace, and otherwise the
member the bot was sent for. The most specific assignment that sets the list decides it whole.

Participants are the addresses on the invite, not who attended: declined invitees and group
addresses count too. One meeting emails at most 50 people. \_æfer sends the meeting's first summary once, as [Branding](https://docs.aefer.ai/guides/branding.md#the-email)
describes. A summary you regenerate emails nobody.

## Which setting wins

For each field of a meeting, the most specific assignment that sets it:

1. `meetings:mtg_…`
2. `calendar_event_series:`
3. `members:` with categories
4. `members:`
5. `workspaces:` with categories
6. `workspaces:`
7. `accounts:`
8. The defaults, read with [`GET /defaults`](https://docs.aefer.ai/api-reference/settings/get-defaults).

Within one step, a scope with more conditions wins. Two assignments that tie on
`recording.enabled` don't record. Any other field can't tie: an assignment that would set a
different value on the same step as another answers `409 settings_conflict`.

The `settings` block on the meeting says what applies and, in `sources`, which assignment
supplied each field. When none did, `reason` says why: `default`; for what a bot was
sent with, `bot_request`; and for recording, `no_meeting_url`, `unsupported_platform`, `no_calendar_event`, `member_paused` and
`bot_cancelled`.


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