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