Skip to main content
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:
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:
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.
Store the secret from the response; it is shown once. 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.
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.

What a new workspace starts with

Until you change them, a workspace and its members start with these defaults: 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 applies to that bot’s meeting.
  2. A meeting: recording it or not, and anything else set with a meetings:mtg_… assignment, applies to that occurrence.
  3. A member: their own recording choice 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.

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:
recording.enabled: true records every meeting. To record only some, set it to false and record each category with its own assignment:
Each user can then choose their own in 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.