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

# Create a webhook endpoint

> Registers a receiver for a workspace's events. The key must be an owner or admin of the
workspace, and a workspace holds at most 10 endpoints.

The response is the only one that carries `secret`: store it to
[verify each request](/api-reference/webhooks#verification-code). Send your own `secret` to use
the same one everywhere; otherwise one starting with `whsec_` is generated. If you lose it,
delete the endpoint and create it again.

The endpoint is pinned to the API version this request was served at, unless you send
`api_version`. Its events are named and shaped as that version has them.




## OpenAPI

````yaml /openapi.yaml post /webhook_endpoints
openapi: 3.1.0
info:
  title: MeetingKit API
  description: >
    The MeetingKit API lets you build a meetings feature into your product:
    users connect

    a calendar, a notetaker joins their calls, and you get the transcript,
    speakers and

    summary of each meeting.
  version: '2026-10-12'
  contact:
    name: MeetingKit Developer Support
    email: dev@happyscribe.co
servers:
  - url: https://api.meetingkit.com/api/v1
security:
  - apiKeyAuth: []
tags:
  - name: Agent sessions
    description: Exchange the code a user hands their AI agent for API credentials.
  - name: Uploads
    description: Get signed URLs to upload media files directly to MeetingKit storage.
  - name: Transcribe
    description: Create transcription orders from media URLs.
  - name: Subtitle
    description: Create subtitling orders from media URLs.
  - name: Translate
    description: Create translation orders from existing conversations.
  - name: Orders
    description: Retrieve and confirm the orders created by the service endpoints.
  - name: Conversations
    description: List, retrieve, update, and delete conversations.
  - name: Exports
    description: Export conversations to text, subtitle, video-editing, and data formats.
  - name: Bots
    description: Send a notetaker bot to Zoom, Google Meet, or Microsoft Teams calls.
  - name: Glossaries
    description: List glossaries to apply custom terminology to orders.
  - name: Style guides
    description: List style guides to apply formatting preferences to orders.
  - name: Workspaces
    description: List the workspaces the authenticated user belongs to.
  - name: Organization memberships
    description: Manage which users belong to a workspace.
  - name: Members
    description: A partner's end users inside a workspace (MeetingKit).
  - name: Meetings
    description: >-
      Every meeting of a workspace, from calendars and bots, with its results
      (MeetingKit).
  - name: Calendar connections
    description: >-
      Members' Google and Microsoft calendars, connected through a hosted
      consent link and synced by MeetingKit.
  - name: Calendar events
    description: Calendar events a partner pushes from its own calendar sync (MeetingKit).
  - name: Settings
    description: >-
      What gets recorded and how, as values you assign to a workspace, a member,
      a meeting category or one meeting (MeetingKit).
  - name: Settings assignments
    description: Where settings apply (MeetingKit).
  - name: Files
    description: Images uploaded to a workspace, to use in a brand kit (MeetingKit).
  - name: Webhook endpoints
    description: Register the receivers of a workspace's webhooks, and test them.
  - name: Webhook events
    description: >-
      The webhooks sent to a workspace's endpoints, how each delivery went, and
      redelivery.
  - name: People
    description: >-
      Language Services. People found in your transcripts (Memory API, private
      beta).
  - name: Companies
    description: >-
      Language Services. Companies found in your transcripts (Memory API,
      private beta).
paths:
  /webhook_endpoints:
    post:
      tags:
        - Webhook endpoints
      summary: Create a webhook endpoint
      description: >
        Registers a receiver for a workspace's events. The key must be an owner
        or admin of the

        workspace, and a workspace holds at most 10 endpoints.


        The response is the only one that carries `secret`: store it to

        [verify each request](/api-reference/webhooks#verification-code). Send
        your own `secret` to use

        the same one everywhere; otherwise one starting with `whsec_` is
        generated. If you lose it,

        delete the endpoint and create it again.


        The endpoint is pinned to the API version this request was served at,
        unless you send

        `api_version`. Its events are named and shaped as that version has them.
      operationId: createWebhookEndpoint
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WebhookEndpointCreate'
      responses:
        '201':
          description: Endpoint created, with its `secret`.
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/WebhookEndpoint'
                  - type: object
                    required:
                      - secret
                    properties:
                      secret:
                        type: string
                        description: The signing secret. Shown only in this response.
                        example: whsec_5f0c2a9e1b7d4c3a8e6f0b2d9c1a7e4f3b8d6c0a2e9f1b4d
        '400':
          description: '`workspace_id` is not a single id.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          description: >-
            The key is not an owner or admin of the workspace
            (`workspace_update_not_allowed`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors'
        '404':
          description: '`workspace_id` is not a workspace the key belongs to.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors'
        '422':
          description: >
            A field failed validation: an unsafe or invalid `url`, a `secret`
            under 16 characters

            (`secret_too_short`), an event this workspace or API version does
            not send

            (`unsupported_event`, whose message lists the ones it does), or the
            workspace already

            has 10 endpoints (`limit_reached`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Errors'
components:
  schemas:
    WebhookEndpointCreate:
      type: object
      required:
        - workspace_id
        - url
        - enabled_events
      properties:
        metadata:
          $ref: '#/components/schemas/MetadataUpdate'
        workspace_id:
          type: string
          description: >-
            The workspace whose events it receives. A `wks_` id; integer
            workspace ids are still accepted.
          example: wks_01k6a2r9s8x7c2dvq3m5n6p4ab
        url:
          type: string
          maxLength: 2048
          description: A public HTTPS URL. Redirects are not followed.
          example: https://api.acme.com/meetingkit/webhooks
        enabled_events:
          type: array
          minItems: 1
          description: >-
            Event types, or `*` for every event this workspace and version send,
            now and later.
          items:
            type: string
          example:
            - meeting.finished
            - bot.summary_ready
        name:
          type: string
          nullable: true
          maxLength: 100
          description: Defaults to the URL's host.
        secret:
          type: string
          nullable: true
          maxLength: 255
          description: >-
            Your own signing secret, at least 16 characters. Omit it to have one
            generated.
        api_version:
          type: string
          description: >-
            Pin the endpoint to this version instead of the one serving the
            request.
          example: '2026-10-09'
    WebhookEndpoint:
      type: object
      properties:
        id:
          type: string
          description: >-
            Webhook endpoint ID, beginning with `whe_`. Treat it as an opaque
            string.
          example: whe_01k6d4a1b2c3d4e5f6g7h8j9km
        object:
          type: string
          description: Always `webhook_endpoint`.
        workspace_id:
          type: string
          description: Workspace ID, beginning with `wks_`. Treat it as an opaque string.
          example: wks_01k6a2r9s8x7c2dvq3m5n6p4ab
        name:
          type: string
          description: Defaults to the URL's host.
          example: Acme production
        url:
          description: |
            The public HTTPS URL events are sent to.
          type: string
          format: uri
          example: https://api.acme.com/meetingkit/webhooks
        enabled_events:
          type: array
          description: >-
            The events it receives, named as its `api_version` names them. `*`
            is every event.
          items:
            type: string
          example:
            - meeting.finished
            - bot.summary_ready
        status:
          description: >
            Whether it receives events.


            - `enabled`: receives events.

            - `disabled`: receives nothing; disabling cancels its pending
            deliveries.
          type: string
          enum:
            - enabled
            - disabled
        api_version:
          type: string
          format: date
          description: The version its events are named and shaped at.
          example: '2026-10-09'
        metadata:
          $ref: '#/components/schemas/Metadata'
        created_at:
          description: |
            When it was created, in ISO 8601.
          type: string
          format: date-time
        updated_at:
          description: |
            When it last changed, in ISO 8601.
          type: string
          format: date-time
    Errors:
      type: object
      required:
        - errors
      description: >
        Every error the API returns, `401` and `429` included. See
        [Errors](/api-reference/errors).
      properties:
        errors:
          type: array
          items:
            $ref: '#/components/schemas/Error'
        retry_in_seconds:
          type: integer
          description: >-
            On `429`, how long to wait before retrying. Also sent as
            `Retry-After`.
      example:
        errors:
          - code: invalid
            field: recording.methods.bot.mode
            message: 'must be one of: audio_and_video, audio_only, inherit'
    MetadataUpdate:
      description: >
        Merged into the object's metadata: the keys you send are added or
        overwritten and the

        others kept. `""` as a value removes that key; `metadata: ""` removes
        every key. Numbers and

        booleans are stored as their text; objects, arrays and `null` are
        refused.
      oneOf:
        - type: object
          maxProperties: 50
          propertyNames:
            minLength: 1
            maxLength: 40
            pattern: ^[^\[\]]+$
          additionalProperties:
            type:
              - string
              - number
              - boolean
            maxLength: 500
        - type: string
          enum:
            - ''
      example:
        gurusup_user_id: usr_8812
        old_key: ''
    Metadata:
      type: object
      description: >
        Your own key-value pairs, for your ids and context. MeetingKit stores
        them, returns them on

        the object and in every webhook that carries it, and never acts on them.
        Up to 50 keys of up

        to 40 characters (no square brackets), values up to 500 characters. See

        [metadata](/meetingkit/setup#a-workspace-per-customer).
      maxProperties: 50
      propertyNames:
        minLength: 1
        maxLength: 40
        pattern: ^[^\[\]]+$
      additionalProperties:
        type: string
        maxLength: 500
      example:
        gurusup_user_id: usr_8812
    Error:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: string
          description: >-
            A stable snake_case word, safe to branch on. See
            [Errors](/api-reference/errors) for the list.
        message:
          type: string
          description: A sentence for humans. It may change; do not parse it.
        field:
          type: string
          description: >-
            The dotted path to the request field at fault, such as
            `recording.methods.bot.mode`. Present only when one field is.
  responses:
    Unauthorized:
      description: >-
        Your API key is missing (`missing_api_key`) or wrong
        (`invalid_api_key`), or it may not access this resource
        (`unauthorized`).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Errors'
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        Your API key, sent bare. See
        [Authentication](/api-reference/authentication).

````