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 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: - transactions attributes: $ref: '#/components/schemas/transactions_attributes' relationships: type: object properties: customer: type: object properties: data: type: object properties: id: type: string type: type: string enum: - customers offer: type: object properties: data: type: object properties: id: type: string type: type: string enum: - offers nullable: true - 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/order_created_sample: get: summary: Order created sample description: "Returns sample webhook payload for the `order_created` 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:13:05.247Z\"\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:13:05.207Z\",\n \"updated_at\": \"2025-07-31T17:13:05.207Z\"\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 \"id\": \"0\",\n \"type\": \"orders\",\n \"attributes\": {\n \"order_number\": 0,\n \"currency_code\": \"USD\",\n \"fulfilled_at\": null,\n \"created_at\": \"2025-07-31T17:13:05.207Z\",\n \"total_price_in_cents\": 1000,\n \"subtotal_in_cents\": 800,\n \"sales_tax_amount_in_cents\": 200,\n \"discount_amount_in_cents\": 0,\n \"formatted_total_price\": \"$10.00\",\n \"formatted_subtotal\": \"$8.00\",\n \"currency_symbol\": \"$\"\n },\n \"relationships\": {\n \"site\": {\n \"data\": {\n \"id\": \"2\",\n \"type\": \"sites\"\n }\n },\n \"customer\": {\n \"data\": {\n \"id\": \"0\",\n \"type\": \"customers\"\n }\n },\n \"order_items\": {\n \"data\": [\n {\n \"id\": \"0\",\n \"type\": \"order_items\"\n }\n ]\n },\n \"payment_transactions\": {\n \"data\": []\n }\n }\n },\n {\n \"id\": \"0\",\n \"type\": \"order_items\",\n \"attributes\": {\n \"quantity\": 1,\n \"currency_code\": \"USD\",\n \"item_type\": \"Offer\",\n \"item_id\": 0,\n \"title\": \"Kajabi Test Offer\",\n \"fulfilled_at\": null,\n \"created_at\": \"2025-07-31T17:13:05.229Z\",\n \"total_price_in_cents\": 1000,\n \"subtotal_in_cents\": 800,\n \"sales_tax_amount_in_cents\": 200,\n \"discount_amount_in_cents\": 0,\n \"formatted_total_price\": \"$10.00\",\n \"formatted_subtotal\": \"$8.00\",\n \"currency_symbol\": \"$\"\n },\n \"relationships\": {\n \"order\": {\n \"data\": {\n \"id\": \"0\",\n \"type\": \"orders\"\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\": \"order_created\",\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: - transactions attributes: $ref: '#/components/schemas/transactions_attributes' relationships: type: object properties: customer: type: object properties: data: type: object properties: id: type: string type: type: string enum: - customers offer: type: object properties: data: type: object properties: id: type: string type: type: string enum: - offers nullable: true - 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' - type: object properties: id: type: string type: type: string enum: - orders attributes: $ref: '#/components/schemas/orders_attributes' relationships: type: object properties: site: type: object properties: data: type: object properties: id: type: string type: type: string enum: - sites customer: type: object properties: data: type: object properties: id: type: string type: type: string enum: - customers order_items: type: object properties: data: type: array items: type: object properties: id: type: string type: type: string enum: - order_items payment_transactions: type: object properties: data: type: array items: type: object properties: id: type: string type: type: string enum: - transactions - type: object properties: id: type: string type: type: string enum: - order_items attributes: $ref: '#/components/schemas/order_items_attributes' relationships: type: object properties: order: type: object properties: data: type: object properties: id: type: string type: type: string enum: - orders '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' components: schemas: errors_unprocessable: type: object properties: errors: type: array items: $ref: '#/components/schemas/errors_attributes' contact_tags_attributes: type: object properties: name: type: string required: - name form_submission_attributes: type: object properties: name: type: string email: type: string phone_number: type: - string - 'null' business_number: type: - string - 'null' address_line_1: type: - string - 'null' address_line_2: type: - string - 'null' address_city: type: - string - 'null' address_state: type: - string - 'null' address_country: type: - string - 'null' address_zip: type: - string - 'null' custom_1: type: string nullable: true description: Support depends on custom fields of a site custom_2: type: string nullable: true description: Support depends on custom fields of a site custom_3: type: string nullable: true description: Support depends on custom fields of a site contacts_attributes: type: object properties: name: type: string email: type: string phone_number: type: - string - 'null' business_number: type: - string - 'null' subscribed: type: boolean address_line_1: type: - string - 'null' address_line_2: type: - string - 'null' address_city: type: - string - 'null' address_state: type: - string - 'null' address_country: type: - string - 'null' external_user_id: type: string nullable: true description: Supported once contact is granted an offer or makes a purchase address_zip: type: - string - 'null' custom_1: type: string nullable: true description: Support depends on custom fields of a site custom_2: type: string nullable: true description: Support depends on custom fields of a site custom_3: type: string nullable: true description: Support depends on custom fields of a site created_at: type: string format: date-time readOnly: true description: ISO 8601 date-time, read only updated_at: type: string format: date-time readOnly: true description: ISO 8601 date-time, read only hooks_index_response: type: object properties: data: type: array items: type: object properties: id: type: string 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' orders_attributes: type: object properties: order_number: type: integer currency_code: type: string fulfilled_at: type: - string - 'null' created_at: type: string format: date-time readOnly: true description: ISO 8601 date-time, read only total_price_in_cents: type: integer subtotal_in_cents: type: integer sales_tax_amount_in_cents: type: integer discount_amount_in_cents: type: integer formatted_total_price: type: string formatted_subtotal: type: string currency_symbol: type: string form_attributes: type: object properties: title: type: - string - 'null' default: type: boolean webhook_url: type: object nullable: true url: type: string created_at: type: string format: date-time nullable: true readOnly: true description: ISO 8601 date-time, read only updated_at: type: string format: date-time nullable: true readOnly: true description: ISO 8601 date-time, read only errors_attributes: type: object properties: status: type: string source: type: object nullable: true properties: pointer: type: string title: type: string detail: type: string transactions_attributes: type: object properties: action: type: string state: type: string payment_type: type: - string - 'null' amount_in_cents: type: integer sales_tax_in_cents: type: integer currency: type: string currency_symbol: type: string formatted_amount: type: string created_at: type: string format: date-time readOnly: true description: ISO 8601 date-time, read only hooks_attributes: type: object properties: event: type: string enum: - purchase - form_submission - tag_added - tag_removed - payment_succeeded - order_created target_url: type: string created_at: type: string format: date-time readOnly: true description: ISO 8601 date-time, read only updated_at: type: string format: date-time readOnly: true description: ISO 8601 date-time, read only resource_id: type: - integer - 'null' required: - event - target_url customers_attributes: type: object properties: name: type: string email: type: string avatar: type: - string - 'null' external_user_id: type: string nullable: true description: Supported once contact is granted an offer or makes a purchase public_bio: type: - string - 'null' public_location: type: - string - 'null' public_website: type: - string - 'null' socials: type: object nullable: true properties: twitter: type: - string - 'null' facebook: type: - string - 'null' instagram: type: - string - 'null' net_revenue: type: - string - 'null' sign_in_count: type: integer nullable: true description: Read only last_request_at: type: string nullable: true description: ISO 8601 date-time, read only bounced_at: type: string nullable: true description: ISO 8601 date-time, read only created_at: type: string format: date-time readOnly: true description: ISO 8601 date-time, read only updated_at: type: string format: date-time readOnly: true description: ISO 8601 date-time, read only order_items_attributes: type: object properties: quantity: type: integer currency_code: type: string item_type: type: string item_id: type: integer title: type: string fulfilled_at: type: - string - 'null' created_at: type: string format: date-time readOnly: true description: ISO 8601 date-time, read only total_price_in_cents: type: integer subtotal_in_cents: type: integer sales_tax_amount_in_cents: type: integer discount_amount_in_cents: type: integer formatted_total_price: type: string formatted_subtotal: type: string currency_symbol: type: string errors_unauthorized: type: object properties: errors: type: array items: $ref: '#/components/schemas/errors_attributes' errors_not_found: type: object properties: errors: type: array items: $ref: '#/components/schemas/errors_attributes' hooks_show_response: type: object properties: data: type: object properties: id: type: string 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' resource_identifier: type: object properties: id: type: string type: type: string required: - id - type offers_attributes: type: object properties: title: type: string description: type: - string - 'null' internal_title: type: - string - 'null' currency: type: string price_in_cents: type: integer payment_type: type: string token: type: string payment_method: type: string price_description: type: string checkout_url: type: string recurring_offer: type: boolean subscription: type: boolean one_time: type: boolean single: type: boolean free: type: boolean image_url: type: - string - 'null' required: - title purchases_attributes: type: object properties: amount_in_cents: type: integer payment_type: type: string multipay_payments_made: type: - integer - 'null' opt_in: type: boolean raw_extra_contact_information: type: object currency: type: string effective_start_at: type: - string - 'null' cardholder_name: type: - string - 'null' billing_address_zip: type: - string - 'null' deactivated_at: type: - string - 'null' deactivation_reason: type: - string - 'null' coupon_code: type: - string - 'null' source: type: - string - 'null' referrer: type: - string - 'null' quantity: type: integer nullable: true created_at: type: string format: date-time readOnly: true description: ISO 8601 date-time, read only updated_at: type: string format: date-time readOnly: true description: ISO 8601 date-time, read only errors_forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/errors_attributes' securitySchemes: Bearer: type: http scheme: bearer x-mint: mcp: enabled: true