> ## 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 `meetings:mtg_…` 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 member follows the workspace's settings for every field they don't set
   themselves, including later changes. Change the workspace's `summary.language` and every
   member who hasn't chosen one follows; a member's own value wins over the workspace's.

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": ["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](/meetingkit/meeting-settings).

### 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](/meetingkit/branding).


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