> ## Documentation Index
> Fetch the complete documentation index at: https://docs.meetjamie.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Getting Started

> All you need to know to get started

### 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:**

   <Tabs>
     <Tab title="API Key (Recommended)">
       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`
         To verify requests, simply compare the header value with your stored secret. See [Security & Verification](/pages/developers/webhooks/security_verification) for more implementation details.
     </Tab>

     <Tab title="Signature Verification (Advanced)">
       For maximum security, Jamie signs each request with HMAC-SHA256. This verifies both authenticity and payload integrity.
       The signature is sent in the `x-jamie-signature` header. See [Security & Verification](/pages/developers/webhooks/security_verification) for implementation details.
     </Tab>
   </Tabs>
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).

<Warning>
  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.
</Warning>

## 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

<Info>
  **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.
</Info>

## 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:**

```text theme={null}
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:**

```text theme={null}
Content-Type: application/json
user-agent: Jamie-Webhooks/1.0
x-jamie-signature: t=1234567890,v0=5f3d8a7b2c1e9f4a6b8c0d2e4f6a8b0c
jamie-event: meeting.completed
jamie-delivery: 7893456789012345678
```

| 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](/pages/developers/webhooks/security_verification)) |
| `jamie-event`       | The event type that triggered this webhook                                                                                                 |
| `jamie-delivery`    | Unique identifier for this webhook delivery                                                                                                |

### Request Body

```json theme={null}
{
  "metadata": {
    "id": "7893456789012345678",
    "event": "meeting.completed",
    "created": 1701234567
  },
  "data": {
    "title": "Q4 Planning Meeting",
    "startTime": "2024-11-27T14:00:00.000Z",
    "endTime": "2024-11-27T15:00:00.000Z",
    "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",
      "externalId": "AAMkAGI1AAAt9AHjAAA=",
      "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` (top-level)

* `title` (string): Meeting title
* `startTime` (string): ISO 8601 formatted start time of the meeting
* `endTime` (string | null): ISO 8601 formatted end time of the meeting (if available)

#### `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): Internal Jamie calendar event ID (if available)
* `externalId` (string | null): The calendar provider's event ID (e.g., Microsoft Graph API event ID or Google Calendar event ID). Use this to match against events in your own calendar system.
* `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

<Info>
  **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.
</Info>

#### `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`)
