Kajabi Webhooks API

The Webhooks API from Kajabi — 8 operation(s) for webhooks.

Documentation

Specifications

Schemas & Data

Other Resources

OpenAPI Specification

kajabi-webhooks-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Kajabi API V1 Authentication Webhooks API
  version: 1.1.0
  description: "## Public API\n* Server URL `https://api.kajabi.com`\n* Endpoint paths are prefixed with `/v1`\n* Version endpoint `GET https://api.kajabi.com/v1/version`\n* See the [Developers Site](https://developers.kajabi.com) for documentation and examples.\n* Try the demo [Postman collection](https://www.postman.com/kajabi-apis/beta-public-api-demo/collection/fg4iyaz/kajabi-public-api-v1)\n## API Keys\n* Your API `client_id` and `client_secret` are available on the [User API Keys](https://app.kajabi.com/admin/settings/security) section of the Kajabi Admin Portal.\n  * Custom API Keys can be created with specific permissions.\n  * Click the \"Create User API Key\" button, enter a name (e.g. \"My project\"), select the user and permissions, and click \"Create\".\n  * For security purposes, you may \"Delete\" or \"Rotate\" the api credentials at any time; which will invalidate any access tokens granted with the credentials.\n## Video Walkthroughs\n* [Capabilities](https://drive.google.com/file/d/1Puc9B2sSdA-RQb7YMxmUXg4FVoEXytoc/view?usp=sharing)\n* [Getting Started](https://drive.google.com/file/d/1hbGRShkxven_QMWvgYrerHKURbcZrnvJ/view?usp=sharing)\n* [Error Examples](https://drive.google.com/file/d/1i0wQK71I1jpaZVsxYwsn62gVj40S_E7Y/view?usp=sharing)\n* [External Contact Form](https://drive.google.com/file/d/1HqpULXvan5TOK3LvM7nILCuCkCaX0kFT/view?usp=sharing)\n"
  contact:
    email: support@kajabi.com
    name: Support
    url: https://help.kajabi.com/hc/en-us/articles/4404549690523-How-to-Get-Help-From-Kajabi-Live-Agents
  license:
    name: Apache 2.0
    url: http://www.apache.org/licenses/LICENSE-2.0.html
servers:
- url: https://api.kajabi.com
  description: Production
