Teachable MCP Server & CLI

A free Teachable CLI and local MCP with private school profiles, confirmed effects, reviewed batches and bounded exports. Stable v1 is default; beta v2 is explicit.

Navid Moazzezautor: Navid Moazzez·Stan na 4 paź 2026·106 min czytania·
Oceń to narzędzie

What you can ask it

Ask for a bounded task in the intended school:

  • List the first five courses and show which are published.
  • Read this student's current enrollments before preparing a course enrollment change.
  • Preview these exact enrollment changes, then execute only the batch I approve.
  • Export up to ten pages of course metadata into a new private file and report continuation.
  • Inspect the beta lecture-list schema after I explicitly enable the version 2 profile.
  • Show the separate upload-credential and content-attachment steps; do not publish automatically.

The terminal illustrates real implemented tool names and a reviewed workflow. It is not an authenticated recording of a school account.

Set up your account

Use the intended school owner account to open Settings > API > Create API Key. Give the key a name and select only the permissions needed. API eligibility and beta access remain provider-controlled. Follow Teachable authentication.

Choose one source: TEACHABLE_API_KEY in private runtime settings, or TEACHABLE_CREDENTIALS_FILE pointing to an absolute owner-private regular JSON file containing api_key. Never mix them. The file must be non-symlink, at most 64 KiB and, on POSIX, owned by the process user with owner-only permissions. Restrict Windows ACLs separately. Credentials do not belong in repositories, chat, screenshots, user payloads or project MCP config.

bash
teachable-cli login
teachable-cli list-accounts --agent
teachable-cli doctor
teachable-cli doctor --network

Login prints instructions only. Local doctor reports configuration availability without proving the key is valid. The deliberate network option performs one version-matched courses read. Success there does not establish all scopes, ownership or every native task. Keys are cached within the process; restart clients after rotation. Revoke through Settings > API > More Actions > Revoke Key.

Install

Use Node 22+ in the runtime that launches the server. The complete INSTALL.md follows the existing house client setup for Codex, desktop apps, editors, shell agents and all three declared desktop OSes.

bash
npm install -g @thenavidm/teachable-mcp-cli@latest
teachable-cli --version
teachable-cli tools
teachable-cli schema list-courses
codex mcp add teachable -- npx -y @thenavidm/teachable-mcp-cli@latest
codex mcp list

Configure private credentials before the first account read. This is a local stdio MCP, without a public HTTP listener. The desktop release is teachable-2.0.0.mcpb; use the supported host Extensions screen. It bundles production JavaScript dependencies, while the host must supply a compatible Node runtime.

Client and OS setup

Codex

Codex is the current validation priority. Private credential paths must exist in the process or remote environment where the server runs.

bash
codex mcp add teachable -- npx -y @thenavidm/teachable-mcp-cli@latest
codex mcp list

Account credentials must reach the server through private environment settings. codex mcp add --env NAME=value stores values in your local config, so never commit that config or put secrets in a shared command. In TOML, the equivalent server is:

toml
[mcp_servers.teachable]
command = "npx"
args = ["-y", "@thenavidm/teachable-mcp-cli@latest"]
env_vars = ["TEACHABLE_API_KEY", "TEACHABLE_CREDENTIALS_FILE", "TEACHABLE_ACCOUNTS", "TEACHABLE_DEFAULT_ACCOUNT", "TEACHABLE_API_VERSION", "TEACHABLE_ENABLE_V2", "TEACHABLE_READ_ONLY", "TEACHABLE_ALLOW_DESTRUCTIVE", "TEACHABLE_AUDIT_LOG", "TEACHABLE_REQUEST_TIMEOUT_MS", "TEACHABLE_MIN_REQUEST_INTERVAL_MS"]

env_vars forwards those names from the environment available to Codex. If that environment does not contain them, configure private env settings locally. Codex can also call the CLI directly with SKILL.md and --agent output.

Claude Code

For a user-scoped connection, after privately configuring credentials:

bash
claude mcp add --scope user teachable -- npx -y @thenavidm/teachable-mcp-cli@latest
claude mcp list

Use the client's private local environment settings for private credential settings if they are not inherited. Claude's -e NAME=value registration option writes values into its config; only use it locally through your secret manager, with no shared command transcript. Never place credentials in a project .mcp.json. Reconnect and ask Claude to verify credentials.

Alternatively install the CLI, make SKILL.md available to Claude, and use shell commands. Registering both surfaces is optional.

Claude Desktop

Install the .mcpb extension

Download teachable-2.0.0.mcpb from GitHub Releases. In a supported Claude Desktop build, use Settings > Extensions > Advanced settings > Install Extension… . Choose one private Admin API key or credential JSON file; leave the other empty. Stable version1 is default; beta requires enable_v2 plus an explicit version2 profile and provider access. Named profiles require private manual runtime settings. Read-only exposes only the 19 read operations by default (64 with beta enabled). Reconnect after installation or credential rotation. The bundle includes production dependencies; Node 22+ compatibility and actual GUI installation are separate checks.

Manual config

Open Settings > Developer > Edit Config, or use your platform's config file:

OSTypical config path
macOS~/Library/Application Support/Claude/claude_desktop_config.json
Windows%APPDATA%\Claude\claude_desktop_config.json
Linux~/.config/Claude/claude_desktop_config.json; confirm the location through Edit Config in your installed build
json
{
"mcpServers": {
"teachable": {
"command": "npx",
"args": ["-y", "@thenavidm/teachable-mcp-cli@latest"],
"env": {
"TEACHABLE_CREDENTIALS_FILE": "/absolute/private/teachable.json"
}
}
}
}

Replace the placeholders only in your private file. Merge the server entry into an existing mcpServers object instead of replacing other integrations. Fully quit and reopen Claude Desktop. Do not enable an extension and a manual entry with the same name; choose one route.

If a Windows launcher cannot execute npx directly, use "command": "cmd" with "args": ["/c", "npx", "-y", "@thenavidm/teachable-mcp-cli@latest"]. An absolute node executable and installed dist/index.js path also avoids launcher/PATH problems.

Cursor

Use private user settings at ~/.cursor/mcp.json, or Settings > Tools & MCP. Cursor documents environment interpolation and envFile support.

json
{
"mcpServers": {
"teachable": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@thenavidm/teachable-mcp-cli@latest"],
"env": {
"TEACHABLE_CREDENTIALS_FILE": "${env:TEACHABLE_CREDENTIALS_FILE}"
}
}
}
}

The environment values must exist for the Cursor process. If you use envFile, keep that file private and outside version control. A project .cursor/mcp.json must not contain actual credentials. Reconnect the server after saving.

VS Code and Copilot

Use MCP: Open User Configuration. VS Code uses servers and secure inputs, rather than a mcpServers root:

json
{
"inputs": [
{"type":"promptString","id":"teachable-private-file","description":"Absolute private credential JSON file path"}
],
"servers": {
"teachable": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@thenavidm/teachable-mcp-cli@latest"],
"env": {
"TEACHABLE_CREDENTIALS_FILE": "${input:teachable-private-file}"
}
}
}
}

Start Teachable through the MCP controls, approve trust if prompted, and enter the private file path in the input prompt. Workspace .vscode/mcp.json may contain this placeholder-only structure, but never resolved secret values. Remote development runs the server in the selected remote environment, so local file paths refer to that environment.

Windsurf

Open Cascade's MCP settings or edit the private user file ~/.codeium/windsurf/mcp_config.json. Use the Claude Desktop manual mcpServers block above with your locally configured env values. See Windsurf's current MCP documentation. Restart or reconnect Teachable in Cascade; project files must not contain secrets.

Zed

Open Settings > AI > MCP Servers > Add Server > Add Local Server, or your user settings file. Zed uses context_servers:

json
{
"context_servers": {
"teachable": {
"command": "npx",
"args": ["-y", "@thenavidm/teachable-mcp-cli@latest"],
"env": {
"TEACHABLE_CREDENTIALS_FILE": "/absolute/private/teachable.json"
}
}
}
}

Enter actual values only in private user settings. Check the active-server indicator before prompting. Do not wrap command and args inside a nested command object from older Zed examples.

Gemini CLI

Merge the Claude Desktop manual mcpServers block into your private ~/.gemini/settings.json. Configure the private credential values locally, then restart Gemini CLI and inspect /mcp. See Gemini CLI's MCP configuration. Its project settings must not contain real credentials. You can instead use the CLI from an agent shell.

Other local stdio clients use the same command and arguments, adapted to their config format. A client that only accepts a remote MCP URL cannot connect directly: this package does not ship a public HTTP listener. ChatGPT's remote connector setup is not a substitute for local stdio installation.

OpenCode

Merge this into your private user config, following OpenCode's MCP docs. Reconnect and inspect the server status.

json
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"teachable": {
"type": "local",
"command": ["npx", "-y", "@thenavidm/teachable-mcp-cli@latest"],
"enabled": true,
"environment": {"TEACHABLE_CREDENTIALS_FILE": "/absolute/private/teachable.json"}
}
}
}

Copilot CLI

After private runtime setup, use Copilot CLI's documented registration:

bash
copilot mcp add teachable --env TEACHABLE_CREDENTIALS_FILE=/absolute/private/teachable.json -- npx -y @thenavidm/teachable-mcp-cli@latest
copilot mcp get teachable

Registration stores the private file path in user configuration; do not put actual credentials in the command or repository.

OpenClaw

Use the saved-server registry in an eligible runtime, following OpenClaw's MCP reference:

bash
openclaw mcp add teachable --command npx --arg -y --arg @thenavidm/teachable-mcp-cli@latest --env TEACHABLE_CREDENTIALS_FILE=/absolute/private/teachable.json
openclaw mcp doctor teachable --probe

Configure paths in the process where the server actually runs. Runtime projection and trust policy remain client-specific; a saved entry is not proof of a successful provider call.

Antigravity

Follow Google's current custom-server instructions: open MCP Servers, Manage MCP Servers, then View raw config. Merge the Claude Desktop manual mcpServers block above. Current global config is ~/.gemini/config/mcp_config.json; project .agents/mcp_config.json must never contain secrets. The local stdio command/args/env form applies. Reconnect and inspect tools.

Hermes

Merge this into your private ~/.hermes/config.yaml, following Hermes MCP configuration:

yaml
mcp_servers:
teachable:
command: "npx"
args: ["-y", "@thenavidm/teachable-mcp-cli@latest"]
env:
TEACHABLE_CREDENTIALS_FILE: "/absolute/private/teachable.json"

Restart the agent and inspect available tools. An agent shell can also use teachable-cli directly with the shipped SKILL.md; installing npm does not automatically register the skill.

Output and exit codes

Schemas, validation, handlers and confirmation policy are shared across both binaries. --agent selects compact JSON presentation for shell agents; --select a,b.c projects output fields. Use --json or --compact directly when appropriate. --yes affects presentation and never grants effect approval. Errors go to stderr.

ExitMeaning
0Successful command
2Usage, invalid arguments or refused effect
3Resource not found
4Provider authentication/permission failure
5Other API or network failure
7Provider rate limit
10Missing or invalid local configuration
bash
teachable-cli list-courses --page 1 --per 5 --agent
teachable-cli get-course --course-id 7 --account intended-school --json
teachable-cli schema create-enrollment

Numeric IDs in examples are illustrative; replace them with reviewed IDs in the intended school. Native snake_case fields become dash flags. Objects and arrays use JSON. Do not mix native body flags, payload and payload_file. Native body requirements are validated before fetching, even when individual flags are optional in discovery.

Which surface and what each costs

CLI suits shell agents, scripts and selected tasks. MCP suits supported apps that discover and call tools directly. Both execute the same implementation.

Stable v1 default
Discovered tasks
26
Read operations
19
Confirmed effects
7
Stable read-only
Discovered tasks
19
Read operations
19
Confirmed effects
0
Explicit beta enabled
Discovered tasks
123
Read operations
64
Confirmed effects
59
Beta enabled read-only
Discovered tasks
64
Read operations
64
Confirmed effects
0

The beta-enabled list includes both API versions plus five local helpers. Each native call still requires a matching profile version. CLI help/results enter context on demand; MCP schema loading may be deferred by the client. Discovery size alone cannot show task efficiency.

Matched completed Codex task/token measurement remains pending. A fair comparison must use equivalent successful tasks, current client/model/package versions, loading mode and total usage including help, outputs, errors and retries. No schema-character estimate or borrowed benchmark is published as savings.

Tools

All 123 beta-enabled discovered tasks are documented below. Stable default exposes 26; beta tasks are explicitly marked and require matching version profiles. The five local workflows are not additional provider endpoints.

list_enrollments

Fetch active enrolled students and student progress for a specific course.

CLI: teachable-cli list-enrollments. Policy: read.

Native: GET /v1/courses/{course_id}/enrollments. Version: stable v1. Current source.

course_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
Return enrollments for a specific course by the unique course ID.
enrolled_in_after
Type or constraint
string (format=date-time)
Requirement
Optional
Meaning
Search for students who are enrolled after a specific date/time. Formatted in ISO8601.
enrolled_in_before
Type or constraint
string (format=date-time)
Requirement
Optional
Meaning
Search for students who are enrolled before a specific date/time. Formatted in ISO8601.
sort_direction
Type or constraint
asc, desc
Requirement
Optional
Meaning
Enrollments are sorted by the 'enrolled_at' datetime. You can choose the direction by including the sort_direction param.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

mark_lecture_complete

Mark a specific course lecture as complete.

CLI: teachable-cli mark-lecture-complete. Policy: explicit confirmation.

Native: POST /v1/courses/{course_id}/lectures/{lecture_id}/mark_complete. Version: stable v1. Current source.

course_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
The unique course ID that contains the lecture.
lecture_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
The unique lecture ID.
user_id
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
The unique ID of the user.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

user_id
Type or constraint
integer (format=int32)
Requirement
Required
Meaning
The unique ID of the user.

list_quiz_responses

Fetch the responses of quiz.

CLI: teachable-cli list-quiz-responses. Policy: read.

Native: GET /v1/courses/{course_id}/lectures/{lecture_id}/quizzes/{quiz_id}/responses. Version: stable v1. Current source.

course_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
Return results by unique course ID that contains the lecture.
lecture_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
Return results by unique lecture ID.
quiz_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
Return results by unique quiz attachment ID.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

get_quiz

Fetch a specific quiz information.

CLI: teachable-cli get-quiz. Policy: read.

Native: GET /v1/courses/{course_id}/lectures/{lecture_id}/quizzes/{quiz_id}. Version: stable v1. Current source.

course_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
Return results by unique course ID that contains the lecture.
lecture_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
Return results by unique lecture ID.
quiz_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
Return results by unique quiz attachment ID.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

list_quizzes

Fetch an id list of quizzes in a specific course lecture.

CLI: teachable-cli list-quizzes. Policy: read.

Native: GET /v1/courses/{course_id}/lectures/{lecture_id}/quizzes. Version: stable v1. Current source.

course_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
Return results by unique course ID that contains the lecture.
lecture_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
Return results by unique lecture ID.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

get_video

Fetch a specific video information.

CLI: teachable-cli get-video. Policy: read.

Native: GET /v1/courses/{course_id}/lectures/{lecture_id}/videos/{video_id}. Version: stable v1. Current source.

course_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
Return results by unique course ID that contains the lecture.
lecture_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
Return results by unique lecture ID.
video_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
Return results by unique video attachment ID.
user_id
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Specify the user who is watching the video
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

get_lecture

Fetch content of a specific course lecture.

CLI: teachable-cli get-lecture. Policy: read.

Native: GET /v1/courses/{course_id}/lectures/{lecture_id}. Version: stable v1. Current source.

course_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
Return results by unique course ID that contains the lecture.
lecture_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
Return results by unique lecture ID.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

get_course_progress

Fetch a specific user's course progress.

CLI: teachable-cli get-course-progress. Policy: read.

Native: GET /v1/courses/{course_id}/progress. Version: stable v1. Current source.

course_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
The unique course ID that contains the lecture.
user_id
Type or constraint
integer (format=int32)
Requirement
Required
Meaning
The unique ID of the user.
page
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Used in pagination when number of courses exceed the maximum amount of results per page
per
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Used in pagination to define amount of courses per page, when not defined the maximum is 20
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

get_course

Fetch a specific course by ID.

CLI: teachable-cli get-course. Policy: read.

Native: GET /v1/courses/{course_id}. Version: stable v1. Current source.

course_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
Return a course by its unique ID.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

list_courses

Fetch all courses at your school.

CLI: teachable-cli list-courses. Policy: read.

Native: GET /v1/courses. Version: stable v1. Current source.

name
Type or constraint
string
Requirement
Optional
Meaning
Filter courses by course name
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Filter courses by published status. If true, return published courses. If false, return unpublished courses.
author_bio_id
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Filter courses by a specific course author via the course author's bio ID.
created_at
Type or constraint
string (format=date-time)
Requirement
Optional
Meaning
Return courses by the date & time of course creation. Formatted in ISO8601.
page
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Used in pagination when number of courses exceed the maximum amount of results per page
per
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Used in pagination to define amount of courses per page, when not defined the maximum is 20
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

create_enrollment

Enroll a user in a course.

CLI: teachable-cli create-enrollment. Policy: explicit confirmation.

Native: POST /v1/enroll. Version: stable v1. Current source.

user_id
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
The unique ID of the user.
course_id
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
The unique ID of the course.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

user_id
Type or constraint
integer (format=int32)
Requirement
Required
Meaning
The unique ID of the user.
course_id
Type or constraint
integer (format=int32)
Requirement
Required
Meaning
The unique ID of the course.

get_pricing_plan

Fetch details of a specific pricing plan. Currently only supports pricing plans associated with courses.

CLI: teachable-cli get-pricing-plan. Policy: read.

Native: GET /v1/pricing_plans/{pricing_plan_id}. Version: stable v1. Current source.

pricing_plan_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
Search for a pricing plan by its unique ID.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

list_pricing_plans

Fetch all the pricing plans at your school

