openapi: 3.0.3 info: title: Kajabi API V1 Authentication Orders 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: Orders paths: /v1/order_items: get: summary: List order items description: "Order items represent individual products or offers within an order.\n\n## Pagination\nUse `page[number]` and `page[size]` parameters to paginate results:\n### Get first page of 10 items\n* `GET /v1/order_items?page[number]=1&page[size]=10`\n### Get second page of 25 items\n* `GET /v1/order_items?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/order_items?page[number]=2&page[size]=10\",\n \"first\": \"https://api.kajabi.com/v1/order_items?page[number]=1&page[size]=10\",\n \"prev\": \"https://api.kajabi.com/v1/order_items?page[number]=1&page[size]=10\",\n \"next\": \"https://api.kajabi.com/v1/order_items?page[number]=3&page[size]=10\",\n \"last\": \"https://api.kajabi.com/v1/order_items?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 parameters to narrow down results:\n### Filter by site\nUse the `filter[site_id]` parameter to get order items for a specific site:\n* `GET /v1/order_items?filter[site_id]=123`\n### Filter by item type\n* `GET /v1/order_items?filter[item_type_eq]=Offer`\n### Filter by item ID\n* `GET /v1/order_items?filter[item_id_eq]=123`\n### Filter by fulfilled status\n* `GET /v1/order_items?filter[fulfilled_at_null]=true` (unfulfilled items)\n* `GET /v1/order_items?filter[fulfilled_at_null]=false` (fulfilled items)\n\n## Advanced Filtering Examples\n### Range queries\n* `GET /v1/order_items?filter[site_id]=123&filter[quantity_gt]=1`\n* `GET /v1/order_items?filter[site_id]=123&filter[total_price_in_cents_gteq]=1000&filter[total_price_in_cents_lteq]=10000`\n### Pattern matching\n* `GET /v1/order_items?filter[site_id]=123&filter[item_type_cont]=Off`\n* `GET /v1/order_items?filter[site_id]=123&filter[title_i_cont]=course` (case insensitive)\n### Array filters\n* `GET /v1/order_items?filter[site_id]=123&filter[item_id_in]=123,456,789`\n* `GET /v1/order_items?filter[site_id]=123&filter[item_type_not_in]=Bundle,Subscription`\n\n## Sorting\nUse the `sort` parameter to sort the results:\n### Sort by fulfilled_at in ascending order\n* `GET /v1/order_items?filter[site_id]=123&sort=fulfilled_at`\n" tags: - Orders security: - Bearer: [] parameters: - name: sort in: query required: false description: 'Sort order, use: created_at, quantity, fulfilled_at. For descending order use ''-'' e.g. &sort=-created_at' schema: type: string - 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: fields[order_items] in: query required: false description: Partial attributes as specified, e.g. fields[order_items]=quantity,title,total_price_in_cents schema: type: string - name: filter[site_id] in: query required: false description: Filter by site_id, for example ?filter[site_id]=111 schema: type: string - name: filter[item_type_eq] in: query required: false description: Filter by item type, for example ?filter[item_type_eq]=Offer schema: type: string - name: filter[item_id_eq] in: query required: false description: Filter by item ID, for example ?filter[item_id_eq]=123 schema: type: string - name: filter[fulfilled_at_null] in: query required: false description: Filter by fulfillment status, for example ?filter[fulfilled_at_null]=true schema: type: boolean responses: '200': description: Success, list of order items which the current user may access content: application/vnd.api+json: schema: $ref: '#/components/schemas/order_items_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' /v1/order_items/{id}: get: summary: Order item details description: 'Shows details of an order item Order items represent individual products or offers within an order and contain: * Product/offer information * Pricing details * Quantity information * Fulfillment status ## Order Item Attributes * `quantity` (integer) - Number of items purchased * `currency_code` (string) - The ISO currency code for the item * `item_type` (string) - Type of item (e.g., "Offer") * `item_id` (integer) - ID of the associated item * `title` (string) - Title of the item * `total_price_in_cents` (integer) - Total price for this line item * `subtotal_in_cents` (integer) - Subtotal before taxes and discounts * `sales_tax_amount_in_cents` (integer) - Sales tax amount for this item * `discount_amount_in_cents` (integer) - Discount amount for this item * `fulfilled_at` (string) - Timestamp when the item was fulfilled * `created_at` (string) - Timestamp when the order item was created ## Include Related Resources Use the `include` parameter to load related resources: ### Include order * `GET /v1/order_items/123?include=order` ' tags: - Orders security: - Bearer: [] parameters: - name: id in: path required: true schema: type: string - name: include in: query required: false description: Load the related resources, for example ?include=order schema: type: string - name: fields[order_items] in: query required: false description: Partial attributes as specified, e.g. fields[order_items]=quantity,title,total_price_in_cents schema: type: string responses: '200': description: Success, shows details of an order item content: application/vnd.api+json: schema: $ref: '#/components/schemas/order_items_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: order item not found content: application/vnd.api+json: schema: $ref: '#/components/schemas/errors_not_found' /v1/orders: get: summary: List orders description: "Orders for a site\n## Pagination\nUse `page[number]` and `page[size]` parameters to paginate results:\n### Get first page of 10 items\n* `GET /v1/orders?page[number]=1&page[size]=10`\n### Get second page of 25 items\n* `GET /v1/orders?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/orders?page[number]=2&page[size]=10\",\n \"first\": \"https://api.kajabi.com/v1/orders?page[number]=1&page[size]=10\",\n \"prev\": \"https://api.kajabi.com/v1/orders?page[number]=1&page[size]=10\",\n \"next\": \"https://api.kajabi.com/v1/orders?page[number]=3&page[size]=10\",\n \"last\": \"https://api.kajabi.com/v1/orders?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## Sorting\nUse the `sort` parameter to sort the results:\n### Sort by order_number in ascending order\n* `GET /v1/orders?sort=order_number`\n### Sort by created_at in descending order\n* `GET /v1/orders?sort=-created_at`\n\n## Filtering\nUse filter parameters to narrow down results:\n### Filter by site\nUse the `filter[site_id]` parameter to get orders for a specific site:\n* `GET /v1/orders?filter[site_id]=123`\n### Filter by customer\nUse the `filter[customer_id]` parameter to get orders for a specific customer:\n* `GET /v1/orders?filter[customer_id]=456789`\n### Filter by order number\n* `GET /v1/orders?filter[order_number_eq]=12345`\n### Filter by fulfilled status\n* `GET /v1/orders?filter[fulfilled_at_null]=true` (unfulfilled orders)\n* `GET /v1/orders?filter[fulfilled_at_null]=false` (fulfilled orders)\n\n## Advanced Filtering Examples\n### Range queries\n* `GET /v1/orders?filter[site_id]=123&filter[created_at_gteq]=2024-01-01&filter[created_at_lteq]=2024-12-31`\n* `GET /v1/orders?filter[site_id]=123&filter[total_price_in_cents_gt]=5000`\n### Pattern matching\n* `GET /v1/orders?filter[site_id]=123&filter[order_number_cont]=2024`\n* `GET /v1/orders?filter[site_id]=123&filter[currency_code_start]=US`\n### Array filters\n* `GET /v1/orders?filter[site_id]=123&filter[currency_code_in]=USD,EUR,GBP`\n" tags: - Orders security: - Bearer: [] parameters: - name: sort in: query required: false description: 'Sort order, use: order_number, created_at, fulfilled_at. For descending order use ''-'' e.g. &sort=-created_at' schema: type: string - 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: fields[orders] in: query required: false description: Partial attributes as specified, e.g. fields[orders]=order_number,total_price_in_cents schema: type: string - name: filter[site_id] in: query required: false description: Filter by site_id, for example ?filter[site_id]=111 schema: type: string - name: filter[customer_id] in: query required: false description: Filter by customer_id, for example ?filter[customer_id]=456789 schema: type: string - name: filter[order_number_eq] in: query required: false description: Filter by order number, for example ?filter[order_number_eq]=12345 schema: type: string - name: filter[fulfilled_at_null] in: query required: false description: Filter by fulfillment status, for example ?filter[fulfilled_at_null]=true schema: type: boolean responses: '200': description: Success, list of orders which the current user may access content: application/vnd.api+json: schema: $ref: '#/components/schemas/orders_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' /v1/orders/{id}: get: summary: Order details description: 'Shows details of an order Orders represent completed purchase transactions and contain: * Order items (products/offers purchased) * Payment information * Customer information * Fulfillment status ## Order Attributes * `order_number` (integer) - A unique identifier for the order within the site * `currency_code` (string) - The ISO currency code for the order (e.g., "USD") * `total_price_in_cents` (integer) - Total price including taxes and discounts * `subtotal_in_cents` (integer) - Subtotal before taxes and discounts * `sales_tax_amount_in_cents` (integer) - Total sales tax amount * `discount_amount_in_cents` (integer) - Total discount amount * `fulfilled_at` (string) - Timestamp when the order was fulfilled * `created_at` (string) - Timestamp when the order was created ## Include Related Resources Use the `include` parameter to load related resources: ### Include order items, customer * `GET /v1/orders/123?include=order_items,customer` ' tags: - Orders security: - Bearer: [] parameters: - name: id in: path required: true schema: type: string - name: include in: query required: false description: Load the related resources, for example ?include=order_items,customer,site schema: type: string - name: fields[orders] in: query required: false description: Partial attributes as specified, e.g. fields[orders]=order_number,total_price_in_cents schema: type: string responses: '200': description: Success, shows details of an order content: application/vnd.api+json: schema: $ref: '#/components/schemas/orders_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: order not found content: application/vnd.api+json: schema: $ref: '#/components/schemas/errors_not_found' components: schemas: resource_identifiers: type: array items: $ref: '#/components/schemas/resource_identifier' orders_index_response: type: object properties: data: type: array items: 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: $ref: '#/components/schemas/resource_identifier' customer: type: object properties: data: $ref: '#/components/schemas/resource_identifier' order_items: type: object properties: data: $ref: '#/components/schemas/resource_identifiers' links: type: object properties: self: type: string current: type: string order_items_show_response: type: object properties: data: 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: $ref: '#/components/schemas/resource_identifier' links: type: object properties: self: type: string current: type: string errors_not_found: type: object properties: errors: type: array items: $ref: '#/components/schemas/errors_attributes' resource_identifier: type: object properties: id: type: string type: type: string required: - id - type errors_attributes: type: object properties: status: type: string source: type: object nullable: true properties: pointer: type: string title: type: string detail: type: string orders_show_response: type: object properties: data: 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: $ref: '#/components/schemas/resource_identifier' customer: type: object properties: data: $ref: '#/components/schemas/resource_identifier' order_items: type: object properties: data: $ref: '#/components/schemas/resource_identifiers' links: type: object properties: self: type: string current: type: string 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_forbidden: type: object properties: errors: type: array items: $ref: '#/components/schemas/errors_attributes' order_items_index_response: type: object properties: data: type: array items: 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: $ref: '#/components/schemas/resource_identifier' links: type: object properties: self: type: string current: type: string 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 securitySchemes: Bearer: type: http scheme: bearer x-mint: mcp: enabled: true