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 meeting: 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 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.

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. Create one and pick it for the workspace:
Each choice is a type and an object named after it, and an image is a file you upload first with POST /files. 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. Every field is on the brand kit object. Company defaults and branding need a plan with notetaker customization; without it they answer 403 plan_upgrade_required.