CLI: teachable-cli list-pricing-plans. Policy: read.

Native: GET /v1/pricing_plans. Version: stable v1. Current source.

page
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Used in pagination when number of pricing plans exceeds the maximum amount of results per page
per
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Used in pagination to define amount of pricing plans per page, when not defined the maximum is 5
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

list_transactions

Fetch a list of sales transactions made in your school. (New transactions can take up to two minutes to be returned via API call from the time of sale.)

CLI: teachable-cli list-transactions. Policy: read.

Native: GET /v1/transactions. Version: stable v1. Current source.

user_id
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Native field
affiliate_id
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Native field
course_id
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Native field
pricing_plan_id
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Native field
is_fully_refunded
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
is_chargeback
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
start
Type or constraint
string (format=date-time)
Requirement
Optional
Meaning
The beginning of the time period to return results for (exclusive), in ISO8601 format.
end
Type or constraint
string (format=date-time)
Requirement
Optional
Meaning
The end of the time period to return results for (inclusive), in ISO8601 format.
page
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Used in pagination when number of transactions exceed the maximum amount of results per page
per
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Used in pagination to define amount of transactions per page, when not defined the maximum is 20
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

unenroll_user

Unenroll a user from a course.

CLI: teachable-cli unenroll-user. Policy: explicit confirmation.

Native: POST /v1/unenroll. Version: stable v1. Current source.

user_id
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
The unique ID of the user.
course_id
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
The unique ID of the course.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

user_id
Type or constraint
integer (format=int32)
Requirement
Required
Meaning
The unique ID of the user.
course_id
Type or constraint
integer (format=int32)
Requirement
Required
Meaning
The unique ID of the course.

get_user

List a specific user and their course enrollments by user ID.

CLI: teachable-cli get-user. Policy: read.

Native: GET /v1/users/{user_id}. Version: stable v1. Current source.

user_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
The unique ID of the user.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

update_user

Update the name or src of a user.

CLI: teachable-cli update-user. Policy: explicit confirmation.

Native: PATCH /v1/users/{user_id}. Version: stable v1. Current source.

user_id
Type or constraint
integer (minimum=1, format=int32)
Requirement
Required
Meaning
The unique ID of the user.
name
Type or constraint
string
Requirement
Optional
Meaning
The name of the user.
src
Type or constraint
string
Requirement
Optional
Meaning
The signup source of the user, which is displayed on the Information tab of the user profile. .
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string
Requirement
Optional
Meaning
The name of the user.
src
Type or constraint
string
Requirement
Optional
Meaning
The signup source of the user, which is displayed on the Information tab of the user profile. .

list_users

Get a list of users

CLI: teachable-cli list-users. Policy: read.

Native: GET /v1/users. Version: stable v1. Current source.

page
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Used in pagination when number of users exceed the maximum amount of results per page
per
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Used in pagination to define amount of users per page, when not defined the maximum is 20
email
Type or constraint
string
Requirement
Optional
Meaning
Filter users by user email.
search_after
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Used when number of users exceeds 10,000 records. Use the search_after value in the parameters to search the next set of records.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

create_user

Create a new user

CLI: teachable-cli create-user. Policy: explicit confirmation.

Native: POST /v1/users. Version: stable v1. Current source.

name
Type or constraint
string
Requirement
Optional
Meaning
The name of the new user.
email
Type or constraint
string
Requirement
Optional
Meaning
The email address of the new user..
src
Type or constraint
string
Requirement
Optional
Meaning
The signup source of the user, Information tab of the user profile. SRC can also be used as a custom value when creating users in your school. For example, if you use any unique identifiers to help manage your users in multiple external systems (such as unique IDs, tags, etc.), you can use the src field to keep this identifier associated with your user in Teachable.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string
Requirement
Optional
Meaning
The name of the new user.
email
Type or constraint
string
Requirement
Required
Meaning
The email address of the new user..
password
Type or constraint
string
Requirement
Optional
Meaning
The password of the new user. Must be at least 6 characters.
src
Type or constraint
string
Requirement
Optional
Meaning
The signup source of the user, Information tab of the user profile. SRC can also be used as a custom value when creating users in your school. For example, if you use any unique identifiers to help manage your users in multiple external systems (such as unique IDs, tags, etc.), you can use the src field to keep this identifier associated with your user in Teachable.

get_webhook_events

Fetch all the events for a webhook.

CLI: teachable-cli get-webhook-events. Policy: read.

Native: GET /v1/webhooks/{webhook_id}/events. Version: stable v1. Current source.

webhook_id
Type or constraint
integer (format=int32)
Requirement
Required
Meaning
The unique ID of the webhook.
response_http_status_gte
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Filter responses by HTTP status code of the webhook event, greater than or equal to the provided value (i.e., enter 200 to search for webhook events that had an HTTP status code of 200 or greater).
response_http_status_lte
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Filter responses by HTTP status of the webhook event, less than or equal to the provided value. (e.g., enter 200 to search for webhook events that had an HTTP status code of 200 or less).
created_before
Type or constraint
string (format=date-time, default=2020-04-17T19:44:03Z)
Requirement
Optional
Meaning
Search for webhook events that were created before a specific date/time. Formatted in ISO 8601.
created_after
Type or constraint
string (format=date-time, default=2020-04-17T19:44:03Z)
Requirement
Optional
Meaning
Search for webhook events that were created after a specific date/time. Formatted in ISO 8601.
page
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Set the page number to be returned. (i.e., If you have two pages of results with 20 results per page, set the page value to 1 to receive results 1 through 20, or set the page value to 2 to receive results 21-40).
per
Type or constraint
integer (format=int32)
Requirement
Optional
Meaning
Set the maximum number of results to be returned by page. By default, each page will return 20 results.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

list_webhooks

Fetch all webhook events for your school.

CLI: teachable-cli list-webhooks. Policy: read.

Native: GET /v1/webhooks. Version: stable v1. Current source.

account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_get_school_customizations

Retrieve the current school customization (theme) settings exposed by the public API.

CLI: teachable-cli v2-get-school-customizations. Policy: read.

Native: GET /v2/customizations. Version: explicit beta v2. Current source.

account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_delete_pricing_plan

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Soft-delete a pricing plan by setting is_published to false. The pricing plan record is preserved for audit purposes but will no longer be visible to end users.

CLI: teachable-cli v2-delete-pricing-plan. Policy: explicit confirmation.

Native: DELETE /v2/products/{product_type}/{product_id}/pricing-plans/{plan_id}. Version: explicit beta v2. Current source.

product_type
Type or constraint
string
Requirement
Required
Meaning
Product type (courses, product-collections, digital-downloads, coaching, membership-tiers)
product_id
Type or constraint
integer
Requirement
Required
Meaning
Product ID
plan_id
Type or constraint
integer
Requirement
Required
Meaning
Pricing plan ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_get_pricing_plan

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Retrieve a single pricing plan for a specific product across all supported product types (courses, product-collections, digital-downloads, coaching, membership-tiers).

CLI: teachable-cli v2-get-pricing-plan. Policy: read.

Native: GET /v2/products/{product_type}/{product_id}/pricing-plans/{plan_id}. Version: explicit beta v2. Current source.

product_type
Type or constraint
string
Requirement
Required
Meaning
Product type (courses, product-collections, digital-downloads, coaching, membership-tiers)
product_id
Type or constraint
integer
Requirement
Required
Meaning
Product ID
plan_id
Type or constraint
integer
Requirement
Required
Meaning
Pricing plan ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_update_pricing_plan

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Update a pricing plan. Content, visibility, access-limit, and enrollment-cap fields are applied. Read-only fields (for example price, currency) are rejected by request schema validation with 400.

CLI: teachable-cli v2-update-pricing-plan. Policy: explicit confirmation.

Native: PATCH /v2/products/{product_type}/{product_id}/pricing-plans/{plan_id}. Version: explicit beta v2. Current source.

product_type
Type or constraint
string
Requirement
Required
Meaning
Product type (courses, product-collections, digital-downloads, coaching, membership-tiers)
product_id
Type or constraint
integer
Requirement
Required
Meaning
Product ID
plan_id
Type or constraint
integer
Requirement
Required
Meaning
Pricing plan ID
name
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
description
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
detailed_description
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
cc_statement_description
Type or constraint
string nullable
Requirement
Optional
Meaning
Text shown on customer card statements. On schools using the new payments experience this is stored but not yet applied to statements.
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
access_limit_date
Type or constraint
string nullable (format=date-time)
Requirement
Optional
Meaning
Native field
access_limit_interval
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
access_limit_duration
Type or constraint
integer nullable
Requirement
Optional
Meaning
Native field
enrollment_cap
Type or constraint
integer nullable
Requirement
Optional
Meaning
Requires the school feature plan_supports_enrollment_cap. Returns 422 when enrollment_cap or enrollment_cap_expires_at is present and the feature is disabled.
enrollment_cap_expires_at
Type or constraint
string nullable (format=date-time)
Requirement
Optional
Meaning
Requires the school feature plan_supports_enrollment_cap. Returns 422 when enrollment_cap or enrollment_cap_expires_at is present and the feature is disabled.
enrollment_cap_display_priority
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
enrollment_cap_fulfillment_count
Type or constraint
integer nullable
Requirement
Optional
Meaning
Native field
enrollment_cap_visible
Type or constraint
boolean nullable
Requirement
Optional
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
description
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
detailed_description
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
cc_statement_description
Type or constraint
string nullable
Requirement
Optional
Meaning
Text shown on customer card statements. On schools using the new payments experience this is stored but not yet applied to statements.
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
access_limit_date
Type or constraint
string nullable (format=date-time)
Requirement
Optional
Meaning
Native field
access_limit_interval
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
access_limit_duration
Type or constraint
integer nullable
Requirement
Optional
Meaning
Native field
enrollment_cap
Type or constraint
integer nullable
Requirement
Optional
Meaning
Requires the school feature plan_supports_enrollment_cap. Returns 422 when enrollment_cap or enrollment_cap_expires_at is present and the feature is disabled.
enrollment_cap_expires_at
Type or constraint
string nullable (format=date-time)
Requirement
Optional
Meaning
Requires the school feature plan_supports_enrollment_cap. Returns 422 when enrollment_cap or enrollment_cap_expires_at is present and the feature is disabled.
enrollment_cap_display_priority
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
enrollment_cap_fulfillment_count
Type or constraint
integer nullable
Requirement
Optional
Meaning
Native field
enrollment_cap_visible
Type or constraint
boolean nullable
Requirement
Optional
Meaning
Native field

v2_list_pricing_plans_for_product

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Retrieve a list of pricing plans for a specific product across all supported product types (courses, product-collections, digital-downloads, coaching, membership-tiers). A 400 may indicate an invalid product_type or invalid page / per_page.

CLI: teachable-cli v2-list-pricing-plans-for-product. Policy: read.

Native: GET /v2/products/{product_type}/{product_id}/pricing-plans. Version: explicit beta v2. Current source.

product_type
Type or constraint
string
Requirement
Required
Meaning
Product type (courses, product-collections, digital-downloads, coaching, membership-tiers)
product_id
Type or constraint
integer
Requirement
Required
Meaning
Product ID
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number (1-based integer)
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page (integer)
sort_by
Type or constraint
string
Requirement
Optional
Meaning
Sort field (created_at, updated_at)
sort_direction
Type or constraint
string
Requirement
Optional
Meaning
Sort direction (asc, desc)
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Filter by publish status. When omitted, returns both published and unpublished pricing plans.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_create_pricing_plan_for_product

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Create a pricing plan for a specific product across all supported product types (courses, product-collections, digital-downloads, coaching, membership-tiers).

CLI: teachable-cli v2-create-pricing-plan-for-product. Policy: explicit confirmation.

Native: POST /v2/products/{product_type}/{product_id}/pricing-plans. Version: explicit beta v2. Current source.

product_type
Type or constraint
string
Requirement
Required
Meaning
Product type (courses, product-collections, digital-downloads, coaching, membership-tiers)
product_id
Type or constraint
integer
Requirement
Required
Meaning
Product ID
name
Type or constraint
string
Requirement
Optional
Meaning
Native field
currency
Type or constraint
string
Requirement
Optional
Meaning
ISO 4217 currency code. On schools using the new payments experience this is set automatically from the school's payment settings and the submitted value is ignored. The response returns the currency that was applied.
price
Type or constraint
integer
Requirement
Optional
Meaning
Native field
is_recurring
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
billing_interval
Type or constraint
day, week, month, year
Requirement
Optional
Meaning
Required when is_recurring is true. Membership tier plans on schools using the new payments experience accept only month or year.
billing_interval_count
Type or constraint
integer nullable
Requirement
Optional
Meaning
Required when is_recurring is true. Membership tier plans on schools using the new payments experience must use 1. Defaults to 1 when omitted.
description
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
detailed_description
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
free_trial_length
Type or constraint
integer nullable
Requirement
Optional
Meaning
Native field
access_limit_date
Type or constraint
string nullable (format=date-time)
Requirement
Optional
Meaning
Native field
access_limit_interval
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
access_limit_duration
Type or constraint
integer nullable
Requirement
Optional
Meaning
Native field
enrollment_cap
Type or constraint
integer nullable
Requirement
Optional
Meaning
Requires the school feature plan_supports_enrollment_cap. Returns 422 when enrollment_cap or enrollment_cap_expires_at is present and the feature is disabled.
enrollment_cap_expires_at
Type or constraint
string nullable (format=date-time)
Requirement
Optional
Meaning
Requires the school feature plan_supports_enrollment_cap. Returns 422 when enrollment_cap or enrollment_cap_expires_at is present and the feature is disabled.
enrollment_cap_display_priority
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
enrollment_cap_fulfillment_count
Type or constraint
integer nullable
Requirement
Optional
Meaning
Native field
enrollment_cap_visible
Type or constraint
boolean nullable
Requirement
Optional
Meaning
Native field
num_payments_required
Type or constraint
integer nullable
Requirement
Optional
Meaning
Native field
position
Type or constraint
integer nullable
Requirement
Optional
Meaning
Native field
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string
Requirement
Required
Meaning
Native field
currency
Type or constraint
string
Requirement
Required
Meaning
ISO 4217 currency code. On schools using the new payments experience this is set automatically from the school's payment settings and the submitted value is ignored. The response returns the currency that was applied.
price
Type or constraint
integer
Requirement
Required
Meaning
Native field
is_recurring
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
billing_interval
Type or constraint
day, week, month, year
Requirement
Optional
Meaning
Required when is_recurring is true. Membership tier plans on schools using the new payments experience accept only month or year.
billing_interval_count
Type or constraint
integer nullable
Requirement
Optional
Meaning
Required when is_recurring is true. Membership tier plans on schools using the new payments experience must use 1. Defaults to 1 when omitted.
description
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
detailed_description
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
free_trial_length
Type or constraint
integer nullable
Requirement
Optional
Meaning
Native field
access_limit_date
Type or constraint
string nullable (format=date-time)
Requirement
Optional
Meaning
Native field
access_limit_interval
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
access_limit_duration
Type or constraint
integer nullable
Requirement
Optional
Meaning
Native field
enrollment_cap
Type or constraint
integer nullable
Requirement
Optional
Meaning
Requires the school feature plan_supports_enrollment_cap. Returns 422 when enrollment_cap or enrollment_cap_expires_at is present and the feature is disabled.
enrollment_cap_expires_at
Type or constraint
string nullable (format=date-time)
Requirement
Optional
Meaning
Requires the school feature plan_supports_enrollment_cap. Returns 422 when enrollment_cap or enrollment_cap_expires_at is present and the feature is disabled.
enrollment_cap_display_priority
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
enrollment_cap_fulfillment_count
Type or constraint
integer nullable
Requirement
Optional
Meaning
Native field
enrollment_cap_visible
Type or constraint
boolean nullable
Requirement
Optional
Meaning
Native field
num_payments_required
Type or constraint
integer nullable
Requirement
Optional
Meaning
Native field
position
Type or constraint
integer nullable
Requirement
Optional
Meaning
Native field
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field

v2_delete_coupon

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Archive a multiple-use coupon by unpublishing it (is_published becomes false). This endpoint only manages multiple-use coupons. Returns 204 if the coupon is already archived or does not exist (idempotent).

On schools using the new payments experience, archiving a coupon that has not been linked to the payments experience returns 422 "This coupon cannot be archived." This happens for coupons created before the school migrated to the new payments experience and not yet backfilled.

CLI: teachable-cli v2-delete-coupon. Policy: explicit confirmation.

Native: DELETE /v2/products/coupons/{coupon_id}. Version: explicit beta v2. Current source.

coupon_id
Type or constraint
integer
Requirement
Required
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_get_coupon

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Retrieve a single coupon by ID for the school.

CLI: teachable-cli v2-get-coupon. Policy: read.

Native: GET /v2/products/coupons/{coupon_id}. Version: explicit beta v2. Current source.

coupon_id
Type or constraint
integer
Requirement
Required
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_update_coupon

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Update a multiple-use coupon that is not part of the student-referral program (partial update).

CLI: teachable-cli v2-update-coupon. Policy: explicit confirmation.

Native: PATCH /v2/products/coupons/{coupon_id}. Version: explicit beta v2. Current source.

coupon_id
Type or constraint
integer
Requirement
Required
Meaning
Native field
name
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
expiration_date
Type or constraint
string nullable (format=date-time)
Requirement
Optional
Meaning
Native field
number_available
Type or constraint
integer nullable
Requirement
Optional
Meaning
Native field
cap_visible
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
display_priority
Type or constraint
time, uses
Requirement
Optional
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
expiration_date
Type or constraint
string nullable (format=date-time)
Requirement
Optional
Meaning
Native field
number_available
Type or constraint
integer nullable
Requirement
Optional
Meaning
Native field
cap_visible
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
display_priority
Type or constraint
time, uses
Requirement
Optional
Meaning
Native field

