Skip to main content

Prerequisites

Before setting up a webhook, you’ll need:
  1. An HTTPS endpoint - Your webhook receiver must use HTTPS (HTTP is not supported for security reasons)
  2. Workspace membership - Any workspace member can create personal webhooks. Workspace admin access is required to create workspace-wide webhooks.
  3. An eligible plan - Upgrade to Plus or higher to access webhooks

Creating a Webhook

  1. Navigate to Settings → Integrations → Webhooks
  2. Click Create Webhook
  3. 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)
  4. 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.
  5. Choose your authentication method:
  6. Click Create
  7. Save your secret key - This is displayed only once. Store it securely (e.g., in your environment variables or secrets manager).
Once you close the webhook creation dialog, you won’t be able to see the secret key again. If you lose it, you’ll need to regenerate it from the webhook settings.

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:
Content-Type: application/json
user-agent: Jamie-Webhooks/1.0
x-jamie-api-key: sk_a1b2c3d4e5f6...  (or your custom header name)
jamie-event: meeting.completed
jamie-delivery: 7893456789012345678
Signature Verification:
Content-Type: application/json
user-agent: Jamie-Webhooks/1.0
x-jamie-signature: t=1234567890,v0=5f3d8a7b2c1e9f4a6b8c0d2e4f6a8b0c
jamie-event: meeting.completed
jamie-delivery: 7893456789012345678
HeaderDescription
x-jamie-api-keyYour API key for simple authentication (or your custom header name)
x-jamie-signatureHMAC-SHA256 signature for verifying webhook authenticity (see Security & Verification)
jamie-eventThe event type that triggered this webhook
jamie-deliveryUnique identifier for this webhook delivery

Request Body

{
  "metadata": {
    "id": "7893456789012345678",
    "event": "meeting.completed",
    "created": 1701234567
  },
  "data": {
    "user": {
      "id": "user-456",
      "email": "sarah.johnson@example.com"
    },
    "summary": {
      "markdown": "# Meeting Summary\n\n## Key Discussion Points\n• Reviewed Q4 roadmap...",
      "html": "<h1>Meeting Summary</h1><h2>Key Discussion Points</h2><ul><li>Reviewed Q4 roadmap...</li></ul>",
      "short": "Q4 product planning meeting covering roadmap, mobile redesign, and user research budget allocation."
    },
    "transcript": [
      {
        "speakerId": "1",
        "speakerName": "Sarah Johnson",
        "text": "Hi everyone! Thanks for joining today's meeting."
      },
      {
        "speakerId": "2",
        "speakerName": "Alex Chen",
        "text": "Thanks for having me. Let's dive into the agenda."
      }
    ],
    "participants": [
      {
        "id": "1",
        "name": "Sarah Johnson",
        "email": "sarah.johnson@example.com"
      },
      {
        "id": "2",
        "name": "Alex Chen",
        "email": "alex.chen@example.com"
      }
    ],
    "event": {
      "id": "calendar-event-123",
      "title": "Q4 Planning Meeting",
      "scheduledTime": "2024-11-27T14:00:00.000Z",
      "endTime": "2024-11-27T15:00:00.000Z",
      "attendees": [
        {
          "name": "Sarah Johnson",
          "email": "sarah.johnson@example.com",
          "responseStatus": "accepted",
          "organizer": true
        },
        {
          "name": "Alex Chen",
          "email": "alex.chen@example.com",
          "responseStatus": "accepted",
          "organizer": false
        },
        {
          "name": "Jamie Martinez",
          "email": "jamie.martinez@example.com",
          "responseStatus": "tentative",
          "organizer": false
        }
      ]
    },
    "tasks": [
      {
        "content": "Finalize technical specifications for mobile app redesign",
        "completed": false,
        "assignee": {
          "name": "Alex Chen",
          "email": "alex.chen@example.com"
        }
      },
      {
        "content": "Schedule follow-up meeting for next week",
        "completed": false,
        "assignee": null
      }
    ],
    "tags": [
      {
        "name": "Product",
        "color": "#4A90D9"
      },
      {
        "name": "Planning",
        "color": "#50C878"
      }
    ]
  }
}

Field Descriptions

metadata

  • id (string): Unique identifier for this webhook delivery
  • event (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 user
  • email (string): Email address of the user

data.summary

  • markdown (string): Meeting summary formatted as Markdown with speaker names highlighted
  • html (string): Meeting summary formatted as HTML, ready to display
  • short (string): A brief one-line summary of the meeting

data.transcript

Array of transcript segments:
  • speakerId (string): Unique identifier for the speaker
  • speakerName (string): Display name of the speaker
  • text (string): The spoken text

data.participants

Array of meeting participants detected in the transcript (people who spoke):
  • id (string): Unique identifier for the participant
  • name (string): Display name of the participant
  • email (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 time
  • endTime (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 attendee
    • email (string): Email address of the attendee
    • responseStatus (string | null): RSVP status — one of needsAction, declined, tentative, or accepted
    • organizer (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 description
  • completed (boolean): Whether the task is marked as completed
  • assignee (object | null): The person assigned to this task (if any)
    • name (string | null): Name of the assignee
    • email (string | null): Email address of the assignee (if available)

data.tags

Array of tags (labels) applied to the meeting:
  • name (string): The tag name
  • color (string): The tag color as a hex string (e.g., #4A90D9)