tags:
- name: Webhooks
paths:
  /v1/hooks:
    get:
      summary: List hooks
      description: "Lists webhooks for a site\n\n## Pagination\nUse `page[number]` and `page[size]` parameters to paginate results:\n### Get first page of 10 items\n* `GET /v1/hooks?page[number]=1&page[size]=10`\n### Get second page of 25 items\n* `GET /v1/hooks?page[number]=2&page[size]=25`\n\nThe response includes pagination links and meta data:\n```json\n{\n  \"links\": {\n    \"self\": \"https://api.kajabi.com/v1/hooks?page[number]=2&page[size]=10\",\n    \"first\": \"https://api.kajabi.com/v1/hooks?page[number]=1&page[size]=10\",\n    \"prev\": \"https://api.kajabi.com/v1/hooks?page[number]=1&page[size]=10\",\n    \"next\": \"https://api.kajabi.com/v1/hooks?page[number]=3&page[size]=10\",\n    \"last\": \"https://api.kajabi.com/v1/hooks?page[number]=5&page[size]=10\"\n  },\n  \"meta\": {\n    \"total_pages\": 5,\n    \"total_count\": 50,\n    \"current_page\": 2\n  }\n}\n```\n## Filtering\nUse `filter[event_eq]` parameter to filter webhooks by event type:\n### Get webhooks for purchase events only\n* `GET /v1/hooks?filter[event_eq]=purchase`\n"
      tags:
      - Webhooks
      security:
      - Bearer: []
      parameters:
      - name: page[number]
        in: query
        required: false
        schema:
          type: integer
      - name: page[size]
        in: query
        required: false
        description: Number of documents
        schema:
          type: integer
      - name: filter[event_eq]
        in: query
        required: false
        schema:
          type: string
          enum:
          - purchase
          - form_submission
          - tag_added
          - tag_removed
          - payment_succeeded
          - order_created
        description: Filter by event type, for example ?filter[event_eq]=purchase
      responses:
        '200':
          description: Success, list of hooks which the current user may access
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/hooks_index_response'
        '401':
          description: Unauthorized, Authorization header is missing or invalid
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_unauthorized'
        '403':
          description: Forbidden, insufficient permission to access the resource
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_forbidden'
    post:
      summary: Create hook
      description: "Creates a new webhook subscription\n\n## Request Body\nThe request must include:\n* `data` - parent object which includes the children/nested attributes:\n* `target_url` - The URL where webhook events will be sent\n* `event` - The type of event to subscribe to (see available events below), for example \"tag_added\"\n* `resource_id` (optional) - Specific resource ID to filter events for, for example the id of the Contact Tag. When the property is omitted, the webhook will be triggered for all events of the specified type, as a wildcard webhook.\n\n## Available Event Types\n\n| Event | Description | Required API Scopes |\n|-------|-------------|-------------------|\n| `purchase` | Customer makes a purchase | `view:purchases` |\n| `payment_succeeded` | Payment transaction completes successfully | `view:transactions` |\n| `order_created` | New order is created | `view:transactions`, `view:orders` |\n| `form_submission` | Someone submits a form | `view:form_submissions` |\n| `tag_added` | Tag is added to a contact | `view:contacts` |\n| `tag_removed` | Tag is removed from a contact | `view:contacts` |\n\n**Note**: You can only create webhooks for events you have permission to access based on your API key scopes. For example to use tags you need the `view:contacts` scope, which is included in the account owner api key scope.\n\n## Sample Payloads\nYou can view sample webhook payloads for each event type:\n* `GET /v1/hooks/purchase_sample`\n* `GET /v1/hooks/payment_succeeded_sample`\n* `GET /v1/hooks/order_created_sample`\n* `GET /v1/hooks/form_submission_sample`\n* `GET /v1/hooks/tag_added_sample`\n* `GET /v1/hooks/tag_removed_sample`\n\nExample request targeting a specific tag:\n```json\n{\n  \"data\": {\n    \"type\": \"hooks\",\n    \"attributes\": {\n      \"target_url\": \"https://example.com/webhook\",\n      \"event\": \"tag_added\",\n      \"resource_id\": \"123\"\n    },\n    \"relationships\": {\n      \"site\": {\n        \"data\": {\n          \"id\": \"456\",\n          \"type\": \"sites\"\n        }\n      }\n    }\n  }\n}\n```\n\nExample request using a wildcard webhook:\n```json\n{\n  \"data\": {\n    \"type\": \"hooks\",\n    \"attributes\": {\n      \"target_url\": \"https://example.com/webhook\",\n      \"event\": \"tag_added\"\n    },\n    \"relationships\": {\n      \"site\": {\n        \"data\": {\n          \"id\": \"456\",\n          \"type\": \"sites\"\n        }\n      }\n    }\n  }\n}\n```\n\n## Actual Payloads\nThe actual payloads are sent to the `target_url` as a POST request with the following JSON body:\n```json\n{\n  \"id\": \"hash_id\",\n  \"event\": \"tag_added\",\n  \"payload\": [],\n}\n```\nThe `id` is the ID of the resource that triggered the event.\nThe `event` is the type of event that triggered the webhook.\nThe `payload` is the actual payload of the event and the content will be similar to the sample payloads above.\n"
      tags:
      - Webhooks
      security:
      - Bearer: []
      parameters: []
      responses:
        '201':
          description: Success, webhook created
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/hooks_show_response'
        '401':
          description: Unauthorized, Authorization header is missing or invalid
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_unauthorized'
        '403':
          description: Forbidden, insufficient permission to access the resource
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_forbidden'
        '422':
          description: Unprocessable Entity, invalid parameters
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_unprocessable'
      requestBody:
        content:
          application/vnd.api+json:
            schema:
              type: object
              properties:
                data:
                  type: object
                  properties:
                    type:
                      type: string
                      enum:
                      - hooks
                    attributes:
                      $ref: '#/components/schemas/hooks_attributes'
                    relationships:
                      type: object
                      properties:
                        site:
                          type: object
                          properties:
                            data:
                              $ref: '#/components/schemas/resource_identifier'
                      required:
                      - site
                  required:
                  - type
                  - attributes
                  - relationships
              required:
              - data
  /v1/hooks/{id}:
    get:
      summary: Hook details
      description: Returns specific hook based on it ID
      tags:
      - Webhooks
      security:
      - Bearer: []
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success, webhook retrieved
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/hooks_show_response'
        '401':
          description: Unauthorized, Authorization header is missing or invalid
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_unauthorized'
        '403':
          description: Forbidden, insufficient permission to access the resource
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_forbidden'
        '404':
          description: Not Found, webhook does not exist
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_not_found'
    delete:
      summary: Delete hook
      description: Deletes a webhook subscription
      tags:
      - Webhooks
      security:
      - Bearer: []
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      responses:
        '204':
          description: Success, webhook deleted
        '401':
          description: Unauthorized, Authorization header is missing or invalid
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_unauthorized'
        '403':
          description: Forbidden, insufficient permission to access the resource
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_forbidden'
        '404':
          description: Not Found, webhook does not exist
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_not_found'
  /v1/hooks/tag_added_sample:
    get:
      summary: Tag added sample
      description: "Returns sample webhook payload for the `tag_added` event:\n```\n[\n  {\n    \"id\": \"0\",\n    \"type\": \"contacts\",\n    \"attributes\": {\n      \"name\": \"Sample Recipient\",\n      \"email\": \"sample@example.com\",\n      \"address_line_1\": \"123 Kajabi Ln\",\n      \"address_line_2\": \"Kajabi Suite 4\",\n      \"address_city\": \"Kajabiwood\",\n      \"address_country\": \"United Sites of Kajabi\",\n      \"address_state\": \"Kajabifornia\",\n      \"address_zip\": \"99999\",\n      \"phone_number\": \"5555555555\",\n      \"business_number\": null,\n      \"subscribed\": false,\n      \"external_user_id\": null,\n      \"created_at\": \"2025-07-31T16:51:04.010Z\",\n      \"updated_at\": \"2025-07-31T16:51:04.010Z\"\n    },\n    \"links\": {\n      \"customer\": \"\"\n    },\n    \"relationships\": {\n      \"site\": {\n        \"data\": {\n          \"id\": \"2\",\n          \"type\": \"sites\"\n        }\n      }\n    }\n  },\n  {\n    \"id\": \"0\",\n    \"type\": \"contact_tags\",\n    \"attributes\": {\n      \"name\": \"Tag\"\n    },\n    \"relationships\": {\n      \"site\": {\n        \"data\": {\n          \"id\": \"2\",\n          \"type\": \"sites\"\n        }\n      }\n    }\n  }\n]\n```\n## Actual Payloads\nThe actual payloads are sent to the `target_url` as a POST request with the following JSON body:\n```json\n{\n  \"id\": \"hash_id\",\n  \"event\": \"tag_added\",\n  \"payload\": [],\n}\n```\nThe `payload` array is the sample response above\n"
      tags:
      - Webhooks
      security:
      - Bearer: []
      responses:
        '200':
          description: Success, returns sample webhook payload
          content:
            application/vnd.api+json:
              schema:
                type: array
                items:
                  anyOf:
                  - type: object
                    properties:
                      id:
                        type: string
                      type:
                        type: string
                        enum:
                        - contacts
                      attributes:
                        $ref: '#/components/schemas/contacts_attributes'
                      relationships:
                        type: object
                        properties:
                          tags:
                            type: object
                            properties:
                              data:
                                type: array
                                items:
                                  type: object
                                  properties:
                                    id:
                                      type: string
                                    type:
                                      type: string
                                      enum:
                                      - contact_tags
                  - type: object
                    properties:
                      id:
                        type: string
                      type:
                        type: string
                        enum:
                        - contact_tags
                      attributes:
                        $ref: '#/components/schemas/contact_tags_attributes'
        '401':
          description: Unauthorized, Authorization header is missing or invalid
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_unauthorized'
        '403':
          description: Forbidden, insufficient permission to access the resource
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_forbidden'
  /v1/hooks/tag_removed_sample:
    get:
      summary: Tag removed sample
      description: "Returns sample webhook payload for the `tag_removed` event:\n```\n[\n  {\n    \"id\": \"0\",\n    \"type\": \"contacts\",\n    \"attributes\": {\n      \"name\": \"Sample Recipient\",\n      \"email\": \"sample@example.com\",\n      \"address_line_1\": \"123 Kajabi Ln\",\n      \"address_line_2\": \"Kajabi Suite 4\",\n      \"address_city\": \"Kajabiwood\",\n      \"address_country\": \"United Sites of Kajabi\",\n      \"address_state\": \"Kajabifornia\",\n      \"address_zip\": \"99999\",\n      \"phone_number\": \"5555555555\",\n      \"business_number\": null,\n      \"subscribed\": false,\n      \"external_user_id\": null,\n      \"created_at\": \"2025-07-31T16:51:04.010Z\",\n      \"updated_at\": \"2025-07-31T16:51:04.010Z\"\n    },\n    \"links\": {\n      \"customer\": \"\"\n    },\n    \"relationships\": {\n      \"site\": {\n        \"data\": {\n          \"id\": \"2\",\n          \"type\": \"sites\"\n        }\n      }\n    }\n  },\n  {\n    \"id\": \"0\",\n    \"type\": \"contact_tags\",\n    \"attributes\": {\n      \"name\": \"Tag\"\n    },\n    \"relationships\": {\n      \"site\": {\n        \"data\": {\n          \"id\": \"2\",\n          \"type\": \"sites\"\n        }\n      }\n    }\n  }\n]\n```\n## Actual Payloads\nThe actual payloads are sent to the `target_url` as a POST request with the following JSON body:\n```json\n{\n  \"id\": \"hash_id\",\n  \"event\": \"tag_removed\",\n  \"payload\": [],\n}\n```\nThe `payload` array is the sample response above\n"
      tags:
      - Webhooks
      security:
      - Bearer: []
      responses:
        '200':
          description: Success, returns sample webhook payload
          content:
            application/vnd.api+json:
              schema:
                type: array
                items:
                  anyOf:
                  - type: object
                    properties:
                      id:
                        type: string
                      type:
                        type: string
                        enum:
                        - contacts
                      attributes:
                        $ref: '#/components/schemas/contacts_attributes'
                      relationships:
                        type: object
                        properties:
                          tags:
                            type: object
                            properties:
                              data:
                                type: array
                                items:
                                  type: object
                                  properties:
                                    id:
                                      type: string
                                    type:
                                      type: string
                                      enum:
                                      - contact_tags
                  - type: object
                    properties:
                      id:
                        type: string
                      type:
                        type: string
                        enum:
                        - contact_tags
                      attributes:
                        $ref: '#/components/schemas/contact_tags_attributes'
        '401':
          description: Unauthorized, Authorization header is missing or invalid
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_unauthorized'
        '403':
          description: Forbidden, insufficient permission to access the resource
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_forbidden'
  /v1/hooks/form_submission_sample:
    get:
      summary: Form submission sample
      description: "Returns sample webhook payload for the `form_submission` event:\n```\n[\n  {\n    \"id\": \"0\",\n    \"type\": \"form_submissions\",\n    \"attributes\": {\n      \"name\": \"John Doe\",\n      \"email\": \"john.doe@example.com\",\n      \"address_line_1\": null,\n      \"address_line_2\": null,\n      \"address_city\": null,\n      \"address_country\": null,\n      \"address_state\": null,\n      \"address_zip\": null,\n      \"phone_number\": null,\n      \"business_number\": null,\n      \"mobile_phone_number\": null\n    },\n    \"relationships\": {\n      \"site\": {\n        \"data\": {\n          \"id\": \"2\",\n          \"type\": \"sites\"\n        }\n      },\n      \"form\": {\n        \"data\": {\n          \"id\": \"0\",\n          \"type\": \"forms\"\n        }\n      }\n    }\n  },\n  {\n    \"id\": \"0\",\n    \"type\": \"forms\",\n    \"attributes\": {\n      \"url\": \"https://bill-heaton.kajabi-products.test/forms/0\",\n      \"title\": \"Sample Form\",\n      \"default\": false,\n      \"webhook_url\": null,\n      \"created_at\": null,\n      \"updated_at\": null\n    },\n    \"relationships\": {\n      \"site\": {\n        \"data\": {\n          \"id\": \"2\",\n          \"type\": \"sites\"\n        }\n      },\n      \"fields\": {\n        \"data\": []\n      },\n      \"contact_tags\": {\n        \"data\": []\n      }\n    }\n  }\n]\n```\n## Actual Payloads\nThe actual payloads are sent to the `target_url` as a POST request with the following JSON body:\n```json\n{\n  \"id\": \"hash_id\",\n  \"event\": \"form_submission\",\n  \"payload\": [],\n}\n```\nThe `payload` array is the sample response above\n"
      tags:
      - Webhooks
      security:
      - Bearer: []
      responses:
        '200':
          description: Success, returns sample webhook payload
          content:
            application/vnd.api+json:
              schema:
                type: array
                items:
                  anyOf:
                  - type: object
                    properties:
                      id:
                        type: string
                      type:
                        type: string
                        enum:
                        - form_submissions
                      attributes:
                        $ref: '#/components/schemas/form_submission_attributes'
                      relationships:
                        type: object
                        properties:
                          tags:
                            type: object
                            properties:
                              data:
                                type: array
                                items:
                                  type: object
                                  properties:
                                    id:
                                      type: string
                                    type:
                                      type: string
                                      enum:
                                      - forms
                  - type: object
                    properties:
                      id:
                        type: string
                      type:
                        type: string
                        enum:
                        - forms
                      attributes:
                        $ref: '#/components/schemas/form_attributes'
        '401':
          description: Unauthorized, Authorization header is missing or invalid
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_unauthorized'
        '403':
          description: Forbidden, insufficient permission to access the resource
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_forbidden'
  /v1/hooks/purchase_sample:
    get:
      summary: Purchase sample
      description: "Returns sample webhook payload for the `purchase` event:\n```\n[\n  {\n    \"id\": \"0\",\n    \"type\": \"purchases\",\n    \"attributes\": {\n      \"amount_in_cents\": 1000,\n      \"payment_type\": \"single\",\n      \"multipay_payments_made\": null,\n      \"opt_in\": false,\n      \"raw_extra_contact_information\": {},\n      \"currency\": \"USD\",\n      \"effective_start_at\": null,\n      \"cardholder_name\": null,\n      \"billing_address_zip\": null,\n      \"deactivated_at\": null,\n      \"deactivation_reason\": null,\n      \"coupon_code\": null,\n      \"source\": null,\n      \"referrer\": null,\n      \"quantity\": 1,\n      \"created_at\": \"2025-07-31T16:59:27.580Z\",\n      \"updated_at\": \"2025-07-31T16:59:27.580Z\"\n    },\n    \"relationships\": {\n      \"customer\": {\n        \"data\": {\n          \"id\": \"0\",\n          \"type\": \"customers\"\n        }\n      },\n      \"offer\": {\n        \"data\": {\n          \"id\": \"0\",\n          \"type\": \"offers\"\n        }\n      },\n      \"products\": {\n        \"data\": []\n      }\n    }\n  },\n  {\n    \"id\": \"0\",\n    \"type\": \"offers\",\n    \"attributes\": {\n      \"title\": \"Kajabi Test Offer\",\n      \"description\": null,\n      \"internal_title\": null,\n      \"currency\": \"USD\",\n      \"price_in_cents\": 1000,\n      \"payment_type\": \"single\",\n      \"token\": \"n8NtoHUZ\",\n      \"image_url\": null,\n      \"payment_method\": \"stripe_and_paypal\",\n      \"price_description\": \"$10.00 USD\",\n      \"checkout_url\": \"https://bill-heaton.kajabi-products.test/offers/n8NtoHUZ\",\n      \"recurring_offer\": false,\n      \"subscription\": false,\n      \"one_time\": true,\n      \"single\": true,\n      \"free\": false\n    },\n    \"relationships\": {\n      \"site\": {\n        \"data\": {\n          \"id\": \"2\",\n          \"type\": \"sites\"\n        }\n      },\n      \"products\": {\n        \"data\": []\n      },\n      \"forms\": {\n        \"data\": []\n      }\n    }\n  },\n  {\n    \"id\": \"0\",\n    \"type\": \"customers\",\n    \"attributes\": {\n      \"name\": \"John Doe\",\n      \"email\": \"john.doe@example.com\",\n      \"avatar\": null,\n      \"external_user_id\": null,\n      \"public_bio\": null,\n      \"public_location\": null,\n      \"public_website\": null,\n      \"socials\": null,\n      \"net_revenue\": \"0.0\",\n      \"sign_in_count\": 0,\n      \"last_request_at\": null,\n      \"bounced_at\": null,\n      \"created_at\": \"2025-07-31T16:59:27.552Z\",\n      \"updated_at\": \"2025-07-31T16:59:27.552Z\"\n    },\n    \"links\": {\n      \"contact\": \"https://www.kajabi.test/api/v1/contacts/0\"\n    },\n    \"relationships\": {\n      \"site\": {\n        \"data\": {\n          \"id\": \"2\",\n          \"type\": \"sites\"\n        }\n      },\n      \"contact\": {\n        \"data\": {\n          \"id\": \"0\",\n          \"type\": \"contacts\"\n        }\n      },\n      \"offers\": {\n        \"data\": [],\n        \"links\": {\n          \"self\": \"https://www.kajabi.test/api/v1/customers/0/relationships/offers\"\n        }\n      },\n      \"products\": {\n        \"data\": []\n      }\n    }\n  }\n]\n```\n## Actual Payloads\nThe actual payloads are sent to the `target_url` as a POST request with the following JSON body:\n```json\n{\n  \"id\": \"hash_id\",\n  \"event\": \"purchase\",\n  \"payload\": [],\n}\n```\nThe `payload` array is the sample response above\n"
      tags:
      - Webhooks
      security:
      - Bearer: []
      responses:
        '200':
          description: Success, returns sample webhook payload
          content:
            application/vnd.api+json:
              schema:
                type: array
                items:
                  anyOf:
                  - type: object
                    properties:
                      id:
                        type: string
                      type:
                        type: string
                        enum:
                        - purchases
                      attributes:
                        $ref: '#/components/schemas/purchases_attributes'
                      relationships:
                        type: object
                        properties:
                          customer:
                            type: object
                            properties:
                              data:
                                type: object
                                properties:
                                  id:
                                    type: string
                                  type:
                                    type: string
                                    enum:
                                    - customers
                          offers:
                            type: object
                            properties:
                              data:
                                type: array
                                items:
                                  type: object
                                  properties:
                                    id:
                                      type: string
                                    type:
                                      type: string
                                      enum:
                                      - offers
                          products:
                            type: object
                            properties:
                              data:
                                type: array
                                items:
                                  type: object
                                  properties:
                                    id:
                                      type: string
                                    type:
                                      type: string
                                      enum:
                                      - offers
                  - type: object
                    properties:
                      id:
                        type: string
                      type:
                        type: string
                        enum:
                        - customers
                      attributes:
                        $ref: '#/components/schemas/customers_attributes'
                  - type: object
                    properties:
                      id:
                        type: string
                      type:
                        type: string
                        enum:
                        - offers
                      attributes:
                        $ref: '#/components/schemas/offers_attributes'
        '401':
          description: Unauthorized, Authorization header is missing or invalid
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_unauthorized'
        '403':
          description: Forbidden, insufficient permission to access the resource
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/errors_forbidden'
  /v1/hooks/payment_succeeded_sample:
    get:
      summary: Payment succeeded sample
      description: "Returns sample webhook payload for the `payment_succeeded` event:\n```\n[\n  {\n    \"id\": \"0\",\n    \"type\": \"transactions\",\n    \"attributes\": {\n      \"action\": \"charge\",\n      \"state\": \"succeeded\",\n      \"payment_type\": \"charge\",\n      \"amount_in_cents\": 1000,\n      \"sales_tax_in_cents\": 0,\n      \"currency\": \"USD\",\n      \"currency_symbol\": \"$\",\n      \"formatted_amount\": \"$10.00\",\n      \"created_at\": \"2025-07-31T17:10:19.285Z\"\n    },\n    \"relationships\": {\n      \"customer\": {\n        \"data\": {\n          \"id\": \"0\",\n          \"type\": \"customers\"\n        }\n      },\n      \"offer\": {\n        \"data\": null\n      }\n    }\n  },\n  {\n    \"id\": \"0\",\n    \"type\": \"customers\",\n    \"attributes\": {\n      \"name\": \"John Doe\",\n      \"email\": \"john.doe@example.com\",\n      \"avatar\": null,\n      \"external_user_id\": null,\n      \"public_bio\": null,\n      \"public_location\": null,\n      \"public_website\": null,\n      \"socials\": null,\n      \"net_revenue\": \"0.0\",\n      \"sign_in_count\": 0,\n      \"last_request_at\": null,\n      \"bounced_at\": null,\n      \"created_at\": \"2025-07-31T17:10:19.243Z\",\n      \"updated_at\": \"2025-07-31T17:10:19.243Z\"\n    },\n    \"links\": {\n      \"contact\": \"https://www.kajabi.test/api/v1/contacts/0\"\n    },\n    \"relationships\": {\n      \"site\": {\n        \"data\": {\n          \"id\": \"2\",\n          \"type\": \"sites\"\n        }\n      },\n      \"contact\": {\n        \"data\": {\n          \"id\": \"0\",\n          \"type\": \"contacts\"\n        }\n      },\n      \"offers\": {\n        \"data\": [],\n        \"links\": {\n          \"self\": \"https://www.kajabi.test/api/v1/customers/0/relationships/offers\"\n        }\n      },\n      \"products\": {\n        \"data\": []\n      }\n    }\n  }\n]\n```\n## Actual Payloads\nThe actual payloads are sent to the `target_url` as a POST request with the following JSON body:\n```json\n{\n  \"id\": \"hash_id\",\n  \"event\": \"payment_succeeded\",\n  \"payload\": [],\n}\n```\nThe `payload` array is the sample

# --- truncated at 32 KB (58 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/kajabi/refs/heads/main/openapi/kajabi-webhooks-api-openapi.yml