v2_list_coupons

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Retrieve a list of coupons for the school. Excludes single-use and student-referral coupons. Without product context, returns only school-wide (non-product-specific) coupons.

CLI: teachable-cli v2-list-coupons. Policy: read.

Native: GET /v2/products/coupons. Version: explicit beta v2. Current source.

is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
pricing_plan_id
Type or constraint
integer
Requirement
Optional
Meaning
Filter by pricing plan ID. Meaningful on schools not using the new payments experience; on schools using the new payments experience, matches only coupons scoped by pricing plan (typically empty).
product_type
Type or constraint
course, coaching, creator_product, bundle, product_collection, digital_download, digital_product, membership_tier
Requirement
Optional
Meaning
Filter by product. On schools using the new payments experience, resolves via the product itself; otherwise resolves via the pricing plans attached to it. Must be paired with product_id.
product_id
Type or constraint
integer
Requirement
Optional
Meaning
ID of the entity identified by product_type; required when product_type is present.
created_after
Type or constraint
string
Requirement
Optional
Meaning
ISO8601 datetime; invalid values return 400. Date range between created_after and created_before cannot exceed 90 days.
created_before
Type or constraint
string
Requirement
Optional
Meaning
ISO8601 datetime; invalid values return 400. Date range between created_after and created_before cannot exceed 90 days.
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Native field
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Native field
sort_by
Type or constraint
string
Requirement
Optional
Meaning
Sort by field (created_at, updated_at)
sort_direction
Type or constraint
string
Requirement
Optional
Meaning
Sort direction (asc, desc)
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_create_coupon

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Create a multiple-use coupon. Use scope_type for a school-wide coupon, pricing_plan_id to restrict it to one price (schools not using the new payments experience), or product_type + product_id to restrict it to one product (schools using the new payments experience). Exactly one of the three must be set.

CLI: teachable-cli v2-create-coupon. Policy: explicit confirmation.

Native: POST /v2/products/coupons. Version: explicit beta v2. Current source.

code
Type or constraint
string
Requirement
Optional
Meaning
Native field
name
Type or constraint
string
Requirement
Optional
Meaning
On schools using the new payments experience, maximum length is 40 characters.
expiration_date
Type or constraint
string nullable (format=date-time)
Requirement
Optional
Meaning
On schools using the new payments experience, this field is required, must be a future date, and must be within 5 years from now.
number_available
Type or constraint
integer nullable
Requirement
Optional
Meaning
On schools using the new payments experience, this field is required and must be at least 1.
discount_amount
Type or constraint
integer nullable
Requirement
Optional
Meaning
On schools using the new payments experience, exactly one of discount_percent or discount_amount is required, and the minimum is 1. When discount_amount is set, discount_currency is required.
discount_currency
Type or constraint
string nullable
Requirement
Optional
Meaning
On schools using the new payments experience, required when discount_amount is set; not allowed when discount_percent is set.
discount_percent
Type or constraint
number nullable (minimum=0, maximum=1)
Requirement
Optional
Meaning
On schools using the new payments experience, exactly one of discount_percent or discount_amount is required, and the minimum is 0.01%. discount_percent and discount_currency cannot be provided together.
discount_in_months
Type or constraint
integer nullable
Requirement
Optional
Meaning
Required when duration_kind is "repeating". Must be blank when duration_kind is not "repeating". Minimum value is 1.
pricing_plan_id
Type or constraint
integer nullable
Requirement
Optional
Meaning
Only supported on schools not using the new payments experience. Sending this field on schools using the new payments experience returns 422. Mutually exclusive with scope_type and product_type + product_id.
product_type
Type or constraint
course, coaching, creator_product, bundle, product_collection, digital_download, digital_product, membership_tier
Requirement
Optional
Meaning
Only supported on schools using the new payments experience. Sending this field otherwise returns 422. Must be paired with product_id. Mutually exclusive with scope_type and pricing_plan_id.
product_id
Type or constraint
integer nullable
Requirement
Optional
Meaning
Only supported on schools using the new payments experience. Must be paired with product_type.
duration_kind
Type or constraint
forever, once, repeating
Requirement
Optional
Meaning
On schools using the new payments experience, when set to "repeating", discount_in_months is required.
scope_type
Type or constraint
all_products, courses, product_collections, creator_products, digital_products, membership_tiers
Requirement
Optional
Meaning
Available on all schools. Mutually exclusive with pricing_plan_id and product_type + product_id.
cap_visible
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
display_priority
Type or constraint
time, uses
Requirement
Optional
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

code
Type or constraint
string
Requirement
Required
Meaning
Native field
name
Type or constraint
string
Requirement
Required
Meaning
On schools using the new payments experience, maximum length is 40 characters.
expiration_date
Type or constraint
string nullable (format=date-time)
Requirement
Optional
Meaning
On schools using the new payments experience, this field is required, must be a future date, and must be within 5 years from now.
number_available
Type or constraint
integer nullable
Requirement
Optional
Meaning
On schools using the new payments experience, this field is required and must be at least 1.
discount_amount
Type or constraint
integer nullable
Requirement
Optional
Meaning
On schools using the new payments experience, exactly one of discount_percent or discount_amount is required, and the minimum is 1. When discount_amount is set, discount_currency is required.
discount_currency
Type or constraint
string nullable
Requirement
Optional
Meaning
On schools using the new payments experience, required when discount_amount is set; not allowed when discount_percent is set.
discount_percent
Type or constraint
number nullable (minimum=0, maximum=1)
Requirement
Optional
Meaning
On schools using the new payments experience, exactly one of discount_percent or discount_amount is required, and the minimum is 0.01%. discount_percent and discount_currency cannot be provided together.
discount_in_months
Type or constraint
integer nullable
Requirement
Optional
Meaning
Required when duration_kind is "repeating". Must be blank when duration_kind is not "repeating". Minimum value is 1.
pricing_plan_id
Type or constraint
integer nullable
Requirement
Optional
Meaning
Only supported on schools not using the new payments experience. Sending this field on schools using the new payments experience returns 422. Mutually exclusive with scope_type and product_type + product_id.
product_type
Type or constraint
course, coaching, creator_product, bundle, product_collection, digital_download, digital_product, membership_tier
Requirement
Optional
Meaning
Only supported on schools using the new payments experience. Sending this field otherwise returns 422. Must be paired with product_id. Mutually exclusive with scope_type and pricing_plan_id.
product_id
Type or constraint
integer nullable
Requirement
Optional
Meaning
Only supported on schools using the new payments experience. Must be paired with product_type.
duration_kind
Type or constraint
forever, once, repeating
Requirement
Required
Meaning
On schools using the new payments experience, when set to "repeating", discount_in_months is required.
scope_type
Type or constraint
all_products, courses, product_collections, creator_products, digital_products, membership_tiers
Requirement
Optional
Meaning
Available on all schools. Mutually exclusive with pricing_plan_id and product_type + product_id.
cap_visible
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
display_priority
Type or constraint
time, uses
Requirement
Optional
Meaning
Native field

v2_list_comments_for_course

Retrieve a paginated list of comments across all lectures in a course. Results can be filtered by status and creation date.

Without a status filter, comments in all statuses are returned. Use the status parameter to narrow results to a specific moderation state.

CLI: teachable-cli v2-list-comments-for-course. Policy: read.

Native: GET /v2/products/courses/{course_id}/comments. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
created_after
Type or constraint
string
Requirement
Optional
Meaning
Filter comments created after this ISO8601 datetime. Date range between created_after and created_before cannot exceed 90 days.
created_before
Type or constraint
string
Requirement
Optional
Meaning
Filter comments created before this ISO8601 datetime. Date range between created_after and created_before cannot exceed 90 days.
status
Type or constraint
string
Requirement
Optional
Meaning
Filter by status (awaiting_review, approved, removed, denied)
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page
sort_by
Type or constraint
string
Requirement
Optional
Meaning
Sort by field (created_at, updated_at)
sort_direction
Type or constraint
string
Requirement
Optional
Meaning
Sort direction (asc, desc)
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_get_compliance_settings_for_course

Retrieve the compliance configuration for a specific course.

CLI: teachable-cli v2-get-compliance-settings-for-course. Policy: read.

Native: GET /v2/products/courses/{course_id}/compliance. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_update_compliance_settings_for_course

Update the compliance configuration for a specific course.

Lecture order requirement:

When either requirements.video_completion_enforced or requirements.quiz_pass_required is true, requirements.lecture_order_required must also be true. Requests that violate this return 422 validation_failed.

The rule is checked against the course's resulting state — your request merged over its stored values — so an omitted field is evaluated using what is already saved. Sending only {"requirements":{"video_completion_enforced":true}} therefore succeeds on a course that already enforces lecture order and fails on one that does not. Send lecture_order_required: true alongside either dependent field for a result that does not depend on the course's current settings.

Certificate configuration:

The certificate_settings.template_id must reference an existing certificate page (template) belonging to the school. Certificate pages are created through the school admin UI — there is no API endpoint for creating them. Use GET /v2/products/courses/{course_id}/compliance to retrieve the current template_id if one is already configured.

When template_id is set and auto_issue is true, certificates are automatically issued to students upon 100% course completion. The school's plan must also support native certificates.

CLI: teachable-cli v2-update-compliance-settings-for-course. Policy: explicit confirmation.

Native: PATCH /v2/products/courses/{course_id}/compliance. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
requirements
Type or constraint
object
Requirement
Optional
Meaning
Completion requirements. When video_completion_enforced or quiz_pass_required ends up true, lecture_order_required must also be true, or the request returns 422. The rule is applied to the request body merged over the course's persisted values, so an omitted field is evaluated using its stored value rather than being ignored.
certificate_settings
Type or constraint
object
Requirement
Optional
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

requirements
Type or constraint
object
Requirement
Optional
Meaning
Completion requirements. When video_completion_enforced or quiz_pass_required ends up true, lecture_order_required must also be true, or the request returns 422. The rule is applied to the request body merged over the course's persisted values, so an omitted field is evaluated using its stored value rather than being ignored.
requirements.video_completion_enforced
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
requirements.quiz_pass_required
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
requirements.quiz_minimum_score
Type or constraint
number
Requirement
Optional
Meaning
Native field
requirements.quiz_maximum_retakes
Type or constraint
integer
Requirement
Optional
Meaning
Native field
requirements.lecture_order_required
Type or constraint
boolean
Requirement
Optional
Meaning
Must be true when video_completion_enforced or quiz_pass_required is true.
certificate_settings
Type or constraint
object
Requirement
Optional
Meaning
Native field
certificate_settings.auto_issue
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
certificate_settings.template_id
Type or constraint
integer
Requirement
Optional
Meaning
Omit to leave the certificate template unchanged. A certificate template cannot be detached through this endpoint.

v2_unenroll_user_from_course

Unenroll a user from a specific course.

CLI: teachable-cli v2-unenroll-user-from-course. Policy: explicit confirmation.

