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

# Create a webhook

> Creates a new webhook listening to workspace events.

Create a webhook to be notified about events that occur in the workspace.

To learn more about webhooks, how to set them up and receive notifications, check out the [webhooks guide](/webhooks/about).

### Available events

You can find the list of available events in the [webhook events and payloads](/webhooks/events-and-payloads#event-list) guide.

### Filters

You can add filters to events in order to narrow down the notifications you receive.

Filters allow you to achieve advanced workflow capabilities, such as:

* Only receive notifications when a person is added to a specific group.
* Only receive notifications when a company is moved to a specific pipeline status.
* Only receive notifications when a deal from a specific group is updated.

Each event type has a different set of filters that can be used. Click on the event types below to see the filters available.

<Warning>
  Filters are only available through the API. If you add filters and then update
  the events from the settings page, the filters will be lost.
</Warning>

#### Person events

<AccordionGroup>
  <Accordion title="person.created">
    You can filter by the group the person is added to.

    ```json theme={null}
    // Notify only if the person is created in a group
    // with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71
    {
      "eventType": "person.created",
      "filter": {
        "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71"
      }
    }
    ```
  </Accordion>

  <Accordion title="person.updated">
    You can filter by:

    * The group the person is in
    * The updated attribute
    * The updated attribute and the value of the attribute

    <CodeGroup>
      ```json Filter by group theme={null}
      // Notify only if the person is updated while in a group
      // with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71
      {
        "eventType": "person.updated",
        "filter": {
          "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71"
        }
      }
      ```

      ```json Filter by native attribute theme={null}
      // Notify only if the person's first name is updated
      {
        "eventType": "person.updated",
        "filter": {
          "path": ["firstName"]
        }
      }
      ```

      ```json Filter by native attribute and value theme={null}
      // Notify only if the person's first name is updated to "John"
      {
        "eventType": "person.updated",
        "filter": {
          "path": ["firstName"],
          "value": "John"
        }
      }
      ```

      ```json Filter by custom field attribute theme={null}
      // Notify only if the person's custom field "Status" is updated
      {
        "eventType": "person.updated",
        "filter": {
          "path": ["customFieldValues", "grp_bc984b3f-0386-434d-82d7-a91eb6badd71", "Status"]
        }
      }
      ```

      ```json Filter by custom field attribute and value theme={null}
      // Notify only if the person's custom field "Status"
      // is updated to "In Progress"
      {
        "eventType": "person.updated",
        "filter": {
          "path": ["customFieldValues", "grp_bc984b3f-0386-434d-82d7-a91eb6badd71", "Status"],
          "value": "In Progress"
        }
      }
      ```

      ```json Filter by group, custom field attribute and value theme={null}
      // Notify only if the person's custom field "Status"
      //  is updated to "In Progress" while in a group with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71
      {
        "eventType": "person.updated",
        "filter": {
          "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71",
          "path": ["customFieldValues", "grp_bc984b3f-0386-434d-82d7-a91eb6badd71", "Status"],
          "value": "In Progress"
        }
      }
      ```
    </CodeGroup>

    Only the following attributes can be filtered:

    * `firstName`
    * `lastName`
    * `birthday`
    * `jobTitle`
    * `description` - You cannot provide a value for this attribute
    * `addresses`
    * `emails`
    * `phones`
    * `urls`
    * `customFieldValues`

    <Note>
      When passing a value for these fields, you must provide the value in the correct format. Refer to the [update person](/api-reference/people/update-a-person) documentation for more information.
    </Note>
  </Accordion>

  <Accordion title="person.deleted">
    You can filter by the group the person is removed from.

    ```json theme={null}
    // Notify only if the person is deleted while in a group
    // with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71
    {
      "eventType": "person.deleted",
      "filter": {
        "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71"
      }
    }
    ```
  </Accordion>

  <Accordion title="person.groups_updated">
    You can filter by the group the person is added to or removed from.

    ```json theme={null}
    // Notify only if the person is added to or removed from the group
    //  with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71
    {
      "eventType": "person.groups_updated",
      "filter": {
        "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71"
      }
    }
    ```
  </Accordion>

  <Accordion title="person.workspace_interaction_metadata_updated">
    You can filter by the group the person is in.

    ```json theme={null}
    // Notify only if the person's workspace interaction metadata
    // is updated while in a group with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71
    {
      "eventType": "person.workspace_interaction_metadata_updated",
      "filter": {
        "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71"
      }
    }
    ```
  </Accordion>
</AccordionGroup>

#### Company events

<AccordionGroup>
  <Accordion title="company.created">
    You can filter by the group the company is added to.

    ```json theme={null}
    // Notify only if the company is created in a group
    // with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71
    {
      "eventType": "company.created",
      "filter": {
        "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71"
      }
    }
    ```
  </Accordion>

  <Accordion title="company.updated">
    You can filter by:

    * The group the company is in
    * The updated attribute
    * The updated attribute and the value of the attribute

    <CodeGroup>
      ```json Filter by group theme={null}
      // Notify only if the company is updated while in a group
      // with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71
      {
        "eventType": "company.updated",
        "filter": {
          "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71"
        }
      }
      ```

      ```json Filter by native attribute theme={null}
      // Notify only if the company's name is updated
      {
        "eventType": "company.updated",
        "filter": {
          "path": ["name"]
        }
      }
      ```

      ```json Filter by native attribute and value theme={null}
      // Notify only if the company's name is updated to "ACME Inc."
      {
        "eventType": "company.updated",
        "filter": {
          "path": ["name"],
          "value": "ACME Inc."
        }
      }
      ```

      ```json Filter by custom field attribute theme={null}
      // Notify only if the company's custom field "Status" is updated
      {
        "eventType": "company.updated",
        "filter": {
          "path": ["customFieldValues", "grp_bc984b3f-0386-434d-82d7-a91eb6badd71", "Status"]
        }
      }
      ```

      ```json Filter by custom field attribute and value theme={null}
      // Notify only if the company's custom field "Status"
      // is updated to "In Progress"
      {
        "eventType": "company.updated",
        "filter": {
          "path": ["customFieldValues", "grp_bc984b3f-0386-434d-82d7-a91eb6badd71", "Status"],
          "value": "In Progress"
        }
      }
      ```

      ```json Filter by group, custom field attribute and value theme={null}
      // Notify only if the company's custom field "Status"
      // is updated to "In Progress" while in a group with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71
      {
        "eventType": "company.updated",
        "filter": {
          "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71",
          "path": ["customFieldValues", "grp_bc984b3f-0386-434d-82d7-a91eb6badd71", "Status"],
          "value": "In Progress"
        }
      }
      ```
    </CodeGroup>

    Only the following attributes can be filtered:

    * `name`
    * `description` - You cannot provide a value for this attribute
    * `addresses`
    * `emails`
    * `phones`
    * `urls`
    * `fundingRaised`
    * `lastFundingDate`
    * `foundationYear`
    * `employeeRange`
    * `industry`
    * `customFieldValues`

    <Note>
      When passing a value for these fields, you must provide the value in the correct format. Refer to the [update company](/api-reference/companies/update-a-company) documentation for more information.
    </Note>
  </Accordion>

  <Accordion title="company.deleted">
    You can filter by the group the company is removed from.

    ```json theme={null}
    // Notify only if the company is deleted while in a group
    // with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71
    {
      "eventType": "company.deleted",
      "filter": {
        "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71"
      }
    }
    ```
  </Accordion>

  <Accordion title="company.groups_updated">
    You can filter by the group the company is added to or removed from.

    ```json theme={null}
    // Notify only if the company is added to or removed from the group
    //  with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71
    {
      "eventType": "company.groups_updated",
      "filter": {
        "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71"
      }
    }
    ```
  </Accordion>
</AccordionGroup>

#### Deal events

<AccordionGroup>
  <Accordion title="object.created">
    You can filter by:

    * The group the deal is in
    * The group the deal is in and the object type

    <CodeGroup>
      ```json Filter by group theme={null}
      // Notify only if the deal is created while in a group
      // with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71
      {
        "eventType": "object.created",
        "filter": {
          "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71",
        }
      }
      ```

      ```json Filter by group and object type theme={null}
      // Notify only if the deal is created while in a group
      // with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71 and the object type is "Deals"
      {
        "eventType": "object.created",
        "filter": {
          "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71",
          "objectType": "Deals"
        }
      }
      ```
    </CodeGroup>
  </Accordion>

  <Accordion title="object.updated">
    You can filter by:

    * The group the deal is in
    * The group the deal is in and the object type
    * Group, object type and the updated attribute
    * Group, object type, the updated attribute and the value of the attribute

    <CodeGroup>
      ```json Filter by group theme={null}
      // Notify only if the deal is updated while in a group
      // with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71
      {
        "eventType": "object.updated",
        "filter": {
          "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71",
        }
      }
      ```

      ```json Filter by group and object type theme={null}
      // Notify only if the deal is updated while in a group
      // with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71 and the object type is "Deals"
      {
        "eventType": "object.updated",
        "filter": {
          "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71",
          "objectType": "Deals"
        }
      }
      ```

      ```json Filter by group, object type and the updated attribute theme={null}
      // Notify only if the deal is updated while in a group
      // with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71
      // and the object type is "Deals" and the updated attribute is "name"
      {
        "eventType": "object.updated",
        "filter": {
          "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71",
          "objectType": "Deals",
          "path": ["name"]
        }
      }
      ```

      ```json Filter by group, object type, the updated attribute and the value of the attribute theme={null}
      // Notify only if the deal is updated while in a group
      // with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71
      // and the object type is "Deals" and the updated attribute is "name"
      // and the value of the attribute is "New Deal"
      {
        "eventType": "object.updated",
        "filter": {
          "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71",
          "objectType": "Deals",
          "path": ["name"],
          "value": "New Deal"
        }
      }
      ```

      ```json Filter by group, object type, custom field attribute theme={null}
      // Notify only if the deal is updated while in a group
      // with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71
      // and the object type is "Deals"
      // and the custom field attribute is "Status"
      {
        "eventType": "object.updated",
        "filter": {
          "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71",
          "objectType": "Deals",
          "path": ["customFieldValues", "Status"]
        }
      }
      ```

      ```json Filter by group, object type, custom field attribute and value theme={null}
      // Notify only if the deal is updated while in a group
      // with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71
      // and the object type is "Deals"
      // and the custom field attribute is "Status"
      // and the value of the attribute is "In Progress"
      {
        "eventType": "object.updated",
        "filter": {
          "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71",
          "objectType": "Deals",
          "path": ["customFieldValues", "Status"],
          "value": "In Progress"
        }
      }
      ```
    </CodeGroup>

    Only the following attributes can be filtered:

    * `name`
    * `customFieldValues`
  </Accordion>

  <Accordion title="object.deleted">
    You can filter by:

    * The group the deal is in
    * The group the deal is in and the object type

    <CodeGroup>
      ```json Filter by group theme={null}
      // Notify only if the deal is deleted from the group
      // with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71
      {
        "eventType": "object.deleted",
        "filter": {
          "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71",
        }
      }
      ```

      ```json Filter by group and object type theme={null}
      // Notify only if the deal is deleted from the group
      // with the ID grp_bc984b3f-0386-434d-82d7-a91eb6badd71 and the object type is "Deals"
      {
        "eventType": "object.deleted",
        "filter": {
          "groupId": "grp_bc984b3f-0386-434d-82d7-a91eb6badd71",
          "objectType": "Deals"
        }
      }
      ```
    </CodeGroup>
  </Accordion>
</AccordionGroup>

#### Note events

<AccordionGroup>
  <Accordion title="note.created">
    There are no filters available for this event at the moment.
  </Accordion>

  <Accordion title="note.updated">
    There are no filters available for this event at the moment.
  </Accordion>

  <Accordion title="note.deleted">
    There are no filters available for this event at the moment.
  </Accordion>
</AccordionGroup>

#### Reminder events

<AccordionGroup>
  <Accordion title="reminder.created">
    There are no filters available for this event at the moment.
  </Accordion>

  <Accordion title="reminder.updated">
    There are no filters available for this event at the moment.
  </Accordion>

  <Accordion title="reminder.deleted">
    There are no filters available for this event at the moment.
  </Accordion>

  <Accordion title="reminder.triggered">
    There are no filters available for this event at the moment.
  </Accordion>
</AccordionGroup>


## OpenAPI

````yaml post /v1/webhooks
openapi: 3.1.0
info:
  title: Folk External API
  description: >-
    Folk's public REST API lets you manage workspaces, groups, contacts, and
    real-time triggers.
  version: '2025-06-09'
  contact:
    name: folk
    email: tech@folk.app
    url: https://folk.app
servers:
  - url: https://api.folk.app
    description: Folk's public API production base URL.
    x-internal: false
security: []
tags:
  - name: Companies
    description: Operations related to companies.
  - name: Deals
    description: Operations related to deals.
  - name: Groups
    description: Operations related to groups.
  - name: Interactions
    description: Operations related to interactions.
  - name: Notes
    description: Operations related to notes.
  - name: People
    description: Operations related to people.
  - name: Reminders
    description: Operations related to reminders.
  - name: Tasks
    description: Operations related to tasks.
  - name: Users
    description: Operations related to users.
  - name: Webhooks
    description: Operations related to webhooks.
paths:
  /v1/webhooks:
    post:
      tags:
        - Webhooks
      summary: Create a webhook
      description: Creates a new webhook listening to workspace events.
      operationId: createWebhook
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  maxLength: 255
                  description: A friendly name for the webhook.
                  example: My app integration
                targetUrl:
                  type: string
                  maxLength: 2048
                  format: uri
                  description: >-
                    The URL of the webhook. It must be a publicly accessible URL
                    using the HTTP or HTTPS protocol.
                  example: https://my-app.com/webhook
                subscribedEvents:
                  type: array
                  items:
                    type: object
                    properties:
                      eventType:
                        type: string
                        enum:
                          - person.created
                          - person.updated
                          - person.deleted
                          - person.groups_updated
                          - person.workspace_interaction_metadata_updated
                          - company.created
                          - company.updated
                          - company.deleted
                          - company.groups_updated
                          - object.created
                          - object.updated
                          - object.deleted
                          - note.created
                          - note.updated
                          - note.deleted
                          - reminder.created
                          - reminder.updated
                          - reminder.deleted
                          - reminder.triggered
                      filter:
                        type: object
                        properties:
                          groupId:
                            type: string
                            maxLength: 255
                          objectType:
                            type: string
                            maxLength: 255
                          path:
                            type: array
                            items:
                              type: string
                              maxLength: 255
                            maxItems: 3
                          value:
                            type: string
                            maxLength: 255
                    required:
                      - eventType
                    additionalProperties: false
                  minItems: 1
                  maxItems: 20
                  description: >-
                    The events the webhook is subscribed to, with optional
                    filters.
                  example:
                    - eventType: person.created
                      filter:
                        groupId: grp_bc984b3f-0386-434d-82d7-a91eb6badd71
              required:
                - name
                - targetUrl
                - subscribedEvents
              additionalProperties: false
      responses:
        '200':
          description: The created webhook.
          headers:
            X-RateLimit-Limit:
              $ref: '#/components/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/X-RateLimit-Remaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/X-RateLimit-Reset'
            Retry-After:
              $ref: '#/components/headers/Retry-After'
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/WebhookWithSigningSecret'
                  deprecations:
                    type: array
                    items:
                      type: string
                    example:
                      - This field is deprecated
                required:
                  - data
              example:
                data:
                  id: wbk_8c18c158-d49e-4ad4-90d4-2b197688bac7
                  name: My app integration
                  targetUrl: https://my-app.com/webhook
                  subscribedEvents:
                    - eventType: person.created
                      filter: {}
                  signingSecret: whsec_QWFSUzl1QUVoQW1kdWtpTnJRTUFpbXNlZmxLTg==
                  status: active
                  createdAt: '2025-07-17T09:00:00.000Z'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalServerError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
      security:
        - bearerApiKeyAuth: []
components:
  headers:
    X-RateLimit-Limit:
      schema:
        type: integer
        example: 1000
      description: >-
        The maximum number of requests that you can make in the current rate
        limit window.
    X-RateLimit-Remaining:
      schema:
        type: integer
        example: 998
      description: The number of requests remaining in the current rate limit window.
    X-RateLimit-Reset:
      schema:
        type: integer
        example: 1747322958
      description: >-
        The time at which the current rate limit window resets, in UTC epoch
        seconds.
    Retry-After:
      schema:
        type: integer
        example: 60
      description: >-
        The number of seconds to wait before making a new request after hitting
        the rate limit.
  schemas:
    WebhookWithSigningSecret:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
          maxLength: 255
          description: A friendly name for the webhook.
          example: My app integration
        targetUrl:
          type: string
          maxLength: 2048
          format: uri
          description: The URL of the webhook.
          example: https://my-app.com/webhook
        subscribedEvents:
          type: array
          items:
            type: object
            properties:
              eventType:
                type: string
              filter:
                type: object
                properties:
                  groupId:
                    type: string
                    maxLength: 255
                  objectType:
                    type: string
                    maxLength: 255
                  path:
                    type: array
                    items:
                      type: string
                      maxLength: 255
                    maxItems: 3
                  value:
                    type: string
                    maxLength: 255
                default: {}
            required:
              - eventType
          maxItems: 20
          description: >-
            The events the webhook is subscribed to, with optional filters. For
            more information on how to use filters, see the [create webhook
            documentation](/api-reference/webhooks/create-a-webhook).
          example:
            - eventType: person.created
              filter: {}
        status:
          type: string
          enum:
            - active
            - inactive
          description: The status of the webhook.
          example: active
        createdAt:
          type: string
          format: date-time
          description: The date and time the webhook was created.
          example: '2025-07-17T09:00:00.000Z'
        signingSecret:
          type: string
          maxLength: 255
          description: The signing secret of the webhook.
          example: whsec_QWFSUzl1QUVoQW1kdWtpTnJRTUFpbXNlZmxLTg==
      required:
        - id
        - name
        - targetUrl
        - subscribedEvents
        - status
        - createdAt
        - signingSecret
      description: A webhook with a visible signing secret.
      example:
        id: wbk_8c18c158-d49e-4ad4-90d4-2b197688bac7
        name: My app integration
        targetUrl: https://my-app.com/webhook
        subscribedEvents:
          - eventType: person.created
            filter: {}
        signingSecret: whsec_QWFSUzl1QUVoQW1kdWtpTnJRTUFpbXNlZmxLTg==
        status: active
        createdAt: '2025-07-17T09:00:00.000Z'
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              example: RATE_LIMIT_EXCEEDED
            message:
              type: string
              example: You have exceeded your rate limit.
            documentationUrl:
              type: string
              format: uri
              example: https://developer.folk.app/api-reference/errors#rate-limiting
            requestId:
              type: string
              format: uuid
              example: 123e4567-e89b-12d3-a456-426614174000
            timestamp:
              type: string
              format: date-time
              example: '2025-10-01T12:00:00Z'
            details:
              type: object
              additionalProperties: true
              example:
                limit: 1000
                remaining: 0
                retryAfter: '2025-10-01T12:00:00Z'
          required:
            - code
            - message
            - documentationUrl
            - requestId
            - timestamp
      required:
        - error
      description: Error response containing error details.
  responses:
    BadRequest:
      description: The request was unacceptable, often due to missing an invalid parameter.
      headers:
        X-RateLimit-Limit:
          $ref: '#/components/headers/X-RateLimit-Limit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/X-RateLimit-Remaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/X-RateLimit-Reset'
        Retry-After:
          $ref: '#/components/headers/Retry-After'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: INVALID_REQUEST
              message: The request was invalid.
              documentationUrl: https://developer.folk.app/api-reference/errors#bad-request
              requestId: 123e4567-e89b-12d3-a456-426614174000
              timestamp: '2025-10-01T12:00:00Z'
    Unauthorized:
      description: No valid API key provided.
      headers:
        X-RateLimit-Limit:
          $ref: '#/components/headers/X-RateLimit-Limit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/X-RateLimit-Remaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/X-RateLimit-Reset'
        Retry-After:
          $ref: '#/components/headers/Retry-After'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: UNAUTHORIZED
              message: No valid API key provided.
              documentationUrl: https://developer.folk.app/api-reference/errors#unauthorized
              requestId: 123e4567-e89b-12d3-a456-426614174000
              timestamp: '2025-10-01T12:00:00Z'
    Forbidden:
      description: The API key doesn’t have permissions to perform the request.
      headers:
        X-RateLimit-Limit:
          $ref: '#/components/headers/X-RateLimit-Limit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/X-RateLimit-Remaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/X-RateLimit-Reset'
        Retry-After:
          $ref: '#/components/headers/Retry-After'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: FORBIDDEN
              message: The API key doesn’t have permissions to perform the request.
              documentationUrl: https://developer.folk.app/api-reference/errors#forbidden
              requestId: 123e4567-e89b-12d3-a456-426614174000
              timestamp: '2025-10-01T12:00:00Z'
    NotFound:
      description: The requested resource doesn’t exist.
      headers:
        X-RateLimit-Limit:
          $ref: '#/components/headers/X-RateLimit-Limit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/X-RateLimit-Remaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/X-RateLimit-Reset'
        Retry-After:
          $ref: '#/components/headers/Retry-After'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: RESOURCE_NOT_FOUND
              message: The requested resource was not found.
              documentationUrl: https://developer.folk.app/api-reference/errors#not-found
              requestId: 123e4567-e89b-12d3-a456-426614174000
              timestamp: '2025-10-01T12:00:00Z'
    UnprocessableEntity:
      description: >-
        The request was unacceptable, often due to missing or invalid
        parameters.
      headers:
        X-RateLimit-Limit:
          $ref: '#/components/headers/X-RateLimit-Limit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/X-RateLimit-Remaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/X-RateLimit-Reset'
        Retry-After:
          $ref: '#/components/headers/Retry-After'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: UNPROCESSABLE_ENTITY
              message: Invalid query parameters
              documentationUrl: >-
                https://developer.folk.app/api-reference/errors#unprocessable-entity
              details:
                issues:
                  - code: too_small
                    minimum: 1
                    type: number
                    inclusive: true
                    exact: false
                    message: Number must be greater than or equal to 1
                    path:
                      - limit
              requestId: 123e4567-e89b-12d3-a456-426614174000
              timestamp: '2025-10-01T12:00:00Z'
    TooManyRequests:
      description: >-
        Too many requests hit the API too quickly. We recommend an exponential
        backoff of your requests.
      headers:
        X-RateLimit-Limit:
          $ref: '#/components/headers/X-RateLimit-Limit'
        X-RateLimit-Remaining:
          $ref: '#/components/headers/X-RateLimit-Remaining'
        X-RateLimit-Reset:
          $ref: '#/components/headers/X-RateLimit-Reset'
        Retry-After:
          $ref: '#/components/headers/Retry-After'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: RATE_LIMIT_EXCEEDED
              message: The rate limit has been exceeded.
              documentationUrl: https://developer.folk.app/api-reference/errors#rate-limiting
              requestId: 123e4567-e89b-12d3-a456-426614174000
              timestamp: '2025-10-01T12:00:00Z'
              details:
                limit: 1000
                remaining: 0
                retryAfter: '2025-10-01T12:00:00Z'
    InternalServerError:
      description: Something went wrong on our end.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: INTERNAL_SERVER_ERROR
              message: An internal server error occurred.
              documentationUrl: >-
                https://developer.folk.app/api-reference/errors#internal-server-error
              requestId: 123e4567-e89b-12d3-a456-426614174000
              timestamp: '2025-10-01T12:00:00Z'
    ServiceUnavailable:
      description: The server is overloaded or down for maintenance.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error:
              code: SERVICE_UNAVAILABLE
              message: The service is currently unavailable.
              documentationUrl: >-
                https://developer.folk.app/api-reference/errors#service-unavailable
              requestId: 123e4567-e89b-12d3-a456-426614174000
              timestamp: '2025-10-01T12:00:00Z'
  securitySchemes:
    bearerApiKeyAuth:
      type: http
      scheme: bearer
      description: API key for authentication

````