> ## Documentation Index
> Fetch the complete documentation index at: https://docs.meetingkit.com/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 MEETINGKIT_API_KEY='your_api_key'

curl "https://api.meetingkit.com/api/v1/workspaces" \
  -H "Authorization: $MEETINGKIT_API_KEY" \
  -H "Happyscribe-Version: 2026-10-12"
```

Every example in this guide sends `Happyscribe-Version: 2026-10-12`. The key must be an
owner or admin of each customer's workspace.

## 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. Keep your customer's id in `metadata`:

```bash theme={null}
curl -X POST "https://api.meetingkit.com/api/v1/workspaces" \
  -H "Authorization: $MEETINGKIT_API_KEY" \
  -H "Happyscribe-Version: 2026-10-12" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Acme Corp", "metadata": { "customer_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. MeetingKit 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.meetingkit.com/api/v1/webhook_endpoints" \
  -H "Authorization: $MEETINGKIT_API_KEY" \
  -H "Happyscribe-Version: 2026-10-12" \
  -H "Content-Type: application/json" \
  -d '{
    "workspace_id": "wks_01k6a2r9s8x7c2dvq3m5n6p4ab",
    "url": "https://api.example.com/meetingkit/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](/api-reference/webhooks)
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.

<Frame>
  <img src="https://mintcdn.com/meeting-kit/DnaA9m78FJYvG19R/images/diagrams/admin-settings.svg?fit=max&auto=format&n=DnaA9m78FJYvG19R&q=85&s=5123f370f59aa77089a6933bee189d09" alt="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 settings (PATCH /settings/set_) and its meetings: categories; Branding is POST /brand_kits and branding.brand_kit_id." width="680" height="624" data-path="images/diagrams/admin-settings.svg" />
</Frame>

### 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`](/api-reference/languages): detected from the audio |
| Summary template | `summary.template` | `inherit`: 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 meeting, the most specific choice wins:

1. **A bot**: what you send with [`POST /bots`](/meetingkit/send-bot#how-the-bot-looks-and-records)
   applies to that bot's meeting.
2. **A meeting**: [recording it or not](/meetingkit/meetings#the-switch), and anything else set
   with a `meeting:` assignment, applies to that occurrence.
3. **A member**: their own [recording choice](/meetingkit/meeting-settings#record-my-meetings)
   and settings. A meeting is recorded when any member whose calendar has it records it: one
   member is enough, and it still gets one notetaker.
4. **The workspace**: a new member's settings start as a copy of the workspace's. Changing the
   workspace's later applies to members set up after it, not to existing ones: change theirs
   too. Set the company default before you create members. A member's summary language is set
   on the member, with `summary.language` in their settings.

A meeting's `settings` is the result, and `settings.sources` says which assignment decided each
field. See [Settings](/meetingkit/settings).

### What gets recorded

The workspace's settings are the default for its users. Every workspace has them: find their
id in `GET /workspaces/{id}` (`settings.assignments`, the one whose scope is the workspace alone)
and change them:

```bash theme={null}
curl -X PATCH "https://api.meetingkit.com/api/v1/settings/set_01k6wks00000000000000000000" \
  -H "Authorization: $MEETINGKIT_API_KEY" \
  -H "Happyscribe-Version: 2026-10-12" \
  -H "Content-Type: application/json" \
  -d '{
    "recording": { "enabled": false, "methods": { "bot": { "mode": "audio_only" } } },
    "transcription": { "language": "auto" },
    "summary": { "template": "discovery_call", "language": "en" }
  }'
```

`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.meetingkit.com/api/v1/settings" \
  -H "Authorization: $MEETINGKIT_API_KEY" \
  -H "Happyscribe-Version: 2026-10-12" \
  -H "Content-Type: application/json" \
  -d '{
    "recording": { "enabled": true },
    "assignments": [{ "scope": ["workspace: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](/meetingkit/meeting-settings).

### Branding

A brand kit is how the notetaker presents itself in your customer's calls and in the summary
email. Create one and pick it for the workspace:

```bash theme={null}
curl -X POST "https://api.meetingkit.com/api/v1/brand_kits" \
  -H "Authorization: $MEETINGKIT_API_KEY" \
  -H "Happyscribe-Version: 2026-10-12" \
  -H "Content-Type: application/json" \
  -d '{
    "workspace_id": "wks_01k6a2r9s8x7c2dvq3m5n6p4ab",
    "workspace_ids": ["wks_01k6a2r9s8x7c2dvq3m5n6p4ab"],
    "bot": {
      "name": "Acme Notetaker",
      "tile": { "type": "logo", "logo": { "file": "file_01k6d8q4z7m2n5p8r1s3t6v9wx", "background_color": "#1F2937" } },
      "chat": { "recording_message": "Hi, I'"'"'m taking notes for Acme." }
    },
    "email": { "type": "branded", "branded": { "color": "#0052FF", "cta": { "type": "none" } } }
  }'
```

| Field | What it sets |
| - | - |
| `bot.name` | The notetaker's name in the call, up to 64 characters. |
| `bot.tile` | Its video tile: `default`, a `color`, your `logo` on a color, or your own 16:9 `image`. |
| `bot.chat` | Whether it posts in the chat, and the messages it posts when recording and when paused. |
| `email` | The summary email: `default`, or `branded` with your logo, color, website and button. |

Each choice is a `type` and an object named after it, and an image is a file you upload first
with [`POST /files`](/api-reference/files/upload-a-file). If your users have no MeetingKit
account, set the email's button (`email.branded.cta`) to `none` or to a `link` of your own.

`workspace_id` is the workspace that owns the kit. One kit can brand several workspaces:
`workspace_ids` lists the ones that use it, and `PATCH` changes every one at once. Leave
`workspace_ids` out to prepare a kit nothing uses yet, then pick it with `branding.brand_kit_id`
in a workspace's settings. A single bot can still override the name and avatar when you
[send it](/meetingkit/send-bot#how-the-bot-looks-and-records). Every field is on
[the brand kit object](/api-reference/brand-kits/object).

Company defaults and branding need a plan with notetaker customization; without it they
answer `403 plan_upgrade_required`.