Native: DELETE /v2/products/courses/{course_id}/enrollments/{user_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_get_user_s_enrollments_for_course

Retrieve a user's active enrollments for a course. A user may hold more than one active enrollment for the same course — e.g. enrollments originating from different sales/products — so results are returned as a paginated collection ordered by enrollment date (most recent first). Disabled and expired-inactive enrollments are excluded; if the user has no active enrollment, an empty collection is returned.

CLI: teachable-cli v2-get-user-s-enrollments-for-course. Policy: read.

Native: GET /v2/products/courses/{course_id}/enrollments/{user_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID (enrollment is keyed by user_id in this scope)
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_update_course_enrollment

Enroll a user in a specific course (same as PUT; supported for clients that use PATCH for upsert).

CLI: teachable-cli v2-update-course-enrollment. Policy: explicit confirmation.

Native: PATCH /v2/products/courses/{course_id}/enrollments/{user_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_enroll_user_in_course

Enroll a user in a specific course. If the user is already enrolled, returns the existing enrollment.

CLI: teachable-cli v2-enroll-user-in-course. Policy: explicit confirmation.

Native: PUT /v2/products/courses/{course_id}/enrollments/{user_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_list_enrollments_for_course

Retrieve a list of enrollments for a specific course. A user may appear more than once: a single user can hold multiple enrollments for the same course when they originate from different sales/products, and each enrollment is distinguished by its sale. Enrollments can be filtered by enrollment date and status. The list is returned in order of enrollment date, with the most recently enrolled users appearing first.

CLI: teachable-cli v2-list-enrollments-for-course. Policy: read.

Native: GET /v2/products/courses/{course_id}/enrollments. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
enrolled_after
Type or constraint
string
Requirement
Optional
Meaning
Filter enrollments after this ISO8601 datetime. Date range between enrolled_after and enrolled_before cannot exceed 90 days.
enrolled_before
Type or constraint
string
Requirement
Optional
Meaning
Filter enrollments before this ISO8601 datetime. Date range between enrolled_after and enrolled_before cannot exceed 90 days.
status
Type or constraint
string
Requirement
Optional
Meaning
Filter by status (active, completed, expired, disabled)
user_id
Type or constraint
integer
Requirement
Optional
Meaning
Filter enrollments for a specific user
sort_by
Type or constraint
string
Requirement
Optional
Meaning
Sort field (enrolled_at, completed_at)
sort_direction
Type or constraint
string
Requirement
Optional
Meaning
Sort direction (asc, desc)
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_delete_content_attachment_from_lesson_lecture

Delete a content item permanently. Only content items returned by the list/get endpoints can be deleted. System-managed content is protected and will return 403.

CLI: teachable-cli v2-delete-content-attachment-from-lesson-lecture. Policy: explicit confirmation.

Native: DELETE /v2/products/courses/{course_id}/lectures/{lecture_id}/attachments/{attachment_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
integer
Requirement
Required
Meaning
Lecture ID
attachment_id
Type or constraint
integer
Requirement
Required
Meaning
Attachment ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_get_content_attachment_for_lesson_lecture

Retrieve a single content item for a specific lesson.

CLI: teachable-cli v2-get-content-attachment-for-lesson-lecture. Policy: read.

Native: GET /v2/products/courses/{course_id}/lectures/{lecture_id}/attachments/{attachment_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
integer
Requirement
Required
Meaning
Lecture ID
attachment_id
Type or constraint
integer
Requirement
Required
Meaning
Attachment ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_update_content_attachment_for_lesson_lecture

Update a single content item for a specific lesson.

CLI: teachable-cli v2-update-content-attachment-for-lesson-lecture. Policy: explicit confirmation.

Native: PATCH /v2/products/courses/{course_id}/lectures/{lecture_id}/attachments/{attachment_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
integer
Requirement
Required
Meaning
Lecture ID
attachment_id
Type or constraint
integer
Requirement
Required
Meaning
Attachment ID
embeddable
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
downloadable
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
thumbnail_url
Type or constraint
string (maxLength=2048, format=uri)
Requirement
Optional
Meaning
External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
alt_text
Type or constraint
string
Requirement
Optional
Meaning
Native field
flagged_as_decorative
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
text
Type or constraint
string (maxLength=100000)
Requirement
Optional
Meaning
Native field
code_syntax
Type or constraint
string (maxLength=50)
Requirement
Optional
Meaning
Native field
open_response_question
Type or constraint
object
Requirement
Optional
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

embeddable
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
downloadable
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
thumbnail_url
Type or constraint
string (maxLength=2048, format=uri)
Requirement
Optional
Meaning
External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
alt_text
Type or constraint
string
Requirement
Optional
Meaning
Native field
flagged_as_decorative
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
text
Type or constraint
string (maxLength=100000)
Requirement
Optional
Meaning
Native field
code_syntax
Type or constraint
string (maxLength=50)
Requirement
Optional
Meaning
Native field
open_response_question
Type or constraint
object
Requirement
Optional
Meaning
Native field
open_response_question.question
Type or constraint
string (maxLength=10000)
Requirement
Optional
Meaning
Native field
open_response_question.required
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
open_response_question.upload_enabled
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
open_response_question.img_url
Type or constraint
string (maxLength=2048)
Requirement
Optional
Meaning
External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
open_response_question.img_name
Type or constraint
string (maxLength=255)
Requirement
Optional
Meaning
Native field
open_response_question.img_alt_text
Type or constraint
string (maxLength=255)
Requirement
Optional
Meaning
Native field

v2_list_content_attachments_for_lesson_lecture

Retrieve a list of content items for a specific lesson.

CLI: teachable-cli v2-list-content-attachments-for-lesson-lecture. Policy: read.

Native: GET /v2/products/courses/{course_id}/lectures/{lecture_id}/attachments. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
integer
Requirement
Required
Meaning
Lecture ID
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Current Page
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per Page
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_create_content_attachment_for_lesson_lecture

Create a new content item for a specific lesson.

CLI: teachable-cli v2-create-content-attachment-for-lesson-lecture. Policy: explicit confirmation.

Native: POST /v2/products/courses/{course_id}/lectures/{lecture_id}/attachments. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
integer
Requirement
Required
Meaning
Lecture ID
kind
Type or constraint
text, embed, code_embed, code_display, open_response_question, image, video, audio, pdf_embed, file
Requirement
Optional
Meaning
Native field
text
Type or constraint
string (maxLength=100000)
Requirement
Optional
Meaning
Required for text, code_embed, code_display kinds.
code_syntax
Type or constraint
string (maxLength=50)
Requirement
Optional
Meaning
Native field
url
Type or constraint
string (maxLength=2048)
Requirement
Optional
Meaning
Required for embed kind. External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
embeddable
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
downloadable
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
question
Type or constraint
string (maxLength=10000)
Requirement
Optional
Meaning
Required for open_response_question kind.
required
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
upload_enabled
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
img_url
Type or constraint
string (maxLength=2048)
Requirement
Optional
Meaning
External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
img_name
Type or constraint
string (maxLength=255)
Requirement
Optional
Meaning
Native field
img_alt_text
Type or constraint
string (maxLength=255)
Requirement
Optional
Meaning
Native field
file
Type or constraint
object
Requirement
Optional
Meaning
Required for file, image, video, audio, pdf_embed kinds.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

kind
Type or constraint
text, embed, code_embed, code_display, open_response_question, image, video, audio, pdf_embed, file
Requirement
Optional
Meaning
Native field
text
Type or constraint
string (maxLength=100000)
Requirement
Optional
Meaning
Required for text, code_embed, code_display kinds.
code_syntax
Type or constraint
string (maxLength=50)
Requirement
Optional
Meaning
Native field
url
Type or constraint
string (maxLength=2048)
Requirement
Optional
Meaning
Required for embed kind. External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
embeddable
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
downloadable
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
question
Type or constraint
string (maxLength=10000)
Requirement
Optional
Meaning
Required for open_response_question kind.
required
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
upload_enabled
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
img_url
Type or constraint
string (maxLength=2048)
Requirement
Optional
Meaning
External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
img_name
Type or constraint
string (maxLength=255)
Requirement
Optional
Meaning
Native field
img_alt_text
Type or constraint
string (maxLength=255)
Requirement
Optional
Meaning
Native field
file
Type or constraint
object
Requirement
Optional
Meaning
Required for file, image, video, audio, pdf_embed kinds.
file.url
Type or constraint
string
Requirement
Required
Meaning
Native field
file.filename
Type or constraint
string
Requirement
Optional
Meaning
Native field
file.mimetype
Type or constraint
string
Requirement
Required
Meaning
Native field
file.size
Type or constraint
integer
Requirement
Optional
Meaning
Native field

v2_reorder_content_attachments_in_lesson_lecture

Reorder all content items for a specific lesson in a single atomic operation. The request body must be a JSON array containing every content item with its new position.

CLI: teachable-cli v2-reorder-content-attachments-in-lesson-lecture. Policy: explicit confirmation.

Native: PUT /v2/products/courses/{course_id}/lectures/{lecture_id}/attachments. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
integer
Requirement
Required
Meaning
Lecture ID
data
Type or constraint
array (minItems=1)
Requirement
Optional
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

data
Type or constraint
array (minItems=1)
Requirement
Required
Meaning
Native field
data.[].id
Type or constraint
integer
Requirement
Required
Meaning
Native field
data.[].position
Type or constraint
integer
Requirement
Required
Meaning
Native field

v2_delete_lecture_comment

Delete a specific comment from a lecture.

CLI: teachable-cli v2-delete-lecture-comment. Policy: explicit confirmation.

Native: DELETE /v2/products/courses/{course_id}/lectures/{lecture_id}/comments/{comment_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
integer
Requirement
Required
Meaning
Lecture ID
comment_id
Type or constraint
integer
Requirement
Required
Meaning
Comment ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_update_comment_moderation_status

Update the moderation status of a comment. Only the status field can be modified through this endpoint.

Allowed Values

|--------|-------------|---------------------------------------|

removed
Approve the comment, making it visible to students.
Soft-delete the comment. It remains as a placeholder to preserve thread structure.
`awaiting_review`, `approved` (no-op)
awaiting_review, approved, removed (no-op)
denied
Approve the comment, making it visible to students.
Permanently reject and hide the comment. Cannot be undone.
`awaiting_review`, `approved` (no-op)
awaiting_review, approved, removed, denied (no-op)

Setting a status that is not valid for the comment's current state returns a 422 error.

Idempotency: Setting a status equal to the comment's current status is a no-op and returns 200 OK without modifying updated_at.

CLI: teachable-cli v2-update-comment-moderation-status. Policy: explicit confirmation.

Native: PATCH /v2/products/courses/{course_id}/lectures/{lecture_id}/comments/{comment_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
integer
Requirement
Required
Meaning
Lecture ID
comment_id
Type or constraint
integer
Requirement
Required
Meaning
Comment ID
status
Type or constraint
approved, removed, denied
Requirement
Optional
Meaning
New moderation status. approved: approve the comment. removed: soft-delete (kept as thread placeholder). denied: permanently hide the comment.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

status
Type or constraint
approved, removed, denied
Requirement
Required
Meaning
New moderation status. approved: approve the comment. removed: soft-delete (kept as thread placeholder). denied: permanently hide the comment.

v2_list_comments_for_lecture

Retrieve a paginated list of comments for a specific lecture. Results can be filtered by status and creation date, and sorted by created_at or updated_at.

If the lecture does not have comments enabled, this endpoint returns 200 OK with an empty data array rather than an error.

Without a status filter, comments in all statuses are returned. Use the status parameter to narrow results to a specific moderation state.

Available Statuses

StatusDescription

|--------|-------------|

`awaiting_review`The comment is pending moderation.
approvedThe comment is visible to students.
removedThe comment has been soft-deleted but preserved as a thread placeholder.
deniedThe comment has been permanently rejected and hidden.

CLI: teachable-cli v2-list-comments-for-lecture. Policy: read.

Native: GET /v2/products/courses/{course_id}/lectures/{lecture_id}/comments. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
integer
Requirement
Required
Meaning
Lecture ID
created_after
Type or constraint
string
Requirement
Optional
Meaning
Filter comments created after this ISO8601 datetime. Date range between created_after and created_before cannot exceed 90 days.
created_before
Type or constraint
string
Requirement
Optional
Meaning
Filter comments created before this ISO8601 datetime. Date range between created_after and created_before cannot exceed 90 days.
status
Type or constraint
string
Requirement
Optional
Meaning
Filter by status (awaiting_review, approved, removed, denied)
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page
sort_by
Type or constraint
string
Requirement
Optional
Meaning
Sort by field (created_at, updated_at)
sort_direction
Type or constraint
string
Requirement
Optional
Meaning
Sort direction (asc, desc)
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_create_comment_on_lecture

Create a comment on a lecture. The comment is authored by the school owner and is automatically approved.

To create a reply to an existing comment, include parent_id. The parent comment must be in awaiting_review or approved status.

CLI: teachable-cli v2-create-comment-on-lecture. Policy: explicit confirmation.

Native: POST /v2/products/courses/{course_id}/lectures/{lecture_id}/comments. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
integer
Requirement
Required
Meaning
Lecture ID
body
Type or constraint
string
Requirement
Optional
Meaning
Comment text
parent_id
Type or constraint
integer nullable
Requirement
Optional
Meaning
Parent comment ID for replies
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

body
Type or constraint
string
Requirement
Required
Meaning
Comment text
parent_id
Type or constraint
integer nullable
Requirement
Optional
Meaning
Parent comment ID for replies

v2_list_responses_for_lecture_quiz

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Retrieve a list of aggregated quiz responses for a lecture quiz (most recent submission per user).

CLI: teachable-cli v2-list-responses-for-lecture-quiz. Policy: read.

Native: GET /v2/products/courses/{course_id}/lectures/{lecture_id}/quizzes/{quiz_id}/responses. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
integer
Requirement
Required
Meaning
Lecture ID
quiz_id
Type or constraint
integer
Requirement
Required
Meaning
Quiz ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_delete_lecture_quiz

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Delete a specific quiz from a lecture.

CLI: teachable-cli v2-delete-lecture-quiz. Policy: explicit confirmation.

Native: DELETE /v2/products/courses/{course_id}/lectures/{lecture_id}/quizzes/{quiz_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
integer
Requirement
Required
Meaning
Lecture ID
quiz_id
Type or constraint
integer
Requirement
Required
Meaning
Quiz ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_get_lecture_quiz

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Retrieve a quiz by ID, including questions and correct answer metadata.

CLI: teachable-cli v2-get-lecture-quiz. Policy: read.

Native: GET /v2/products/courses/{course_id}/lectures/{lecture_id}/quizzes/{quiz_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
integer
Requirement
Required
Meaning
Lecture ID
quiz_id
Type or constraint
integer
Requirement
Required
Meaning
Quiz ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_list_quizzes_for_lecture

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Retrieve a list of quizzes for a specific lecture.

CLI: teachable-cli v2-list-quizzes-for-lecture. Policy: read.

Native: GET /v2/products/courses/{course_id}/lectures/{lecture_id}/quizzes. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
integer
Requirement
Required
Meaning
Lecture ID
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page
sort_by
Type or constraint
string
Requirement
Optional
Meaning
Sort field (created_at, updated_at)
sort_direction
Type or constraint
string
Requirement
Optional
Meaning
Sort direction (asc, desc)
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_mark_lecture_as_not_completed_for_user

Mark a lecture as not completed for a specific user. Idempotent.

CLI: teachable-cli v2-mark-lecture-as-not-completed-for-user. Policy: explicit confirmation.

Native: DELETE /v2/products/courses/{course_id}/lectures/{lecture_id}/users/{user_id}/completion. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
integer
Requirement
Required
Meaning
Lecture ID
user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_get_lecture_completion_status_for_user

Retrieve the completion status of a lecture for a specific user.

CLI: teachable-cli v2-get-lecture-completion-status-for-user. Policy: read.

Native: GET /v2/products/courses/{course_id}/lectures/{lecture_id}/users/{user_id}/completion. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
integer
Requirement
Required
Meaning
Lecture ID
user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_mark_lecture_as_completed_for_user

Mark a lecture as completed for a user.

This endpoint accepts no request body. Any body sent with the request will be silently ignored. The action (marking the lecture as completed) is determined entirely by the HTTP verb (PUT) and the URL path.

To undo completion (mark the lecture as not completed), use DELETE on this same resource path — do not send a PUT with {"completed": false} or any other body content.

CLI: teachable-cli v2-mark-lecture-as-completed-for-user. Policy: explicit confirmation.

Native: PUT /v2/products/courses/{course_id}/lectures/{lecture_id}/users/{user_id}/completion. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
integer
Requirement
Required
Meaning
Lecture ID
user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_get_video_for_lecture

Retrieve details of a specific video attachment for a lecture, including its streaming URL and metadata. When user_id is provided, the response may include user-specific progress data (current_time and url_progress_tracking) if that user has playback progress for the video.

CLI: teachable-cli v2-get-video-for-lecture. Policy: read.

Native: GET /v2/products/courses/{course_id}/lectures/{lecture_id}/videos/{video_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
integer
Requirement
Required
Meaning
Lecture ID
video_id
Type or constraint
integer
Requirement
Required
Meaning
Video attachment ID
user_id
Type or constraint
integer
Requirement
Optional
Meaning
User ID. When provided, current_time and url_progress_tracking are populated if the user has playback progress for this video; otherwise they are null.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_delete_lecture

Delete a lecture in the requested course scope.

CLI: teachable-cli v2-delete-lecture. Policy: explicit confirmation.

Native: DELETE /v2/products/courses/{course_id}/lectures/{lecture_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
string
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
string
Requirement
Required
Meaning
Lecture ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_get_lecture

Retrieve details of a specific lecture in a course.

CLI: teachable-cli v2-get-lecture. Policy: read.

Native: GET /v2/products/courses/{course_id}/lectures/{lecture_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
string
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
string
Requirement
Required
Meaning
Lecture ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_update_lecture

Update a lecture in the requested course scope.

CLI: teachable-cli v2-update-lecture. Policy: explicit confirmation.

Native: PATCH /v2/products/courses/{course_id}/lectures/{lecture_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
string
Requirement
Required
Meaning
Course ID
lecture_id
Type or constraint
string
Requirement
Required
Meaning
Lecture ID
name
Type or constraint
string (maxLength=300)
Requirement
Optional
Meaning
The lecture name. Must not exceed 300 characters.
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Whether the lecture is published. Must be a boolean (true/false).
free_preview
Type or constraint
boolean
Requirement
Optional
Meaning
Whether the lecture is available as a free preview. Must be a boolean (true/false).
student_comments_enabled
Type or constraint
boolean
Requirement
Optional
Meaning
Whether student comments are enabled for this lecture. Must be a boolean (true/false).
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string (maxLength=300)
Requirement
Optional
Meaning
The lecture name. Must not exceed 300 characters.
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Whether the lecture is published. Must be a boolean (true/false).
free_preview
Type or constraint
boolean
Requirement
Optional
Meaning
Whether the lecture is available as a free preview. Must be a boolean (true/false).
student_comments_enabled
Type or constraint
boolean
Requirement
Optional
Meaning
Whether student comments are enabled for this lecture. Must be a boolean (true/false).

v2_list_lectures_for_course

Retrieve a list of lectures for a specific course in the current school scope.

CLI: teachable-cli v2-list-lectures-for-course. Policy: read.

Native: GET /v2/products/courses/{course_id}/lectures. Version: explicit beta v2. Current source.

course_id
Type or constraint
string
Requirement
Required
Meaning
Course ID
section_id
Type or constraint
integer
Requirement
Optional
Meaning
Filter lectures by section ID
name
Type or constraint
string
Requirement
Optional
Meaning
Filter lectures by partial name
is_published
Type or constraint
string
Requirement
Optional
Meaning
Filter by published state (true, false, 1, 0)
created_after
Type or constraint
string
Requirement
Optional
Meaning
Filter lectures created after this ISO8601 datetime. Date range between created_after and created_before cannot exceed 90 days.
created_before
Type or constraint
string
Requirement
Optional
Meaning
Filter lectures created before this ISO8601 datetime. Date range between created_after and created_before cannot exceed 90 days.
sort_by
Type or constraint
string
Requirement
Optional
Meaning
Sort by field (position, created_at, updated_at)
sort_direction
Type or constraint
string
Requirement
Optional
Meaning
Sort direction (asc, desc)
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_create_lecture_in_section

Create a lecture inside a specific section of a course.

CLI: teachable-cli v2-create-lecture-in-section. Policy: explicit confirmation.

Native: POST /v2/products/courses/{course_id}/sections/{section_id}/lectures. Version: explicit beta v2. Current source.

course_id
Type or constraint
string
Requirement
Required
Meaning
Course ID
section_id
Type or constraint
string
Requirement
Required
Meaning
Section ID
name
Type or constraint
string
Requirement
Optional
Meaning
Native field
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
free_preview
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
student_comments_enabled
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string
Requirement
Required
Meaning
Native field
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
free_preview
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
student_comments_enabled
Type or constraint
boolean
Requirement
Optional
Meaning
Native field

v2_reorder_lectures_in_section

Reorder all lectures inside a specific section.

CLI: teachable-cli v2-reorder-lectures-in-section. Policy: explicit confirmation.

Native: PUT /v2/products/courses/{course_id}/sections/{section_id}/lectures. Version: explicit beta v2. Current source.

course_id
Type or constraint
string
Requirement
Required
Meaning
Course ID
section_id
Type or constraint
string
Requirement
Required
Meaning
Section ID
data
Type or constraint
array (minItems=1)
Requirement
Optional
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

data
Type or constraint
array (minItems=1)
Requirement
Required
Meaning
Native field
data.[].id
Type or constraint
integer
Requirement
Required
Meaning
Native field
data.[].position
Type or constraint
integer
Requirement
Required
Meaning
Native field

v2_get_course_section

Retrieve details for a specific section in a specific course.

CLI: teachable-cli v2-get-course-section. Policy: read.

Native: GET /v2/products/courses/{course_id}/sections/{section_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
string
Requirement
Required
Meaning
Course ID (must be a positive integer)
section_id
Type or constraint
string
Requirement
Required
Meaning
Section ID (must be a positive integer)
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_update_course_section

Update a section name for a specific course.

CLI: teachable-cli v2-update-course-section. Policy: explicit confirmation.

Native: PATCH /v2/products/courses/{course_id}/sections/{section_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
string
Requirement
Required
Meaning
Course ID (must be a positive integer)
section_id
Type or constraint
string
Requirement
Required
Meaning
Section ID (must be a positive integer)
name
Type or constraint
string (maxLength=300)
Requirement
Optional
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string (maxLength=300)
Requirement
Required
Meaning
Native field

v2_replace_course_section

Update a section name (same as PATCH; some clients use PUT for updates).

CLI: teachable-cli v2-replace-course-section. Policy: explicit confirmation.

Native: PUT /v2/products/courses/{course_id}/sections/{section_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
string
Requirement
Required
Meaning
Course ID (must be a positive integer)
section_id
Type or constraint
string
Requirement
Required
Meaning
Section ID (must be a positive integer)
name
Type or constraint
string (maxLength=300)
Requirement
Optional
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string (maxLength=300)
Requirement
Required
Meaning
Native field

v2_list_sections_for_course

Retrieve a list of sections for a specific course. Sections are ordered by position ascending by default.

CLI: teachable-cli v2-list-sections-for-course. Policy: read.

Native: GET /v2/products/courses/{course_id}/sections. Version: explicit beta v2. Current source.

course_id
Type or constraint
string
Requirement
Required
Meaning
Course ID (must be a positive integer)
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page
sort_by
Type or constraint
position, name, created_at, updated_at
Requirement
Optional
Meaning
Sort field (position, name, created_at, updated_at)
sort_direction
Type or constraint
asc, desc
Requirement
Optional
Meaning
Sort direction (asc, desc)
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_create_section_in_course

Create a new section for a specific course.

CLI: teachable-cli v2-create-section-in-course. Policy: explicit confirmation.

Native: POST /v2/products/courses/{course_id}/sections. Version: explicit beta v2. Current source.

course_id
Type or constraint
string
Requirement
Required
Meaning
Course ID (must be a positive integer)
name
Type or constraint
string (maxLength=300)
Requirement
Optional
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string (maxLength=300)
Requirement
Required
Meaning
Native field

v2_reorder_sections_in_course

Reorder all sections for a specific course in a single atomic operation.

CLI: teachable-cli v2-reorder-sections-in-course. Policy: explicit confirmation.

Native: PUT /v2/products/courses/{course_id}/sections. Version: explicit beta v2. Current source.

course_id
Type or constraint
string
Requirement
Required
Meaning
Course ID (must be a positive integer)
data
Type or constraint
array (minItems=1)
Requirement
Optional
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

data
Type or constraint
array (minItems=1)
Requirement
Required
Meaning
Native field
data.[].id
Type or constraint
integer
Requirement
Required
Meaning
Native field
data.[].position
Type or constraint
integer
Requirement
Required
Meaning
Native field

v2_get_course_progress_for_user

Retrieve the course progress for a specific user in a specific course. The response includes the overall progress percentage, as well as detailed progress information for each section and lecture within the course.

CLI: teachable-cli v2-get-course-progress-for-user. Policy: read.

Native: GET /v2/products/courses/{course_id}/users/{user_id}/progress. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_get_course

Retrieve details of a specific course.

CLI: teachable-cli v2-get-course. Policy: read.

Native: GET /v2/products/courses/{course_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_update_course

Update an existing course (partial update).

CLI: teachable-cli v2-update-course. Policy: explicit confirmation.

Native: PATCH /v2/products/courses/{course_id}. Version: explicit beta v2. Current source.

course_id
Type or constraint
integer
Requirement
Required
Meaning
Course ID
name
Type or constraint
string (minLength=1, maxLength=200)
Requirement
Optional
Meaning
Course name. Cannot be blank when provided.
description
Type or constraint
string nullable (maxLength=255)
Requirement
Optional
Meaning
Course subtitle/heading.
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Whether the course is published (accessible to students).
is_listed
Type or constraint
boolean
Requirement
Optional
Meaning
Whether the course appears in the school's public catalog.
friendly_url
Type or constraint
string (maxLength=100, pattern=^[a-zA-Z0-9\-_]+$)
Requirement
Optional
Meaning
URL slug. Allowed characters: letters, numbers, hyphens (-), and underscores (_). Must be unique within the school.
image_url
Type or constraint
string nullable (maxLength=2048, format=uri)
Requirement
Optional
Meaning
Course image URL. Must be a valid HTTP/HTTPS URL. Extension is not restricted (CDN URLs without extensions are accepted). Maximum 2048 characters. Blank or null clears the image. External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string (minLength=1, maxLength=200)
Requirement
Optional
Meaning
Course name. Cannot be blank when provided.
description
Type or constraint
string nullable (maxLength=255)
Requirement
Optional
Meaning
Course subtitle/heading.
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Whether the course is published (accessible to students).
is_listed
Type or constraint
boolean
Requirement
Optional
Meaning
Whether the course appears in the school's public catalog.
friendly_url
Type or constraint
string (maxLength=100, pattern=^[a-zA-Z0-9\-_]+$)
Requirement
Optional
Meaning
URL slug. Allowed characters: letters, numbers, hyphens (-), and underscores (_). Must be unique within the school.
image_url
Type or constraint
string nullable (maxLength=2048, format=uri)
Requirement
Optional
Meaning
Course image URL. Must be a valid HTTP/HTTPS URL. Extension is not restricted (CDN URLs without extensions are accepted). Maximum 2048 characters. Blank or null clears the image. External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.

v2_list_courses

Retrieve a list of all courses. The list is returned in order of creation date, with the most recently created courses appearing first.

CLI: teachable-cli v2-list-courses. Policy: read.

Native: GET /v2/products/courses. Version: explicit beta v2. Current source.

is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Filter by published state
is_listed
Type or constraint
boolean
Requirement
Optional
Meaning
Filter by catalog visibility
author_bio_id
Type or constraint
integer
Requirement
Optional
Meaning
Filter by author bio ID
created_after
Type or constraint
string
Requirement
Optional
Meaning
Filter courses created after this ISO8601 datetime. Date range between created_after and created_before cannot exceed 90 days.
created_before
Type or constraint
string
Requirement
Optional
Meaning
Filter courses created before this ISO8601 datetime. Date range between created_after and created_before cannot exceed 90 days.
name
Type or constraint
string
Requirement
Optional
Meaning
Filter by partial name (case-insensitive)
search
Type or constraint
string
Requirement
Optional
Meaning
Search in course name and heading/description (case-insensitive)
sort_by
Type or constraint
string
Requirement
Optional
Meaning
Sort field. Allowed values: name, created_at, updated_at. Defaults to created_at.
sort_direction
Type or constraint
string
Requirement
Optional
Meaning
Sort direction (asc, desc)
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number (1-based)
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page (max 100)
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_create_course

Create a new course for the school.

CLI: teachable-cli v2-create-course. Policy: explicit confirmation.

Native: POST /v2/products/courses. Version: explicit beta v2. Current source.

name
Type or constraint
string (minLength=1, maxLength=200)
Requirement
Optional
Meaning
Course name. Required.
description
Type or constraint
string nullable (maxLength=255)
Requirement
Optional
Meaning
Course subtitle/heading.
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Whether the course is published (accessible to students). Defaults to false.
is_listed
Type or constraint
boolean
Requirement
Optional
Meaning
Whether the course appears in the school's public catalog. Defaults to false.
author_bio_id
Type or constraint
integer
Requirement
Optional
Meaning
ID of an author bio belonging to the school. Required. Cannot be changed after creation.
friendly_url
Type or constraint
string (maxLength=100, pattern=^[a-zA-Z0-9\-_]+$)
Requirement
Optional
Meaning
URL slug for the course. Allowed characters: letters, numbers, hyphens (-), and underscores (_). If omitted, auto-generated from the course name. Must be unique within the school.
image_url
Type or constraint
string nullable (maxLength=2048, format=uri)
Requirement
Optional
Meaning
Course image URL. Must be a valid HTTP/HTTPS URL. Extension is not restricted (CDN URLs without extensions are accepted). Maximum 2048 characters. Blank or null clears the image. External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string (minLength=1, maxLength=200)
Requirement
Required
Meaning
Course name. Required.
description
Type or constraint
string nullable (maxLength=255)
Requirement
Optional
Meaning
Course subtitle/heading.
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Whether the course is published (accessible to students). Defaults to false.
is_listed
Type or constraint
boolean
Requirement
Optional
Meaning
Whether the course appears in the school's public catalog. Defaults to false.
author_bio_id
Type or constraint
integer
Requirement
Required
Meaning
ID of an author bio belonging to the school. Required. Cannot be changed after creation.
friendly_url
Type or constraint
string (maxLength=100, pattern=^[a-zA-Z0-9\-_]+$)
Requirement
Optional
Meaning
URL slug for the course. Allowed characters: letters, numbers, hyphens (-), and underscores (_). If omitted, auto-generated from the course name. Must be unique within the school.
image_url
Type or constraint
string nullable (maxLength=2048, format=uri)
Requirement
Optional
Meaning
Course image URL. Must be a valid HTTP/HTTPS URL. Extension is not restricted (CDN URLs without extensions are accepted). Maximum 2048 characters. Blank or null clears the image. External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.

v2_delete_attachment_from_digital_download

Delete an attachment. Returns 204 on success.

CLI: teachable-cli v2-delete-attachment-from-digital-download. Policy: explicit confirmation.

Native: DELETE /v2/products/digital-downloads/{digital_download_id}/attachments/{attachment_id}. Version: explicit beta v2. Current source.

digital_download_id
Type or constraint
integer
Requirement
Required
Meaning
Digital Download ID
attachment_id
Type or constraint
integer
Requirement
Required
Meaning
Attachment ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_get_attachment_for_digital_download

Retrieve a single attachment for a digital download.

CLI: teachable-cli v2-get-attachment-for-digital-download. Policy: read.

Native: GET /v2/products/digital-downloads/{digital_download_id}/attachments/{attachment_id}. Version: explicit beta v2. Current source.

digital_download_id
Type or constraint
integer
Requirement
Required
Meaning
Digital Download ID
attachment_id
Type or constraint
integer
Requirement
Required
Meaning
Attachment ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_list_attachments_for_digital_download

Retrieve a list of attachments for a digital download.

CLI: teachable-cli v2-list-attachments-for-digital-download. Policy: read.

Native: GET /v2/products/digital-downloads/{digital_download_id}/attachments. Version: explicit beta v2. Current source.

digital_download_id
Type or constraint
integer
Requirement
Required
Meaning
Digital Download ID
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number (default 1, must be >= 1)
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page (default 20, must be >= 1, max 100)
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_create_attachment_for_digital_download

Create an attachment (download or redirect) for a digital download. Business rules: - All attachments on a digital download must have the same kind. You cannot mix download and redirect attachments on the same product. - For kind: download: filename, url, and size_in_bytes are required. - For kind: redirect: url and button_text are required. Only one redirect attachment is allowed per digital download.

CLI: teachable-cli v2-create-attachment-for-digital-download. Policy: explicit confirmation.

Native: POST /v2/products/digital-downloads/{digital_download_id}/attachments. Version: explicit beta v2. Current source.

digital_download_id
Type or constraint
integer
Requirement
Required
Meaning
Digital Download ID
filename
Type or constraint
string nullable
Requirement
Optional
Meaning
Required when kind is 'download'. The name of the file.
size_in_bytes
Type or constraint
integer nullable
Requirement
Optional
Meaning
Required when kind is 'download'. The size of the file in bytes (must be >= 1).
url
Type or constraint
string nullable
Requirement
Optional
Meaning
Required for both kinds. External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
kind
Type or constraint
download, redirect
Requirement
Optional
Meaning
The type of attachment. All attachments on a digital download must have the same kind.
button_text
Type or constraint
string nullable
Requirement
Optional
Meaning
Required when kind is 'redirect'. The text displayed on the redirect button. Maximum 24 characters.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

filename
Type or constraint
string nullable
Requirement
Optional
Meaning
Required when kind is 'download'. The name of the file.
size_in_bytes
Type or constraint
integer nullable
Requirement
Optional
Meaning
Required when kind is 'download'. The size of the file in bytes (must be >= 1).
url
Type or constraint
string nullable
Requirement
Optional
Meaning
Required for both kinds. External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
kind
Type or constraint
download, redirect
Requirement
Required
Meaning
The type of attachment. All attachments on a digital download must have the same kind.
button_text
Type or constraint
string nullable
Requirement
Optional
Meaning
Required when kind is 'redirect'. The text displayed on the redirect button. Maximum 24 characters.

v2_unenroll_user_from_digital_download

Ensure final state of no active access for a user in a digital download product. This operation is idempotent.

CLI: teachable-cli v2-unenroll-user-from-digital-download. Policy: explicit confirmation.

Native: DELETE /v2/products/digital-downloads/{digital_download_id}/enrollments/{user_id}. Version: explicit beta v2. Current source.

digital_download_id
Type or constraint
integer
Requirement
Required
Meaning
Digital Download ID
user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_get_enrollment_for_digital_download

Retrieve a single enrollment for a user in a digital download product using the base enrollment contract (without progress).

CLI: teachable-cli v2-get-enrollment-for-digital-download. Policy: read.

Native: GET /v2/products/digital-downloads/{digital_download_id}/enrollments/{user_id}. Version: explicit beta v2. Current source.

digital_download_id
Type or constraint
integer
Requirement
Required
Meaning
Digital Download ID
user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_enroll_user_in_digital_download

Create or ensure active access for a user in a digital download product. This operation is idempotent.

CLI: teachable-cli v2-enroll-user-in-digital-download. Policy: explicit confirmation.

Native: PUT /v2/products/digital-downloads/{digital_download_id}/enrollments/{user_id}. Version: explicit beta v2. Current source.

digital_download_id
Type or constraint
integer
Requirement
Required
Meaning
Digital Download ID
user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_list_enrollments_for_digital_download

Retrieve a list of enrollments for a digital download product using the base enrollment contract (without progress).

CLI: teachable-cli v2-list-enrollments-for-digital-download. Policy: read.

Native: GET /v2/products/digital-downloads/{digital_download_id}/enrollments. Version: explicit beta v2. Current source.

digital_download_id
Type or constraint
integer
Requirement
Required
Meaning
Digital Download ID
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number (default 1, must be >= 1)
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page (default 25, must be >= 1, max 100)
sort_by
Type or constraint
string
Requirement
Optional
Meaning
Sort field (enrolled_at only)
sort_direction
Type or constraint
string
Requirement
Optional
Meaning
Sort direction (asc, desc)
enrolled_after
Type or constraint
string
Requirement
Optional
Meaning
Filter enrollments with enrolled_at >= ISO8601 value. Date range between enrolled_after and enrolled_before cannot exceed 90 days.
enrolled_before
Type or constraint
string
Requirement
Optional
Meaning
Filter enrollments with enrolled_at <= ISO8601 value. Date range between enrolled_after and enrolled_before cannot exceed 90 days.
status
Type or constraint
string
Requirement
Optional
Meaning
Filter by status (active, expired, disabled)
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_delete_digital_download

Delete a digital download.

CLI: teachable-cli v2-delete-digital-download. Policy: explicit confirmation.

Native: DELETE /v2/products/digital-downloads/{digital_download_id}. Version: explicit beta v2. Current source.

digital_download_id
Type or constraint
integer
Requirement
Required
Meaning
Digital Download ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_get_digital_download

Retrieve details of a specific digital download.

CLI: teachable-cli v2-get-digital-download. Policy: read.

Native: GET /v2/products/digital-downloads/{digital_download_id}. Version: explicit beta v2. Current source.

digital_download_id
Type or constraint
integer
Requirement
Required
Meaning
Digital Download ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_update_digital_download

Update an existing digital download.

CLI: teachable-cli v2-update-digital-download. Policy: explicit confirmation.

Native: PATCH /v2/products/digital-downloads/{digital_download_id}. Version: explicit beta v2. Current source.

digital_download_id
Type or constraint
integer
Requirement
Required
Meaning
Digital Download ID
name
Type or constraint
string
Requirement
Optional
Meaning
Native field
description
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
category
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
image_url
Type or constraint
string nullable (format=uri)
Requirement
Optional
Meaning
External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string
Requirement
Optional
Meaning
Native field
description
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
category
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
image_url
Type or constraint
string nullable (format=uri)
Requirement
Optional
Meaning
External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.

v2_list_digital_downloads

Retrieve a list of all digital downloads. Default order is by created_at (desc) when no sort is applied; the most recently created digital downloads appear first when sorting by created_at desc.

CLI: teachable-cli v2-list-digital-downloads. Policy: read.

Native: GET /v2/products/digital-downloads. Version: explicit beta v2. Current source.

page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number (default 1, must be >= 1)
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page (default 20, must be >= 1, max 100)
sort_by
Type or constraint
string
Requirement
Optional
Meaning
Sort by field (created_at, updated_at)
sort_direction
Type or constraint
string
Requirement
Optional
Meaning
Sort direction (asc, desc)
search
Type or constraint
string
Requirement
Optional
Meaning
Case-insensitive search on name and description (ILIKE)
name
Type or constraint
string
Requirement
Optional
Meaning
Filter by name (ILIKE partial match)
is_published
Type or constraint
string
Requirement
Optional
Meaning
Filter by published state (true, false, 1, 0)
author_bio_id
Type or constraint
integer
Requirement
Optional
Meaning
Filter by author bio ID
created_after
Type or constraint
string
Requirement
Optional
Meaning
Filter with created_at after this time (parseable by Time.zone.parse). Date range between created_after and created_before cannot exceed 90 days.
created_before
Type or constraint
string
Requirement
Optional
Meaning
Filter with created_at before this time (parseable by Time.zone.parse). Date range between created_after and created_before cannot exceed 90 days.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_create_digital_download

Create a new digital download.

CLI: teachable-cli v2-create-digital-download. Policy: explicit confirmation.

Native: POST /v2/products/digital-downloads. Version: explicit beta v2. Current source.

name
Type or constraint
string
Requirement
Optional
Meaning
Native field
description
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
category
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
author_bio_id
Type or constraint
integer
Requirement
Optional
Meaning
Native field
image_url
Type or constraint
string nullable (format=uri)
Requirement
Optional
Meaning
External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string
Requirement
Required
Meaning
Native field
description
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
category
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
author_bio_id
Type or constraint
integer
Requirement
Required
Meaning
Native field
image_url
Type or constraint
string nullable (format=uri)
Requirement
Optional
Meaning
External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.

v2_unenroll_user_from_product_collection

Disable enrollment into a product collection. Revokes access to all product collection contents. For subscriptions, the billing subscription is also canceled.

CLI: teachable-cli v2-unenroll-user-from-product-collection. Policy: explicit confirmation.

Native: DELETE /v2/products/product-collections/{product_collection_id}/enrollments/{user_id}. Version: explicit beta v2. Current source.

product_collection_id
Type or constraint
integer
Requirement
Required
Meaning
Product Collection ID
user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_get_enrollment_for_product_collection

Retrieve an enrollment into a product collection for a specific user.

CLI: teachable-cli v2-get-enrollment-for-product-collection. Policy: read.

Native: GET /v2/products/product-collections/{product_collection_id}/enrollments/{user_id}. Version: explicit beta v2. Current source.

product_collection_id
Type or constraint
integer
Requirement
Required
Meaning
Product Collection ID
user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_update_product_collection_enrollment

Enroll a user in a product collection (same as PUT). Creates a new enrollment when none exists, or reactivates a disabled enrollment.

CLI: teachable-cli v2-update-product-collection-enrollment. Policy: explicit confirmation.

Native: PATCH /v2/products/product-collections/{product_collection_id}/enrollments/{user_id}. Version: explicit beta v2. Current source.

product_collection_id
Type or constraint
integer
Requirement
Required
Meaning
Product Collection ID
user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_enroll_user_in_product_collection

Enroll a user in a product collection. Creates a new enrollment when none exists, or reactivates a disabled enrollment. Gives access to all product collection contents.

CLI: teachable-cli v2-enroll-user-in-product-collection. Policy: explicit confirmation.

Native: PUT /v2/products/product-collections/{product_collection_id}/enrollments/{user_id}. Version: explicit beta v2. Current source.

product_collection_id
Type or constraint
integer
Requirement
Required
Meaning
Product Collection ID
user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_list_enrollments_for_product_collection

Retrieve a list of enrollments into a specific product collection. Enrollments are returned in order of enrolled date, with the most recently enrolled appearing first.

CLI: teachable-cli v2-list-enrollments-for-product-collection. Policy: read.

Native: GET /v2/products/product-collections/{product_collection_id}/enrollments. Version: explicit beta v2. Current source.

product_collection_id
Type or constraint
integer
Requirement
Required
Meaning
Product Collection ID
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page
sort_by
Type or constraint
string
Requirement
Optional
Meaning
Sort field (enrolled_at)
sort_direction
Type or constraint
string
Requirement
Optional
Meaning
Sort direction (asc, desc)
enrolled_after
Type or constraint
string
Requirement
Optional
Meaning
Filter by enrolled_at after ISO8601 time. Date range between enrolled_after and enrolled_before cannot exceed 90 days.
enrolled_before
Type or constraint
string
Requirement
Optional
Meaning
Filter by enrolled_at before ISO8601 time. Date range between enrolled_after and enrolled_before cannot exceed 90 days.
status
Type or constraint
string
Requirement
Optional
Meaning
Filter by status (active, disabled)
user_id
Type or constraint
integer
Requirement
Optional
Meaning
Filter by enrolled user
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_remove_product_from_product_collection

Remove a specific product from a product collection.

CLI: teachable-cli v2-remove-product-from-product-collection. Policy: explicit confirmation.

Native: DELETE /v2/products/product-collections/{product_collection_id}/products/{product_type}/{product_id}. Version: explicit beta v2. Current source.

product_collection_id
Type or constraint
integer
Requirement
Required
Meaning
Product Collection ID
product_type
Type or constraint
string
Requirement
Required
Meaning
Product Type (course, coaching, digital_download)
product_id
Type or constraint
integer
Requirement
Required
Meaning
Product ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_list_products_in_product_collection

Retrieve a list of products in a specific product collection. Products are returned in order of creation date, with the most recently created products appearing first.

CLI: teachable-cli v2-list-products-in-product-collection. Policy: read.

Native: GET /v2/products/product-collections/{product_collection_id}/products. Version: explicit beta v2. Current source.

product_collection_id
Type or constraint
integer
Requirement
Required
Meaning
Product Collection ID
type
Type or constraint
string
Requirement
Optional
Meaning
Filter by Product type (course, coaching, digital_download)
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number
limit
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page (max 100)
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_add_product_to_product_collection

Add products to a product collection. Products are returned in order of creation date, with the most recently created products appearing first.

CLI: teachable-cli v2-add-product-to-product-collection. Policy: explicit confirmation.

Native: POST /v2/products/product-collections/{product_collection_id}/products. Version: explicit beta v2. Current source.

product_collection_id
Type or constraint
integer
Requirement
Required
Meaning
Product Collection ID
data
Type or constraint
array
Requirement
Optional
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

data
Type or constraint
array
Requirement
Optional
Meaning
Native field
data.[].id
Type or constraint
integer
Requirement
Required
Meaning
Native field
data.[].type
Type or constraint
string
Requirement
Required
Meaning
Native field
data.[].name
Type or constraint
string
Requirement
Required
Meaning
Native field
data.[].href
Type or constraint
string
Requirement
Required
Meaning
Native field
data.[].created_at
Type or constraint
string (format=date-time)
Requirement
Required
Meaning
Native field
data.[].updated_at
Type or constraint
string (format=date-time)
Requirement
Required
Meaning
Native field

v2_delete_product_collection

Delete a specific product collection.

CLI: teachable-cli v2-delete-product-collection. Policy: explicit confirmation.

Native: DELETE /v2/products/product-collections/{product_collection_id}. Version: explicit beta v2. Current source.

product_collection_id
Type or constraint
integer
Requirement
Required
Meaning
Product Collection ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_get_product_collection

Retrieve details of a specific product collection by its ID.

CLI: teachable-cli v2-get-product-collection. Policy: read.

Native: GET /v2/products/product-collections/{product_collection_id}. Version: explicit beta v2. Current source.

product_collection_id
Type or constraint
integer
Requirement
Required
Meaning
Product Collection ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_update_product_collection

Update details of a specific product collection.

CLI: teachable-cli v2-update-product-collection. Policy: explicit confirmation.

Native: PATCH /v2/products/product-collections/{product_collection_id}. Version: explicit beta v2. Current source.

product_collection_id
Type or constraint
integer
Requirement
Required
Meaning
Product Collection ID
name
Type or constraint
string
Requirement
Optional
Meaning
Native field
description
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
image_url
Type or constraint
string nullable (format=uri)
Requirement
Optional
Meaning
External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
is_listed
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string
Requirement
Optional
Meaning
Native field
description
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
image_url
Type or constraint
string nullable (format=uri)
Requirement
Optional
Meaning
External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
is_listed
Type or constraint
boolean
Requirement
Optional
Meaning
Native field

v2_replace_product_collection

Update details of a specific product collection (full update via PUT, same behavior as PATCH).

CLI: teachable-cli v2-replace-product-collection. Policy: explicit confirmation.

Native: PUT /v2/products/product-collections/{product_collection_id}. Version: explicit beta v2. Current source.

product_collection_id
Type or constraint
integer
Requirement
Required
Meaning
Product Collection ID
name
Type or constraint
string
Requirement
Optional
Meaning
Native field
description
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
image_url
Type or constraint
string nullable (format=uri)
Requirement
Optional
Meaning
External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
is_listed
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string
Requirement
Optional
Meaning
Native field
description
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
image_url
Type or constraint
string nullable (format=uri)
Requirement
Optional
Meaning
External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
is_listed
Type or constraint
boolean
Requirement
Optional
Meaning
Native field

v2_list_product_collections

Retrieve a list of product collections for the school. Product collections are returned in order of creation date, with the most recently created collections appearing first.

CLI: teachable-cli v2-list-product-collections. Policy: read.

Native: GET /v2/products/product-collections. Version: explicit beta v2. Current source.

page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page
sort_by
Type or constraint
string
Requirement
Optional
Meaning
Sort by field (created_at, updated_at)
sort_direction
Type or constraint
string
Requirement
Optional
Meaning
Sort direction (asc, desc)
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_create_product_collection

Create a product collection scoped to current school.

CLI: teachable-cli v2-create-product-collection. Policy: explicit confirmation.

Native: POST /v2/products/product-collections. Version: explicit beta v2. Current source.

name
Type or constraint
string
Requirement
Optional
Meaning
Native field
description
Type or constraint
string
Requirement
Optional
Meaning
Native field
image_url
Type or constraint
string (format=uri)
Requirement
Optional
Meaning
External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
is_listed
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string
Requirement
Required
Meaning
Native field
description
Type or constraint
string
Requirement
Optional
Meaning
Native field
image_url
Type or constraint
string (format=uri)
Requirement
Optional
Meaning
External URLs are referenced directly and are not downloaded or re-hosted by Teachable. Only files uploaded via the POST /v2/uploads endpoint are stored on Teachable's CDN. The caller is responsible for ensuring externally-hosted media remains available at the provided URL.
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Native field
is_listed
Type or constraint
boolean
Requirement
Optional
Meaning
Native field

v2_list_products

Retrieve a list of all products across all product types. The list is returned in order of creation date, with the most recently created products appearing first.

CLI: teachable-cli v2-list-products. Policy: read.

Native: GET /v2/products. Version: explicit beta v2. Current source.

page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number (1-based)
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page (max 100)
is_published
Type or constraint
boolean
Requirement
Optional
Meaning
Filter by published state
author_bio_id
Type or constraint
string
Requirement
Optional
Meaning
Filter by author bio ID
created_after
Type or constraint
string
Requirement
Optional
Meaning
Filter products created after this time (parseable datetime string). Date range between created_after and created_before cannot exceed 90 days.
created_before
Type or constraint
string
Requirement
Optional
Meaning
Filter products created before this time (parseable datetime string). Date range between created_after and created_before cannot exceed 90 days.
name
Type or constraint
string
Requirement
Optional
Meaning
Filter by product name (partial match)
search
Type or constraint
string
Requirement
Optional
Meaning
Search in product name and description (partial match)
sort_by
Type or constraint
string
Requirement
Optional
Meaning
Sort field (created_at or updated_at)
sort_direction
Type or constraint
string
Requirement
Optional
Meaning
Sort direction (asc or desc)
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_get_purchase

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Retrieve a single purchase by ID for the current school.

CLI: teachable-cli v2-get-purchase. Policy: read.

Native: GET /v2/purchases/{purchase_id}. Version: explicit beta v2. Current source.

purchase_id
Type or constraint
integer
Requirement
Required
Meaning
Purchase ID
user_id
Type or constraint
integer
Requirement
Optional
Meaning
Filter by user ID to verify the purchase belongs to a specific user
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_list_purchases

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Retrieve a paginated list of purchases for the current school.

CLI: teachable-cli v2-list-purchases. Policy: read.

Native: GET /v2/purchases. Version: explicit beta v2. Current source.

page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number (default: 1, min: 1)
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page (default: 25, min: 1, max: 100)
purchased_after
Type or constraint
string
Requirement
Optional
Meaning
Filter purchases after this ISO8601 datetime. Date range between purchased_after and purchased_before cannot exceed 90 days.
purchased_before
Type or constraint
string
Requirement
Optional
Meaning
Filter purchases before this ISO8601 datetime. Date range between purchased_after and purchased_before cannot exceed 90 days.
product_type
Type or constraint
string
Requirement
Optional
Meaning
Filter by product type (course, digital_download, coaching, bundle, membership)
product_id
Type or constraint
integer
Requirement
Optional
Meaning
Filter by product entity id; must be sent together with product_type
payment_method
Type or constraint
stripe, paypal, free, coupon, external, admin, multi_school_bundle, voucher, external-api
Requirement
Optional
Meaning
Filter by payment method
is_active
Type or constraint
boolean
Requirement
Optional
Meaning
Filter active/inactive purchases
is_recurring
Type or constraint
boolean
Requirement
Optional
Meaning
Filter recurring/one-time purchases
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_get_transaction

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Retrieve a single transaction by ID for the current school.

CLI: teachable-cli v2-get-transaction. Policy: read.

Native: GET /v2/transactions/{transaction_id}. Version: explicit beta v2. Current source.

transaction_id
Type or constraint
integer
Requirement
Required
Meaning
Transaction ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_list_transactions

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Retrieve a paginated list of transactions for the current school.

CLI: teachable-cli v2-list-transactions. Policy: read.

Native: GET /v2/transactions. Version: explicit beta v2. Current source.

user_id
Type or constraint
string
Requirement
Optional
Meaning
Filter by user ID
affiliate_id
Type or constraint
string
Requirement
Optional
Meaning
Filter by affiliate ID
course_id
Type or constraint
string
Requirement
Optional
Meaning
Filter by course ID
pricing_plan_id
Type or constraint
string
Requirement
Optional
Meaning
Filter by pricing plan ID
purchase_id
Type or constraint
string
Requirement
Optional
Meaning
Filter by purchase (sale) ID
is_fully_refunded
Type or constraint
boolean
Requirement
Optional
Meaning
Filter fully refunded transactions
was_charged_back
Type or constraint
boolean
Requirement
Optional
Meaning
Filter chargeback transactions
created_after
Type or constraint
string
Requirement
Optional
Meaning
Filter transactions created after this ISO8601 datetime. Date range between created_after and created_before cannot exceed 90 days.
created_before
Type or constraint
string
Requirement
Optional
Meaning
Filter transactions created before this ISO8601 datetime. Date range between created_after and created_before cannot exceed 90 days.
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_create_pre_signed_upload_credentials

Generate pre-signed credentials for uploading files directly to cloud storage.

Workflow

  1. Request credentials: Call this endpoint with the resource type, id, purpose, and file extension
  2. Upload your file: Use the response fields to upload directly to the storage provider
  3. Update the resource: After upload completes, update the resource with the returned url (e.g., PATCH /v2/courses/{id} with thumbnail_url)

How to Upload

Build your upload request using the response fields:

  1. Send a request to upload_url using upload_method
  2. Set all headers from upload_headers (includes Content-Type)
  3. Include each key-value pair from upload_body in your request body
  4. Include your file using the field name from file_field_name

Note: Serialize upload_body according to the Content-Type header. If file_field_name is present, include your file as a field with that name alongside the upload_body fields. If file_field_name is null, send the file as the raw request body.

Example

bash
# 1. Request upload credentials
curl -X POST "https://developers.teachable.com/v2/uploads" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"type": "course", "id": 123, "purpose": "thumbnail", "extension": "jpg"}'

# Response:
# {
# "upload_url": "https://api2.transloadit.com/assemblies",
# "upload_method": "POST",
# "upload_headers": {"Content-Type": "multipart/form-data"},
# "upload_body": {"params": "...", "signature": "..."},
# "file_field_name": "file",
# "url": "https://cdn.teachablecdn.com/...",
# "expires": "2024-01-01T13:00:00Z",
# "upload_id": "abc-123"
# }

# 2. Upload the file using the credentials
curl -X POST "https://api2.transloadit.com/assemblies" \
-H "Content-Type: multipart/form-data" \
-F "params=..." \
-F "signature=..." \
-F "file=@/path/to/image.jpg"

# 3. Update the resource with the CDN URL
curl -X PATCH "https://developers.teachable.com/v2/courses/123" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"thumbnail_url": "https://cdn.teachablecdn.com/..."}'

Response Fields

FieldDescription

|-------|-------------|

`upload_url`The endpoint URL to send your file to
upload_methodHTTP method to use (e.g., POST, PUT)
upload_headersHeaders to include in your upload request (e.g., Content-Type)
upload_bodyKey-value pairs to include in your request body (serialize per Content-Type), or null if not needed
file_field_nameThe field name to use for your file (e.g., file), or null if the file is sent as the raw request body
urlThe CDN URL where your file will be available after upload. Use this to update the resource.
expiresWhen the credentials expire (ISO 8601). Upload before this time.
upload_idUnique identifier for this upload request

Supported Resources

|------|---------|-------------|

product_collection
`thumbnail`
thumbnail
Course cover image
Learning path cover image
digital_download
`thumbnail`
thumbnail
Course cover image
Digital product cover image
digital_download
`thumbnail`
attachment
Course cover image
Downloadable file for customers
lecture
`thumbnail`
attachment
Course cover image
Lecture file (PDF, video, etc.)
membership
`thumbnail`
thumbnail
Course cover image
Membership cover image
coaching
`thumbnail`
thumbnail
Course cover image
Coaching product cover image

Constraints

  • Maximum file size: 20 GB
  • Extension: 1-10 alphanumeric characters (e.g., jpg, pdf, mp4)
  • Credentials expire: 1 hour after creation

CLI: teachable-cli v2-create-pre-signed-upload-credentials. Policy: explicit confirmation.

Native: POST /v2/uploads. Version: explicit beta v2. Current source.

account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
oneOf
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.
output_file
Type or constraint
string (minLength=1)
Requirement
Required
Meaning
Absolute NEW owner-private receipt file; exclusive0600 creation, no overwrite. Upload/public-token URLs never enter ordinary output.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

variant 1
Type or constraint
object
Requirement
Choose one
Meaning
Native oneOf
variant1.type
Type or constraint
course
Requirement
Required
Meaning
The resource type to upload for.
variant1.id
Type or constraint
integer (minimum=1)
Requirement
Required
Meaning
The ID of the resource.
variant1.purpose
Type or constraint
thumbnail
Requirement
Required
Meaning
The purpose of the upload (e.g., thumbnail, attachment).
variant1.extension
Type or constraint
string (pattern=^[a-zA-Z0-9]{1,10}$)
Requirement
Required
Meaning
File extension without the dot (e.g., 'jpg', 'pdf', 'mp4'). Case-insensitive, 1-10 alphanumeric characters.
variant 2
Type or constraint
object
Requirement
Choose one
Meaning
Native oneOf
variant2.type
Type or constraint
product_collection
Requirement
Required
Meaning
The resource type to upload for.
variant2.id
Type or constraint
integer (minimum=1)
Requirement
Required
Meaning
The ID of the resource.
variant2.purpose
Type or constraint
thumbnail
Requirement
Required
Meaning
The purpose of the upload (e.g., thumbnail, attachment).
variant2.extension
Type or constraint
string (pattern=^[a-zA-Z0-9]{1,10}$)
Requirement
Required
Meaning
File extension without the dot (e.g., 'jpg', 'pdf', 'mp4'). Case-insensitive, 1-10 alphanumeric characters.
variant 3
Type or constraint
object
Requirement
Choose one
Meaning
Native oneOf
variant3.type
Type or constraint
digital_download
Requirement
Required
Meaning
The resource type to upload for.
variant3.id
Type or constraint
integer (minimum=1)
Requirement
Required
Meaning
The ID of the resource.
variant3.purpose
Type or constraint
thumbnail, attachment
Requirement
Required
Meaning
The purpose of the upload (e.g., thumbnail, attachment).
variant3.extension
Type or constraint
string (pattern=^[a-zA-Z0-9]{1,10}$)
Requirement
Required
Meaning
File extension without the dot (e.g., 'jpg', 'pdf', 'mp4'). Case-insensitive, 1-10 alphanumeric characters.
variant 4
Type or constraint
object
Requirement
Choose one
Meaning
Native oneOf
variant4.type
Type or constraint
lecture
Requirement
Required
Meaning
The resource type to upload for.
variant4.id
Type or constraint
integer (minimum=1)
Requirement
Required
Meaning
The ID of the resource.
variant4.purpose
Type or constraint
attachment
Requirement
Required
Meaning
The purpose of the upload (e.g., thumbnail, attachment).
variant4.extension
Type or constraint
string (pattern=^[a-zA-Z0-9]{1,10}$)
Requirement
Required
Meaning
File extension without the dot (e.g., 'jpg', 'pdf', 'mp4'). Case-insensitive, 1-10 alphanumeric characters.
variant 5
Type or constraint
object
Requirement
Choose one
Meaning
Native oneOf
variant5.type
Type or constraint
membership
Requirement
Required
Meaning
The resource type to upload for.
variant5.id
Type or constraint
integer (minimum=1)
Requirement
Required
Meaning
The ID of the resource.
variant5.purpose
Type or constraint
thumbnail
Requirement
Required
Meaning
The purpose of the upload (e.g., thumbnail, attachment).
variant5.extension
Type or constraint
string (pattern=^[a-zA-Z0-9]{1,10}$)
Requirement
Required
Meaning
File extension without the dot (e.g., 'jpg', 'pdf', 'mp4'). Case-insensitive, 1-10 alphanumeric characters.
variant 6
Type or constraint
object
Requirement
Choose one
Meaning
Native oneOf
variant6.type
Type or constraint
coaching
Requirement
Required
Meaning
The resource type to upload for.
variant6.id
Type or constraint
integer (minimum=1)
Requirement
Required
Meaning
The ID of the resource.
variant6.purpose
Type or constraint
thumbnail
Requirement
Required
Meaning
The purpose of the upload (e.g., thumbnail, attachment).
variant6.extension
Type or constraint
string (pattern=^[a-zA-Z0-9]{1,10}$)
Requirement
Required
Meaning
File extension without the dot (e.g., 'jpg', 'pdf', 'mp4'). Case-insensitive, 1-10 alphanumeric characters.

v2_list_purchases_for_user

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Retrieve a paginated list of purchases for a specific user.

CLI: teachable-cli v2-list-purchases-for-user. Policy: read.

Native: GET /v2/users/{user_id}/purchases. Version: explicit beta v2. Current source.

user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number (default: 1, min: 1)
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page (default: 25, min: 1, max: 100)
purchased_after
Type or constraint
string
Requirement
Optional
Meaning
Filter purchases after this ISO8601 datetime. Date range between purchased_after and purchased_before cannot exceed 90 days.
purchased_before
Type or constraint
string
Requirement
Optional
Meaning
Filter purchases before this ISO8601 datetime. Date range between purchased_after and purchased_before cannot exceed 90 days.
product_type
Type or constraint
string
Requirement
Optional
Meaning
Filter by product type (course, digital_download, coaching, bundle, membership)
product_id
Type or constraint
integer
Requirement
Optional
Meaning
Filter by product entity id; must be sent together with product_type
is_active
Type or constraint
boolean
Requirement
Optional
Meaning
Filter active/inactive purchases
is_recurring
Type or constraint
boolean
Requirement
Optional
Meaning
Filter recurring/one-time purchases
payment_method
Type or constraint
stripe, paypal, free, coupon, external, admin, multi_school_bundle, voucher, external-api
Requirement
Optional
Meaning
Filter by payment method
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_list_quiz_responses_for_user

🚧 Beta: This endpoint may not be available yet and may change without notice. Contact support to request access.

Retrieve a paginated history of quiz responses for a specific user.

CLI: teachable-cli v2-list-quiz-responses-for-user. Policy: read.

Native: GET /v2/users/{user_id}/quiz-responses. Version: explicit beta v2. Current source.

user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID. Malformed values return 400; missing users return 404.
lecture_id
Type or constraint
integer
Requirement
Optional
Meaning
Lecture ID filter; returns 404 when the lecture does not exist, 400 when the value is not an integer
course_id
Type or constraint
integer
Requirement
Optional
Meaning
Course ID filter; returns 404 when the course does not exist, 400 when the value is not an integer
sort_by
Type or constraint
string
Requirement
Optional
Meaning
Sort field (submitted_at, updated_at, created_at)
sort_direction
Type or constraint
string
Requirement
Optional
Meaning
Sort direction (asc, desc)
include_answers
Type or constraint
string
Requirement
Optional
Meaning
When true, include the submitted answers object on each quiz response. Omit or set to false to exclude answers (default).
submitted_after
Type or constraint
string
Requirement
Optional
Meaning
ISO8601 datetime; invalid values return 400. Date range between submitted_after and submitted_before cannot exceed 90 days.
submitted_before
Type or constraint
string
Requirement
Optional
Meaning
ISO8601 datetime; invalid values return 400. Date range between submitted_after and submitted_before cannot exceed 90 days.
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number (default: 1, min: 1)
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page (default: 20, min: 1, max: 100)
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_revoke_user_session

Revoke a single user session.

CLI: teachable-cli v2-revoke-user-session. Policy: explicit confirmation.

Native: DELETE /v2/users/{user_id}/sessions/{session_id}. Version: explicit beta v2. Current source.

user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
session_id
Type or constraint
string
Requirement
Required
Meaning
Session ID (UUID)
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_revoke_user_sessions

Revoke all active sessions for a user.

CLI: teachable-cli v2-revoke-user-sessions. Policy: explicit confirmation.

Native: DELETE /v2/users/{user_id}/sessions. Version: explicit beta v2. Current source.

user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_list_user_sessions

Retrieve a paginated list of active sessions for a specific user.

CLI: teachable-cli v2-list-user-sessions. Policy: read.

Native: GET /v2/users/{user_id}/sessions. Version: explicit beta v2. Current source.

user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
last_seen_after
Type or constraint
string
Requirement
Optional
Meaning
ISO8601 datetime; sessions last seen at or after this time. Date range between last_seen_after and last_seen_before cannot exceed 90 days.
last_seen_before
Type or constraint
string
Requirement
Optional
Meaning
ISO8601 datetime; sessions last seen at or before this time. Date range between last_seen_after and last_seen_before cannot exceed 90 days.
page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number (default: 1, min: 1)
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page (default: 25, min: 1, max: 100)
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_delete_user

Delete a single user for the current school.

CLI: teachable-cli v2-delete-user. Policy: explicit confirmation.

Native: DELETE /v2/users/{user_id}. Version: explicit beta v2. Current source.

user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.

v2_get_user

Retrieve a single user by id for the current school.

CLI: teachable-cli v2-get-user. Policy: read.

Native: GET /v2/users/{user_id}. Version: explicit beta v2. Current source.

user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_update_user

Update a single user for the current school.

CLI: teachable-cli v2-update-user. Policy: explicit confirmation.

Native: PATCH /v2/users/{user_id}. Version: explicit beta v2. Current source.

user_id
Type or constraint
integer
Requirement
Required
Meaning
User ID
name
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
email
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
role
Type or constraint
student, owner, author, affiliate
Requirement
Optional
Meaning
Allowed values: student, owner, author, affiliate. Omit to preserve the current role.
allow_marketing_emails
Type or constraint
boolean
Requirement
Optional
Meaning
Optional. When omitted on update, the existing preference is preserved.
author_revenue_share
Type or constraint
number nullable
Requirement
Optional
Meaning
Native field
affiliate_revenue_share
Type or constraint
number nullable
Requirement
Optional
Meaning
Native field
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
email
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
password
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
role
Type or constraint
student, owner, author, affiliate
Requirement
Optional
Meaning
Allowed values: student, owner, author, affiliate. Omit to preserve the current role.
allow_marketing_emails
Type or constraint
boolean
Requirement
Optional
Meaning
Optional. When omitted on update, the existing preference is preserved.
author_revenue_share
Type or constraint
number nullable
Requirement
Optional
Meaning
Native field
affiliate_revenue_share
Type or constraint
number nullable
Requirement
Optional
Meaning
Native field

v2_list_users

Retrieve a paginated list of users for the current school.

CLI: teachable-cli v2-list-users. Policy: read.

Native: GET /v2/users. Version: explicit beta v2. Current source.

page
Type or constraint
integer (minimum=1)
Requirement
Optional
Meaning
Page number (default: 1, min: 1)
per_page
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Items per page (default: 25, min: 1, max: 100)
sort_by
Type or constraint
string
Requirement
Optional
Meaning
Sort key (id, name, email, created_at, updated_at, last_sign_in_at)
sort_direction
Type or constraint
string
Requirement
Optional
Meaning
Sort direction (asc, desc)
name
Type or constraint
string
Requirement
Optional
Meaning
Filter by user name
email
Type or constraint
string
Requirement
Optional
Meaning
Filter by user email
role
Type or constraint
string
Requirement
Optional
Meaning
Filter by user role. Allowed values: owner, author, affiliate, student, custom. Returns empty results for unrecognized values.
created_before
Type or constraint
string
Requirement
Optional
Meaning
Filter users created before this ISO8601 datetime. Date range between created_after and created_before cannot exceed 90 days.
created_after
Type or constraint
string
Requirement
Optional
Meaning
Filter users created after this ISO8601 datetime. Date range between created_after and created_before cannot exceed 90 days.
user_id
Type or constraint
string
Requirement
Optional
Meaning
Filter by user id
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

v2_create_user

Create a single user for the current school.

CLI: teachable-cli v2-create-user. Policy: explicit confirmation.

Native: POST /v2/users. Version: explicit beta v2. Current source.

name
Type or constraint
string
Requirement
Optional
Meaning
Native field
email
Type or constraint
string
Requirement
Optional
Meaning
Native field
role
Type or constraint
student, owner, author, affiliate
Requirement
Optional
Meaning
Allowed values: student, owner, author, affiliate
allow_marketing_emails
Type or constraint
boolean
Requirement
Optional
Meaning
Required when role is 'student'. Optional for other roles.
notes
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
author_revenue_share
Type or constraint
number nullable
Requirement
Optional
Meaning
Required when role is 'author'. Decimal between 0 and 1 (e.g. 0.3 = 30%). Must not be provided for other roles.
affiliate_revenue_share
Type or constraint
number nullable
Requirement
Optional
Meaning
Required when role is 'affiliate'. Decimal between 0 and 1. Must not be provided for other roles.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
payload
Type or constraint
object
Requirement
Optional
Meaning
Complete current native JSON body; cannot mix with native body flags or payload_file.
payload_file
Type or constraint
string (minLength=1)
Requirement
Optional
Meaning
Absolute regular non-symlink native JSON body file, at most1MiB. Cannot mix with payload or body flags.

Native JSON fields below must satisfy their required fields and chosen variants. Use flat body flags, payload OR payload_file. Passwords require owner-private payload_file. Inspect the complete machine schema before effects.

name
Type or constraint
string
Requirement
Required
Meaning
Native field
email
Type or constraint
string
Requirement
Required
Meaning
Native field
password
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
role
Type or constraint
student, owner, author, affiliate
Requirement
Required
Meaning
Allowed values: student, owner, author, affiliate
allow_marketing_emails
Type or constraint
boolean
Requirement
Optional
Meaning
Required when role is 'student'. Optional for other roles.
notes
Type or constraint
string nullable
Requirement
Optional
Meaning
Native field
author_revenue_share
Type or constraint
number nullable
Requirement
Optional
Meaning
Required when role is 'author'. Decimal between 0 and 1 (e.g. 0.3 = 30%). Must not be provided for other roles.
affiliate_revenue_share
Type or constraint
number nullable
Requirement
Optional
Meaning
Required when role is 'affiliate'. Decimal between 0 and 1. Must not be provided for other roles.

list_accounts

Local labels/default/version/auth source availability only. No credential values, paths, provider identity or network.

CLI: teachable-cli list-accounts. Policy: read.

get_operation_schema

Local reviewed native method/path/query/body/scopes/rate limit and pinned schema provenance. No provider access or authority proof.

CLI: teachable-cli get-operation-schema. Policy: read.

operation
Type or constraint
list_enrollments, mark_lecture_complete, list_quiz_responses, get_quiz, list_quizzes, get_video, get_lecture, get_course_progress, get_course, list_courses, create_enrollment, get_pricing_plan, list_pricing_plans, list_transactions, unenroll_user, get_user, update_user, list_users, create_user, get_webhook_events, list_webhooks, v2_get_school_customizations, v2_delete_pricing_plan, v2_get_pricing_plan, v2_update_pricing_plan, v2_list_pricing_plans_for_product, v2_create_pricing_plan_for_product, v2_delete_coupon, v2_get_coupon, v2_update_coupon, v2_list_coupons, v2_create_coupon, v2_list_comments_for_course, v2_get_compliance_settings_for_course, v2_update_compliance_settings_for_course, v2_unenroll_user_from_course, v2_get_user_s_enrollments_for_course, v2_update_course_enrollment, v2_enroll_user_in_course, v2_list_enrollments_for_course, v2_delete_content_attachment_from_lesson_lecture, v2_get_content_attachment_for_lesson_lecture, v2_update_content_attachment_for_lesson_lecture, v2_list_content_attachments_for_lesson_lecture, v2_create_content_attachment_for_lesson_lecture, v2_reorder_content_attachments_in_lesson_lecture, v2_delete_lecture_comment, v2_update_comment_moderation_status, v2_list_comments_for_lecture, v2_create_comment_on_lecture, v2_list_responses_for_lecture_quiz, v2_delete_lecture_quiz, v2_get_lecture_quiz, v2_list_quizzes_for_lecture, v2_mark_lecture_as_not_completed_for_user, v2_get_lecture_completion_status_for_user, v2_mark_lecture_as_completed_for_user, v2_get_video_for_lecture, v2_delete_lecture, v2_get_lecture, v2_update_lecture, v2_list_lectures_for_course, v2_create_lecture_in_section, v2_reorder_lectures_in_section, v2_get_course_section, v2_update_course_section, v2_replace_course_section, v2_list_sections_for_course, v2_create_section_in_course, v2_reorder_sections_in_course, v2_get_course_progress_for_user, v2_get_course, v2_update_course, v2_list_courses, v2_create_course, v2_delete_attachment_from_digital_download, v2_get_attachment_for_digital_download, v2_list_attachments_for_digital_download, v2_create_attachment_for_digital_download, v2_unenroll_user_from_digital_download, v2_get_enrollment_for_digital_download, v2_enroll_user_in_digital_download, v2_list_enrollments_for_digital_download, v2_delete_digital_download, v2_get_digital_download, v2_update_digital_download, v2_list_digital_downloads, v2_create_digital_download, v2_unenroll_user_from_product_collection, v2_get_enrollment_for_product_collection, v2_update_product_collection_enrollment, v2_enroll_user_in_product_collection, v2_list_enrollments_for_product_collection, v2_remove_product_from_product_collection, v2_list_products_in_product_collection, v2_add_product_to_product_collection, v2_delete_product_collection, v2_get_product_collection, v2_update_product_collection, v2_replace_product_collection, v2_list_product_collections, v2_create_product_collection, v2_list_products, v2_get_purchase, v2_list_purchases, v2_get_transaction, v2_list_transactions, v2_create_pre_signed_upload_credentials, v2_list_purchases_for_user, v2_list_quiz_responses_for_user, v2_revoke_user_session, v2_revoke_user_sessions, v2_list_user_sessions, v2_delete_user, v2_get_user, v2_update_user, v2_list_users, v2_create_user
Requirement
Required
Meaning
Native field

preview_school_batch

Validate every exact request and hash order/profile label/schema locally. No native request, credential loading, ownership check or provider preview.

CLI: teachable-cli preview-school-batch. Policy: read.

tasks
Type or constraint
array (minItems=1, maxItems=20)
Requirement
Required
Meaning
One to twenty exact ordered native effects. No signed receipts or mutable payload files. Cannot override account/confirm/output settings.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.

submit_school_batch

Confirmed ordered effects; all validated/hash checked before first request. Stop on first failure with known and unattempted receipts; no retry, rollback or implicit continuation.

CLI: teachable-cli submit-school-batch. Policy: explicit confirmation.

tasks
Type or constraint
array (minItems=1, maxItems=20)
Requirement
Required
Meaning
One to twenty exact ordered native effects. No signed receipts or mutable payload files. Cannot override account/confirm/output settings.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
review_sha256
Type or constraint
string (pattern=^[a-f0-9]{64}$)
Requirement
Required
Meaning
Native field

export_resources

Confirmed reviewed native page/per or page/per_page export into a new exclusive0600 file. Page/item/5MiB budgets and explicit continuation; no signed links followed or binary download. Not an atomic backup.

CLI: teachable-cli export-resources. Policy: explicit confirmation.

operation
Type or constraint
list_courses, list_pricing_plans, list_transactions, list_users, get_webhook_events, v2_list_pricing_plans_for_product, v2_list_coupons, v2_list_comments_for_course, v2_get_user_s_enrollments_for_course, v2_list_enrollments_for_course, v2_list_content_attachments_for_lesson_lecture, v2_list_comments_for_lecture, v2_list_quizzes_for_lecture, v2_list_lectures_for_course, v2_list_sections_for_course, v2_list_courses, v2_list_attachments_for_digital_download, v2_list_enrollments_for_digital_download, v2_list_digital_downloads, v2_list_enrollments_for_product_collection, v2_list_product_collections, v2_list_products, v2_list_purchases, v2_list_transactions, v2_list_purchases_for_user, v2_list_quiz_responses_for_user, v2_list_user_sessions, v2_list_users
Requirement
Required
Meaning
Native field
arguments
Type or constraint
object
Requirement
Optional
Meaning
Current native list arguments; cannot override profile/policy/output.
account
Type or constraint
string
Requirement
Optional
Meaning
Exact private school profile label; not a provider identity or authorization proof.
confirm
Type or constraint
boolean
Requirement
Optional
Meaning
Explicit approval for this exact provider effect or local private-file operation.
start_offset
Type or constraint
integer (minimum=0, maximum=99)
Requirement
Optional
Meaning
Native field
max_pages
Type or constraint
integer (minimum=1, maximum=100)
Requirement
Optional
Meaning
Native field
max_items
Type or constraint
integer (minimum=1, maximum=10000)
Requirement
Optional
Meaning
Native field
output_file
Type or constraint
string (minLength=1)
Requirement
Required
Meaning
Native field

Writing safely

Every provider or private-output effect requires confirm:true in MCP or --confirm in CLI. Read-only hides and directly refuses effects, and TEACHABLE_ALLOW_DESTRUCTIVE=0 refuses them even with approval. Local confirmation does not supply provider authorization, customer permission, marketing consent or financial entitlement.

Read the intended records and inspect the operation schema before preparing effects. Course publishing, enrollment access, user deletion, session revocation and pricing changes can affect people immediately. Only carry out the action the user asked for. Teachable determines whether a key, role, scope and school plan allow it.

No operation retries automatically. A timeout or malformed receipt can leave an unknown outcome; inspect native state before deliberately repeating. Local pacing defaults to one second and a 30-second request timeout. Other processes still share provider quotas.

API versions and native workflows

Stable v1 remains under /v1; opt-in v2 is request-access beta under /v2. Set TEACHABLE_ENABLE_V2=1 to expose v2_ tasks and configure an explicit api_version:"2" profile. Merely enabling discovery does not grant access or change a version 1 profile.

V1 enrollment creation is POST /v1/enroll with flat user_id and course_id; it is not the legacy /enrollments wrapper. User creation uses flat email, name, password and src, with no guessed role field. Pricing lists use /v1/pricing_plans. Course enrollment listing has native enrolled_in_after/enrolled_in_before/sort_direction filters, without invented page/per arguments.

bash
teachable-cli get-operation-schema --operation create_enrollment --agent
teachable-cli create-enrollment --course-id 7 --user-id 9 --account intended-school --confirm --agent
teachable-cli v2-list-lectures-for-course --course-id 7 --account intended-beta-school --agent

V2 route IDs retain the reviewed schema's types; some are strings. The dedicated CLI parses them accordingly. For user creation, explicit student marketing consent is required, and author/affiliate shares are native decimal fractions between 0 and 1. User passwords can only be read from a private payload file; there is no password flag or inline-payload password route.

V2 coupon deletion archives a multiple-use coupon rather than deleting its historical record. Coupon creation has mutually exclusive scope shapes, and new-payment schools have additional expiry, inventory and discount requirements. Some coupon updates on those schools only propagate name. Review the full native description and coupon reference; this package cannot infer the school's payments entitlement.

The v2_create_pre_signed_upload_credentials workflow here requests signed credentials into a new private file. Transfer bytes according to the native storage receipt separately, then use a deliberate content attachment/update step. No byte uploader or automatic course publishing is advertised.

Several accounts and reviewed batches

TEACHABLE_ACCOUNTS is a private array of unique named school profiles: name, api_version (1 default) and one api_key or credentials_file source. Named profiles never inherit global keys. TEACHABLE_DEFAULT_ACCOUNT and --account select exact labels. Local discovery exposes source availability and version, not keys, paths, provider identity or ownership.

Preview validates 1–20 exact ordered native effects locally. It never loads credentials or contacts a school. Mutable payload files and private output operations are excluded, and nested account/confirm/output overrides are refused.

bash
teachable-cli preview-school-batch --tasks '{"tool":"create_enrollment","arguments":{"course_id":7,"user_id":9}}' --account intended-school --agent
teachable-cli submit-school-batch --tasks '{"tool":"create_enrollment","arguments":{"course_id":7,"user_id":9}}' --review-sha256 REVIEWED_64_CHARACTER_HASH --account intended-school --confirm --agent

The repeatable JSON task flag forms the tasks array. Use the actual hash from your preview. It binds prepared request content, order, profile label, version and pinned schema. It does not bind credential file contents or provider state, expire or guarantee single-use execution. Re-review after state or credential changes.

Execution checks all requests and the hash before fetching. It stops at the first failure with known receipts, the failed index and unattempted indices, preserving native error status. There is no transaction, rollback or implicit continuation.

Pagination and private exports

Native v1 pages use page/per and v2 pages use page/per_page, starting at 1. Response counters differ: v1 meta.number_of_pages and resource arrays, v2 meta.total_pages and data arrays. Only the 28 reviewed contracts with the complete pagination shape are eligible for export; course-enrollment v1 listing is excluded.

bash
teachable-cli export-resources --operation list_courses --arguments '{"page":1,"per":100}' --max-pages 10 --max-items 1000 --output-file /absolute/private/courses.json --account intended-school --confirm --agent

Defaults are ten pages and 1,000 items; maxima are 100 pages, 10,000 items and 5 MiB. Native page size is capped locally at 100. Partial pages return a native page plus start_offset, so continuation does not silently discard remaining rows. Wrong counters, empty intermediate pages and changed offsets refuse completion claims.

V1 users document search_after for more than 10,000 records. The helper does not invent a cursor; it caps that window and preserves explicitly supplied arguments for deliberate continuation. A complete result applies only to the requested filters and provider response window.

Output uses a NEW absolute path, exclusive creation and POSIX 0600 permissions. Existing files and target symlinks are never overwritten. Failures remove the partial new file. Customer names/emails remain private metadata even after credential/signed-URL redaction. Exports are not atomic snapshots, binary downloads or guaranteed backups while data changes.

How it works

The SDK stdio server and CLI in-memory bridge execute the same tools and guard. Tool schemas derive from reviewed native parameters/body variants; Ajv validates arguments and bodies before fetching. Method/path/version allowlists prevent arbitrary-host key forwarding and silent API fallback. Path-level and operation-level parameters both matter.

Five local helpers provide profile discovery, contract inspection, review/submit batches and bounded metadata exports. No community runtime or private legacy Git history is copied. The provenance file pins the transformed schema and the two original source snapshot hashes.

bash
npm ci
npm run typecheck
npm run build
npm test
npm run check:counts
npm run check:discovery
npm run sync:api -- --check
npm run build:mcpb

CI covers Node 22/24 on macOS, Windows and Linux plus desktop packaging. These checks establish local behavior and artifacts. School account outcomes, actual GUI installation and completed Codex task/token measurements remain separately tracked. The sync check verifies the pinned snapshot; it never silently regenerates an unreviewed upstream contract.

Your data

This is local software with no hosted service or telemetry. Admin keys are sent as apiKey only to developers.teachable.com. Redirects are refused. Credentials come from private runtime settings or bounded owner-private files. Named profiles never inherit another source.

Known keys/passwords and credential-like or signed-URL fields are redacted from ordinary output and errors. Raw upload credentials are intentionally saved only to the requested new private receipt file. The helper never follows those storage URLs. Emails, names, notes, transactions and other ordinary school fields are not anonymized; keep them private.

Provider text and URLs are untrusted data, not instructions. Best-effort audit logs contain static guard decisions, without payloads or credentials. They are not account-action ledgers. Uninstalling does not revoke keys or reverse changes; revoke keys in Teachable and restart runtimes.

Official and community comparison

Teachable's official remote MCP already supports documentation search and authenticated account requests. Credential-free discovery found seven v1/five v2 meta-tools, including generic execute-request. These are interface counts, not native API coverage. Official Admin apiKey and separately obtained end-user OAuth bearer are distinct; the remote server does not run or refresh the end-user OAuth flow.

Admin API tasks
This companion
21 stable plus 97 explicit beta native contracts
Existing alternatives
Official generic endpoint execution and docs search
End-user OAuth
This companion
Not implemented
Existing alternatives
Official MCP accepts a separately obtained bearer
Terminal
This companion
Dedicated schemas/help over shared handlers
Existing alternatives
Generic MCP terminal clients also exist
School selection
This companion
Exact isolated profile label and API version
Existing alternatives
Credential/client setup remains the user's responsibility
Approval
This companion
Per-call confirmation, direct read-only refusal
Existing alternatives
Provider permissions and client approvals remain separate
Repeated effects
This companion
Exact local batch review, stop-on-failure receipts
Existing alternatives
No transaction/state-lock claim
Export
This companion
Bounded private native-page export and offset resume
Existing alternatives
No atomic backup or binary download claim
Beta
This companion
Hidden default, explicitly pinned version, no fallback
Existing alternatives
Provider request-access and new scoped key may be required
Efficiency
This companion
No matched completed task benchmark yet
Existing alternatives
Tool counts are not token savings

The pinned ahmedrowaihi/teachable-mcp-server source at 5d722b2987a8b745d50e2d49f58589ca51a10002 declares 21 v1 operations and one stdio server binary, without task CLI dispatch in the reviewed source. That is not proof no CLI exists elsewhere. Generic wong2/mcp-cli is a terminal alternative; its reviewed source already supports remote interactive OAuth. See COMPARISON.md for evidence and limits.

Versions and migration

ComponentVersion or evidence
Package and desktop2.0.0
Node runtime>=22
Native contractsStable v1 and request-access beta v2, checked 2026-10-04
Native operations21 v1 / 97 v2
Shared helpers5
Legacy compatibility11 supported names retained; 3 unsupported v1 routes retired
Default discovery26 tasks / 19 reads / 7 confirmed effects
Explicit beta discovery123 tasks / 64 reads / 59 confirmed effects
Provider, GUI and task-token outcomesSeparate acceptance, never inferred from fixtures

Upgrade scripts by inspecting schema/--help. The old create_enrollment path/wrapper, create_user wrapper, course-scoped pricing list and guessed pagination are corrected. list_lectures becomes an explicitly enabled beta lecture-list task; there is no silent v1 fallback. create_webhook/delete_webhook are absent from reviewed current Admin contracts and are retired.

All effects now require confirmation. Passwords need private payload_file input; signed upload credentials need a new private output_file. Named profiles pin versions and never inherit global keys. Preserve the older private history separately. CHANGELOG.md records the breaking refresh.

Environment variables and removal

SettingMeaning
TEACHABLE_API_KEYPrivate existing Admin key, one source
TEACHABLE_CREDENTIALS_FILEAbsolute owner-private regular JSON with api_key, at most64KiB
TEACHABLE_ACCOUNTSPrivate isolated named-profile array
TEACHABLE_DEFAULT_ACCOUNTExact default label
TEACHABLE_API_VERSIONSingle-profile version1 default, or explicit2
TEACHABLE_ENABLE_V21/true exposes beta tasks; provider access still required
TEACHABLE_READ_ONLY1/true hides and directly refuses effects
TEACHABLE_ALLOW_DESTRUCTIVE0/false refuses even confirmed effects
TEACHABLE_AUDIT_LOGOptional best-effort static guard decision log
TEACHABLE_REQUEST_TIMEOUT_MS30000 default; local range100–300000
TEACHABLE_MIN_REQUEST_INTERVAL_MS1000 default; local range0–10000

No arbitrary base-URL setting is supported. Named profiles ignore single-profile credential/version globals. To update, install @latest, inspect the changelog and reconnect. Check that package, desktop manifest and release tag versions match.

Remove the MCP entry through the client settings or codex mcp remove teachable, and uninstall the global package with npm uninstall -g @thenavidm/teachable-mcp-cli. Remove a desktop extension separately. Neither removal revokes provider keys or reverses account effects. Keep any private files under your own retention policy.

Risks

School keys may authorize changes that affect access, publishing and revenue. Local confirmation does not establish entitlement, customer consent or intended school identity. Beta contracts may change without notice, and a package update requires reviewed native changes.

Requests/body files are capped locally at 1 MiB and responses/exports/private receipts at 5 MiB. Local pacing and timeout are process controls rather than global provider quotas. Ambiguous failures are not retried automatically. A native receipt is not independent delivery, publication, settlement or enrollment-access proof.

Production SDK/Ajv dependencies are separate from the build-only desktop packer. The reviewed packer currently depends on node-forge1.4.0 with an unpatched signature-verification advisory; it is excluded from npm runtime and bundled production dependencies. Packaging here does not sign or verify third-party bundles. See security advisory. Do not claim a clean full development dependency audit.

Troubleshooting

SymptomCheck
Missing configSelect exactly one private key source in the launching runtime
API401/403Check revocation, key permissions, school eligibility and selected version
Beta hiddenEnable beta explicitly and obtain provider request access
Version mismatchChoose an exact matching profile; no fallback is attempted
429Respect provider quotas; inspect effects before deliberate retry
Unknown flagInspect schema/help; guessed legacy wrappers are refused
Password refusedUse an owner-private payload_file, outside repositories
Existing outputSelect a new private path; the helper never overwrites
Invalid paginationInspect native filters/counters; no completeness claim is made
Malformed receipt/timeoutInspect native state before repeating an effect
GUI cannot find npxCheck Node/PATH or use absolute executable and installed entry point

Report sanitized reproductions through issues. Use private security reporting for sensitive cases. Never attach keys, user-password files, signed receipts or school exports.

About the author

Navid Moazzez is a leading AI business strategist, and the host of the AI Creator Summit, watched by 100,000+ creators. He helps creators and founders master AI and build their own AI Operating System (AI OS) to automate their business and life. He creates useful free tools, MCP servers and CLIs that creators and founders can use in their own workflows.

Links

© 2026 Navid Media. Made with ❤️ by Navid Moazzez.

Teachable MCP server & CLI FAQs

Official alternatives, stable/beta setup, approvals, privacy and verified behavior.

A local stdio program for reviewed Teachable Admin API tasks.

Stable v 1 exposes 26 tasks:21 native operations and 5 local helpers.

Explicit beta opt-in exposes 123 total tasks, adding 97 v 2 Admin operations.

The CLI calls the same handlers.

The same discovered tools as terminal commands, with schema-derived help, JSON output and stable exit codes.

For example, list_courses is teachable-cli list-courses.

No separate implementation or undocumented legacy request wrappers.

Yes.

Its hosted MCP can search documentation and execute authenticated API operations.

The credential-free discovery review found seven v 1 and five v 2 meta-tools, including generic execute-request.

Those counts do not describe account-action coverage.

See the official MCP guide.

Use the dedicated shared CLI, exact private school/version selection, local ordered batch reviews and bounded private exports.

The official remote server is a valid alternative for hosted access and documentation search.

A CLI or larger discovery count alone does not establish superiority.

Stable v 1 is the default.

Beta v 2 requires provider request-access approval, appropriate scoped credentials, TEACHABLE_ENABLE_V 2=1 and an explicit version 2 profile. v 2_ commands never silently fall back to v 1, or vice versa.

The school owner uses Settings > API > Create API Key, chooses a name and appropriate permissions, then creates the key.

API access remains subject to provider plans and eligibility.

Revoke through the same API settings.

Never put the key in a repo or chat.

No. teachable-cli login prints setup instructions only.

This companion accepts existing Admin API keys and does not implement end-user OAuth consent, token exchange or refresh.

The official MCP supports separately obtained OAuth tokens for current_user calls.

Local stdio clients including Codex, Claude Code, Claude Desktop, Cursor, VS Code/Copilot, Windsurf, Zed and Gemini CLI can launch the server.

INSTALL.md also covers OpenCode, Copilot CLI, OpenClaw, Antigravity and Hermes.

Node 22+ is required; macOS, Windows and Linux are declared.

Actual GUI installation is a separate check.

Download teachable-2.0.0.mcpb from GitHub Releases and use a supported Claude Desktop Extensions screen.

Choose one private key source.

Stable version 1 is the default; enable beta and version 2 only after obtaining access.

Bundled production dependencies do not include a Node runtime.

TEACHABLE_ACCOUNTS holds unique named profiles with a pinned api_version and one api_key or credentials_file source. --account selects an exact label.

Profiles do not inherit global credentials.

The label itself does not establish school identity or resource ownership.

TEACHABLE_READ_ONLY=1 hides and directly refuses all effects:19 reads in stable discovery, or 64 reads when beta is enabled.

It is a local policy, not a reduction of the provider key permissions, and does not control other clients.

All provider mutations and private output operations require --confirm in CLI or confirm:true in MCP.

Stable mode has 7 effects; beta-enabled mode has 59.

This includes enrollment/user changes, batch execution, private export and upload-credential requests. --yes and --agent never approve an effect.

Beta student creation requires an explicit allow_marketing_emails boolean.

False remains false; local confirm is unrelated to marketing consent.

User role and revenue-share conditions must satisfy the native contract, and provider entitlements remain separate.

Only through an absolute owner-private payload_file containing the native JSON body.

There is no password command flag, and inline payload passwords are refused.

Known passwords and API keys are redacted from ordinary output.

Keep the payload outside repositories and restrict Windows ACLs separately.

No.

Preview validates up to 20 ordered native requests and hashes order, selected profile label, API version and pinned schema.

Submit requires the identical review hash and stops at the first failure.

No state lock, credential binding, rollback, expiry or single-use guarantee is claimed.

No.

Only 28 reviewed list contracts support this helper.

It saves bounded filtered native metadata with explicit page/item/byte budgets and page/offset continuation.

Other customer fields remain private data.

The result is not an atomic school backup or binary download.

The reviewed beta upload operation creates signed upload credentials in a new private file.

It does not transfer bytes or attach/publish content.

Native POST/PUT storage details remain in the private receipt, and the subsequent upload/attachment process needs separate validation.

Those old handlers used routes absent from current reviewed Admin contracts, so they are retired.

Stable v 1 supports listing webhooks and their events.

Configure webhook creation/removal through supported provider administration; do not guess API endpoints.

The software is free under the preserved AGPL-3.0 license.

Provider fees and plans still apply.

No completed matched Codex task/token benchmark has been measured for this integration.

Schema counts and character estimates are not savings; help, outputs and retries also use context.

The old private 14-handler MCP gains shared CLI/MCP surfaces, current native validation, private profiles, mandatory effect approval, reviewed batches, exports and a desktop bundle.

Eleven supported legacy names remain with corrected arguments. list_lectures has an explicit beta replacement; unsupported webhook creation/deletion are retired.

Private legacy Git history is excluded.

Navid Moazzez

AI business strategist & AI OS builder

Navid Moazzez helps creators and founders master AI and build their own AI Operating System (AI OS) to automate their business and life.

Navid.me is reader-supported. When you buy through links on this site, I may earn an affiliate commission. Learn more.

More MCP servers & CLIs

Darmowy newsletter o AI

Najbardziej praktyczny newsletter o AI dla założycieli

Co tydzień sprawdzone strategie AI, wyselekcjonowane narzędzia i systemy krok po kroku, dzięki którym zwiększysz zasięgi, stworzysz lepsze treści i zbudujesz dochodowy biznes twórcy.

Bez lania wody, bez zapychaczy, bez ściemy. Tylko pięć minut w tygodniu, które mogą przenieść Twój biznes online i życie na wyższy poziom.

P.S. Zapisz się teraz i zyskaj darmowy dostęp do mojego kompletnego przewodnika po narzędziach AI dla twórców.

Uwielbiany przez ponad 10 000 czytelników