Prerequisites
Before setting up a webhook, you’ll need:- An HTTPS endpoint - Your webhook receiver must use HTTPS (HTTP is not supported for security reasons)
- Workspace membership - Any workspace member can create personal webhooks. Workspace admin access is required to create workspace-wide webhooks.
- An eligible plan - Upgrade to Plus or higher to access webhooks
Creating a Webhook
- Navigate to Settings → Integrations → Webhooks
- Click Create Webhook
-
Fill in the required information:
- URL: Your HTTPS endpoint that will receive webhook events (e.g.,
https://api.example.com/webhooks/jamie) - Description (optional): A note to help you identify this webhook
- Events: Select which events should trigger this webhook (currently only
meeting.completed)
- URL: Your HTTPS endpoint that will receive webhook events (e.g.,
-
Choose the webhook scope:
- Personal webhook — Triggers only for your own meetings. Available to all workspace members.
- Workspace webhook — Triggers for all meetings in the workspace. Requires admin access.
-
Choose your authentication method:
- API Key (Recommended)
- Signature Verification (Advanced)
The simplest way to authenticate webhooks. Jamie will send a static API key in a header of your choice.- Header Name: Choose a custom header name (e.g.,
x-jamie-api-key,x-make-apikey,Authorization) - Leave empty to use the default
x-jamie-api-key
- Click Create
- Save your secret key - This is displayed only once. Store it securely (e.g., in your environment variables or secrets manager).
Events
Jamie currently supports the following webhook event:meeting.completed
Triggered when a meeting has been fully processed and is ready with:
- Meeting summary (in Markdown and HTML formats)
- Full transcript
- Extracted action items/tasks
- Participant information
- Meeting metadata
Workspace webhooks are triggered by all meetings of every user in the workspace. Personal webhooks are triggered only by the creator’s own meetings. If you need to receive webhooks for only your meetings, use a personal webhook instead of filtering on the receiving end.
Payload Structure
When a webhook event is triggered, Jamie sends a POST request to your endpoint with the following structure:Headers
Depending on your chosen authentication method, you’ll receive different headers: API Key Authentication:| Header | Description |
|---|---|
x-jamie-api-key | Your API key for simple authentication (or your custom header name) |
x-jamie-signature | HMAC-SHA256 signature for verifying webhook authenticity (see Security & Verification) |
jamie-event | The event type that triggered this webhook |
jamie-delivery | Unique identifier for this webhook delivery |
Request Body
Field Descriptions
metadata
id(string): Unique identifier for this webhook deliveryevent(string): The event type (meeting.completed)created(number): Unix timestamp (seconds) when the webhook was created
data.user
The Jamie user who recorded the meeting:
id(string): Unique identifier for the useremail(string): Email address of the user
data.summary
markdown(string): Meeting summary formatted as Markdown with speaker names highlightedhtml(string): Meeting summary formatted as HTML, ready to displayshort(string): A brief one-line summary of the meeting
data.transcript
Array of transcript segments:
speakerId(string): Unique identifier for the speakerspeakerName(string): Display name of the speakertext(string): The spoken text
data.participants
Array of meeting participants detected in the transcript (people who spoke):
id(string): Unique identifier for the participantname(string): Display name of the participantemail(string | null): Email address of the participant (if available)
data.event
Calendar event information (if the meeting is linked to a calendar event):
id(string | null): Calendar event ID (if available)title(string): Calendar event title (falls back to meeting title if no calendar event is linked)scheduledTime(string): ISO 8601 formatted start timeendTime(string | null): ISO 8601 formatted end time (if available)attendees(array): List of people invited to the calendar event (empty if no calendar event is linked)name(string): Name of the attendeeemail(string): Email address of the attendeeresponseStatus(string | null): RSVP status — one ofneedsAction,declined,tentative, oracceptedorganizer(boolean): Whether this attendee is the organizer of the event
Participants vs. Attendees:
participants are people who actually spoke during the meeting (detected from the transcript). attendees are people who were invited to the calendar event — they may or may not have attended or spoken.data.tasks
Array of action items extracted from the meeting:
content(string): The task descriptioncompleted(boolean): Whether the task is marked as completedassignee(object | null): The person assigned to this task (if any)name(string | null): Name of the assigneeemail(string | null): Email address of the assignee (if available)
data.tags
Array of tags (labels) applied to the meeting:
name(string): The tag namecolor(string): The tag color as a hex string (e.g.,#4A90D9)

