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

# Update a webhook

> Update an existing webhook in the workspace.

Update an existing webhook to modify the events it is subscribed to, the target URL, its status or its name.

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 patch /v1/webhooks/{webhookId}
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/{webhookId}:
    patch:
      tags:
        - Webhooks
      summary: Update a webhook
      description: Update an existing webhook in the workspace.
      operationId: updateWebhook
      parameters:
        - schema:
            type: string
            minLength: 40
            maxLength: 40
          required: true
          description: The ID of the webhook to update.
          name: webhookId
          in: path
      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
                status:
                  type: string
                  enum:
                    - active
                    - inactive
                  description: The status of the webhook.
                  example: active
              additionalProperties: false
      responses:
        '200':
          description: The updated webhook in the workspace.
          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/Webhook'
                  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: {}
                  redactedSigningSecret: whs_fx**********************oVMa
                  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:
    Webhook:
      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: {}
        redactedSigningSecret:
          type: string
          maxLength: 255
          description: The signing secret of the webhook.
          example: whs_fx**********************oVMa
        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'
      required:
        - id
        - name
        - targetUrl
        - subscribedEvents
        - redactedSigningSecret
        - status
        - createdAt
      description: >-
        A webhook listening to events from the workspace and sending them to a
        URL.
      example:
        id: wbk_8c18c158-d49e-4ad4-90d4-2b197688bac7
        name: My app integration
        targetUrl: https://my-app.com/webhook
        subscribedEvents:
          - eventType: person.created
            filter: {}
        redactedSigningSecret: whs_fx**********************oVMa
        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

````