Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: Kajabi API V1 Courses API
version: 1.1.0
description: '## Public API
* Server URL `https://api.kajabi.com`
* Endpoint paths are prefixed with `/v1`
* Version endpoint `GET https://api.kajabi.com/v1/version`
* See the Developers Site for documentation and examples.'
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: Courses
paths:
/v1/courses:
get:
summary: List courses
description: 'List of courses that can be offered to a contact or purchased
## Pagination
Use the `page[number]` and `page[size]` query parameters to paginate results:
### Get first page of 10 items
* `GET /v1/courses?page[number]=1&page[size]=10`
### Get second page of 25 items
* `GET /v1/courses?page[number]=2&page[size]=25`
The response includes pagination links and meta data:
```json
{
"links": {
"self": "https://api.kajabi.com/v1/courses?page[number]=2&page[size]=10",
"first": "https://api.kajabi.com/v1/courses?page[number]=1&page[size]=10",
"prev": "https://api.kajabi.com/v1/courses?page[number]=1&page[size]=10",
"next": "https://api.kajabi.com/v1/courses?page[number]=3&page[size]=10",
"last": "https://api.kajabi.com/v1/courses?page[number]=5&page[size]=10"
},
"meta": {
"total_pages": 5,
"total_count": 50,
"current_page": 2
}
}
```
## Sorting
Use the `sort` parameter to sort the results:
### Sort by title in ascending order
* `GET /v1/courses?sort=title`
### Sort by title in descending order
* `GET /v1/courses?sort=-title`
Response will include courses sorted by the specified field
```json
{
"data": [
{
"id": "123",
"type": "courses",
"attributes": {
"title": "Advanced Marketing",
"description": "Master level marketing course",
"status": "active"
}
},
{
"id": "456",
"type": "courses",
"attributes": {
"title": "Marketing Basics",
"description": "Introduction to marketing",
"status": "active"
}
}
]
}
```
## Sparse Fields
Use the `fields` parameter to request only specific attributes:
### Only return title and thumbnail_url attributes
* `GET /v1/courses?fields[courses]=title,thumbnail_url`
Response will only include requested fields
```json
{
"data": [{
"id": "123",
"type": "courses",
"attributes": {
"title": "Marketing Fundamentals",
"thumbnail_url": "https://example.com/thumbnail.jpg"
}
}]
}
```
## Filter by Site ID
Use the `filter[site_id]` parameter to get courses for a specific site:
### Get courses for site with ID 123
* `GET /v1/courses?filter[site_id]=123`
Response will only include courses for that site
```json
{
"data": [{
"id": "456",
"type": "courses",
"attributes": {
"title": "Marketing Fundamentals",
"description": "Introduction to marketing concepts",
"status": "active"
},
"relationships": {
"site": {
"data": {
"id": "123",
"type": "sites"
}
}
}
}]
}
```
## Filter by Title Contains
Use the `filter[title_cont]` parameter to find courses where the title contains specific text:
### Get courses with titles containing "marketing"
* `GET /v1/courses?filter[title_cont]=marketing`
Response will include courses with matching titles
```json
{
"data": [{
"id": "456",
"type": "courses",
"attributes": {
"title": "Marketing Fundamentals",
"description": "Introduction to marketing concepts",
"status": "active"
}
}]
}
```
## Filter by Description Contains
Use the `filter[description_cont]` parameter to find courses where the description contains specific text:
### Get courses with descriptions containing "marketing"
* `GET /v1/courses?filter[description_cont]=marketing`
Response will include courses with matching descriptions
```json
{
"data": [{
"id": "456",
"type": "courses",
"attributes": {
"title": "Marketing Fundamentals",
"description": "Introduction to marketing concepts and strategies",
"status": "active"
}
}]
}
```
## Using Multiple Parameters Together
You can combine pagination, sparse fields, filtering and sorting in a single request:
### Get first page of 10 courses for site 123, sorted by title, showing only specific fields
* `GET /v1/courses?page[number]=1&page[size]=10&filter[site_id]=123&sort=title&fields[courses]=title,thumbnail_url`
Response will include pagination, sorted filtered results with requested fields
```json
{
"data": [{
"id": "456",
"type": "courses",
"attributes": {
"title": "Advanced Marketing",
"thumbnail_url": "https://example.com/thumbnail1.jpg"
}
},
{
"id": "789",
"type": "courses",
"attributes": {
"title": "Marketing Basics",
"thumbnail_url": "https://example.com/thumbnail2.jpg"
}
}],
"links"…'
tags:
- Courses
security:
- Bearer: []
parameters:
- name: sort
in: query
required: false
description: 'Sort order, use: title, for descending order use ''-'' e.g. &sort=-title'
schema:
type: string
- name: page[number]
in: query
required: false
schema:
type: number
- name: page[size]
in: query
required: false
description: Number of documents
schema:
type: number
- name: fields[courses]
in: query
required: false
description: Partial attributes as specified, e.g. fields[courses]=title,thumbnail_url
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[title_cont]
in: query
required: false
description: Filter by title contains, for example ?filter[title_cont]=marketing
schema:
type: string
- name: filter[description_cont]
in: query
required: false
description: Filter by description contains, for example ?filter[description_cont]=marketing
schema:
type: string
- name: filter[publish_status_eq]
in: query
required: false
description: Filter by publish status, for example ?filter[publish_status_eq]=published
schema:
type: string
responses:
'200':
description: Success, list of courses which the current user may access
content:
application/vnd.api+json:
schema:
$ref: '#/components/schemas/courses_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'
operationId: getV1Courses
x-operation-id-source: derived
/v1/courses/{id}:
get:
summary: Course details
description: 'Details of a course that can be offered to a contact or purchased
## Course Attributes
* `created_at` (string) - The date and time the course was created
* `title` (string) - The title of the course
* `description` (string) - The description of the course
* `thumbnail_url` (string) - The URL of the course thumbnail
## Including Relationships
Use the `include` query parameter to load related resources:
### Include modules, lessons and related media, and offers
* `GET /v1/courses/123?include=modules,lessons,lessons.media,offers`
Response will include the requested related resources
(Note: The responses listed within the "included" array will also include the relationships for each resource)
```json
{
"data": {
"id": "123",
"type": "courses",
"attributes": {
"created_at": "2024-08-06T05:30:38.669Z",
"title": "Advanced Marketing",
"description": "Master level marketing course",
"thumbnail_url": "https://example.com/thumbnail.jpg"
},
"relationships": {
"modules": {
"data": [{
"id": "456",
"type": "modules"
}]
},
"lessons": {
"data": [{
"id": "789",
"type": "lessons"
}]
},
"offers": {
"data": [{
"id": "101",
"type": "offers"
}]
}
},
"included": [{
"id": "456",
"type": "modules",
"attributes": {
"title": "Marketing Fundamentals",
"description": "Introduction to marketing concepts",
"position": 1,
"poster_image_url": "https://example.com/poster.jpg",
"publishing_option": "published"
}
},
{
"id": "789",
"type": "lessons",
"attributes": {
"title": "Marketing Basics",
"position": 1,
"status": "published",
"publishing_option": "published"
}
},
{
"id": "202",
"type": "media",
"attributes": {
"duration_in_minutes": 1,
}
},
{
"id": "101",
"type": "offers",
"attributes": {
"price": 100.0,
"currency": "USD",
"status": "active"
}
}]
}
}
```
## Module attributes
Modules are part of Kajabi''s course structure: courses contain modules and modules contain lessons
* `title` (string) - A required field that represents the name or heading of the module.'
tags:
- Courses
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=modules,lessons,lessons.media
schema:
type: string
responses:
'200':
description: Success, shows details of a course
content:
application/vnd.api+json:
schema:
$ref: '#/components/schemas/courses_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'
operationId: getV1CoursesById
x-operation-id-source: derived
components:
schemas:
errors_attributes:
type: object
properties:
status:
type: string
source:
type:
- object
- 'null'
properties:
pointer:
type: string
title:
type: string
detail:
type: string
courses_index_response:
type: object
properties:
data:
type: array
items:
type: object
properties:
id:
type: string
type:
type: string
attributes:
$ref: '#/components/schemas/courses_attributes'
relationships:
type: object
properties:
site:
type: object
properties:
data:
$ref: '#/components/schemas/resource_identifier'
links:
type: object
properties:
self:
type: string
current:
type: string
courses_show_response:
type: object
properties:
data:
type: object
properties:
id:
type: string
type:
type: string
attributes:
$ref: '#/components/schemas/courses_attributes'
relationships:
type: object
properties:
site:
type: object
properties:
data:
$ref: '#/components/schemas/resource_identifier'
offers:
type: object
properties:
data:
$ref: '#/components/schemas/resource_identifiers'
modules:
type: object
properties:
data:
$ref: '#/components/schemas/resource_identifiers'
lessons:
type: object
properties:
data:
$ref: '#/components/schemas/resource_identifiers'
links:
type: object
properties:
self:
type: string
current:
type: string
included:
type: array
items:
type: object
properties:
id:
type: string
type:
type: string
attributes:
anyOf:
- $ref: '#/components/schemas/offers_attributes'
- $ref: '#/components/schemas/courses_attributes'
- $ref: '#/components/schemas/course_modules_attributes'
- $ref: '#/components/schemas/course_lessons_attributes'
relationships:
type: object
properties: {}
resource_identifiers:
type: array
items:
$ref: '#/components/schemas/resource_identifier'
resource_identifier:
type: object
properties:
id:
type: string
type:
type: string
required:
- id
- type
course_modules_attributes:
type: object
properties:
title:
type: string
description:
type:
- string
- 'null'
position:
type:
- string
- 'null'
poster_image_url:
type:
- string
- 'null'
publishing_option:
type: string
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
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'
course_lessons_attributes:
type: object
properties:
title:
type: string
position:
type:
- string
- 'null'
status:
type: string
publishing_option:
type: string
courses_attributes:
type: object
properties:
created_at:
type: string
format: date-time
readOnly: true
description: ISO 8601 date-time, read only
title:
type: string
description:
type:
- string
- 'null'
thumbnail_url:
type:
- string
- 'null'
required:
- title
securitySchemes:
Bearer:
type: http
scheme: bearer
x-mint:
mcp:
enabled: true