npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@thenavidm/teachable-mcp-cli

v3.0.1

Published

Teachable shared CLI and local MCP: stable v1, explicit beta v2, isolated school profiles, reviewed batches and bounded private exports.

Readme

Teachable MCP Server & CLI

npm CI License YouTube X LinkedIn

A Teachable CLI and local MCP for school workflows: stable v1 by default, explicit beta v2, private school profiles, confirmed effects, reviewed batches and bounded private exports.

One install, one implementation on both surfaces. Teachable's official remote MCP already executes account requests and searches docs; this companion adds specific local workflows. It does not implement end-user OAuth.

Built and maintained by Navid Moazzez. Built on Slipway, which turns one definition of each tool into the MCP server and the CLI, so validation, approval and redaction are the same on both.

Two ways to use it

Command line

teachable-cli tools
teachable-cli list-courses --page 1 --per 5 --agent
teachable-cli get-operation-schema --operation create_enrollment --agent
teachable-cli <command> --help

Use it directly or through a shell agent after configuring the intended private school. Effects require explicit --confirm; presentation flags never grant approval.

MCP server, for your AI app

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

A supported client launches the local stdio server and discovers the same tasks. Forward private settings through the client runtime. Where the client can ask, a person approves every effect: Claude Code shows its own prompt for each call, and a client that can show forms asks with an approval form. INSTALL.md covers clients, OS paths, desktop and Docker setup.

Which one

| Where you work | Surface | | --- | --- | | Codex or another shell agent | Dedicated CLI, local MCP or both | | Supported local MCP app | Local stdio MCP; extension where supported | | Script or CI task | CLI with private runtime credentials | | URL-only hosted client | Teachable's official remote MCP is an alternative |

Features

| Capability | CLI command | MCP tool | | --- | --- | --- | | Show Course Enrollments | teachable-cli list-enrollments | list_enrollments | | Mark Lecture Complete | teachable-cli mark-lecture-complete | mark_lecture_complete | | Show Quiz Responses | teachable-cli list-quiz-responses | list_quiz_responses | | Show Quiz | teachable-cli get-quiz | get_quiz | | List Quizzes | teachable-cli list-quizzes | list_quizzes | | Show Video | teachable-cli get-video | get_video | | Show Lecture | teachable-cli get-lecture | get_lecture | | Course Progress | teachable-cli get-course-progress | get_course_progress | | Show Course | teachable-cli get-course | get_course | | List Courses | teachable-cli list-courses | list_courses | | Enroll User | teachable-cli create-enrollment | create_enrollment | | Show Pricing Plans | teachable-cli get-pricing-plan | get_pricing_plan | | List Pricing Plans | teachable-cli list-pricing-plans | list_pricing_plans | | List Transactions | teachable-cli list-transactions | list_transactions | | Unenroll User | teachable-cli unenroll-user | unenroll_user | | Show User | teachable-cli get-user | get_user | | Update User | teachable-cli update-user | update_user | | List Users | teachable-cli list-users | list_users | | Create User | teachable-cli create-user | create_user | | Show Webhook Events | teachable-cli get-webhook-events | get_webhook_events | | List Webhooks | teachable-cli list-webhooks | list_webhooks | | Get school customizations | teachable-cli v2-get-school-customizations | v2_get_school_customizations | | Delete a pricing plan | teachable-cli v2-delete-pricing-plan | v2_delete_pricing_plan | | Get a pricing plan | teachable-cli v2-get-pricing-plan | v2_get_pricing_plan | | Update a pricing plan | teachable-cli v2-update-pricing-plan | v2_update_pricing_plan | | List pricing plans for a product | teachable-cli v2-list-pricing-plans-for-product | v2_list_pricing_plans_for_product | | Create a pricing plan for a product | teachable-cli v2-create-pricing-plan-for-product | v2_create_pricing_plan_for_product | | Delete a coupon | teachable-cli v2-delete-coupon | v2_delete_coupon | | Get a coupon | teachable-cli v2-get-coupon | v2_get_coupon | | Update a coupon | teachable-cli v2-update-coupon | v2_update_coupon | | List all coupons | teachable-cli v2-list-coupons | v2_list_coupons | | Create a coupon | teachable-cli v2-create-coupon | v2_create_coupon | | List comments for a course | teachable-cli v2-list-comments-for-course | v2_list_comments_for_course | | Get compliance settings for a course | teachable-cli v2-get-compliance-settings-for-course | v2_get_compliance_settings_for_course | | Update compliance settings for a course | teachable-cli v2-update-compliance-settings-for-course | v2_update_compliance_settings_for_course | | Unenroll a user from a course | teachable-cli v2-unenroll-user-from-course | v2_unenroll_user_from_course | | Get a user's enrollments for a course | teachable-cli v2-get-user-s-enrollments-for-course | v2_get_user_s_enrollments_for_course | | Update a course enrollment | teachable-cli v2-update-course-enrollment | v2_update_course_enrollment | | Enroll a user in a course | teachable-cli v2-enroll-user-in-course | v2_enroll_user_in_course | | List enrollments for a course | teachable-cli v2-list-enrollments-for-course | v2_list_enrollments_for_course | | Delete content (attachment) from a lesson (lecture) | teachable-cli v2-delete-content-attachment-from-lesson-lecture | v2_delete_content_attachment_from_lesson_lecture | | Get content (attachment) for a lesson (lecture) | teachable-cli v2-get-content-attachment-for-lesson-lecture | v2_get_content_attachment_for_lesson_lecture | | Update content (attachment) for a lesson (lecture) | teachable-cli v2-update-content-attachment-for-lesson-lecture | v2_update_content_attachment_for_lesson_lecture | | List content (attachments) for a lesson (lecture) | teachable-cli v2-list-content-attachments-for-lesson-lecture | v2_list_content_attachments_for_lesson_lecture | | Create content (attachment) for a lesson (lecture) | teachable-cli v2-create-content-attachment-for-lesson-lecture | v2_create_content_attachment_for_lesson_lecture | | Reorder content (attachments) in a lesson (lecture) | teachable-cli v2-reorder-content-attachments-in-lesson-lecture | v2_reorder_content_attachments_in_lesson_lecture | | Delete a lecture comment | teachable-cli v2-delete-lecture-comment | v2_delete_lecture_comment | | Update comment moderation status | teachable-cli v2-update-comment-moderation-status | v2_update_comment_moderation_status | | List comments for a lecture | teachable-cli v2-list-comments-for-lecture | v2_list_comments_for_lecture | | Create a comment on a lecture | teachable-cli v2-create-comment-on-lecture | v2_create_comment_on_lecture | | List responses for a lecture quiz | teachable-cli v2-list-responses-for-lecture-quiz | v2_list_responses_for_lecture_quiz | | Delete a lecture quiz | teachable-cli v2-delete-lecture-quiz | v2_delete_lecture_quiz | | Get a lecture quiz | teachable-cli v2-get-lecture-quiz | v2_get_lecture_quiz | | List quizzes for a lecture | teachable-cli v2-list-quizzes-for-lecture | v2_list_quizzes_for_lecture | | Mark lecture as not completed for a user | teachable-cli v2-mark-lecture-as-not-completed-for-user | v2_mark_lecture_as_not_completed_for_user | | Get lecture completion status for a user | teachable-cli v2-get-lecture-completion-status-for-user | v2_get_lecture_completion_status_for_user | | Mark lecture as completed for a user | teachable-cli v2-mark-lecture-as-completed-for-user | v2_mark_lecture_as_completed_for_user | | Get video for a lecture | teachable-cli v2-get-video-for-lecture | v2_get_video_for_lecture | | Delete a lecture | teachable-cli v2-delete-lecture | v2_delete_lecture | | Get a lecture | teachable-cli v2-get-lecture | v2_get_lecture | | Update a lecture | teachable-cli v2-update-lecture | v2_update_lecture | | List lectures for a course | teachable-cli v2-list-lectures-for-course | v2_list_lectures_for_course | | Create a lecture in a section | teachable-cli v2-create-lecture-in-section | v2_create_lecture_in_section | | Reorder lectures in a section | teachable-cli v2-reorder-lectures-in-section | v2_reorder_lectures_in_section | | Get a course section | teachable-cli v2-get-course-section | v2_get_course_section | | Update a course section | teachable-cli v2-update-course-section | v2_update_course_section | | Replace a course section | teachable-cli v2-replace-course-section | v2_replace_course_section | | List sections for a course | teachable-cli v2-list-sections-for-course | v2_list_sections_for_course | | Create a section in a course | teachable-cli v2-create-section-in-course | v2_create_section_in_course | | Reorder sections in a course | teachable-cli v2-reorder-sections-in-course | v2_reorder_sections_in_course | | Get course progress for a user | teachable-cli v2-get-course-progress-for-user | v2_get_course_progress_for_user | | Get a course | teachable-cli v2-get-course | v2_get_course | | Update a course | teachable-cli v2-update-course | v2_update_course | | List all courses | teachable-cli v2-list-courses | v2_list_courses | | Create a course | teachable-cli v2-create-course | v2_create_course | | Delete an attachment from a digital download | teachable-cli v2-delete-attachment-from-digital-download | v2_delete_attachment_from_digital_download | | Get an attachment for a digital download | teachable-cli v2-get-attachment-for-digital-download | v2_get_attachment_for_digital_download | | List attachments for a digital download | teachable-cli v2-list-attachments-for-digital-download | v2_list_attachments_for_digital_download | | Create an attachment for a digital download | teachable-cli v2-create-attachment-for-digital-download | v2_create_attachment_for_digital_download | | Unenroll a user from a digital download | teachable-cli v2-unenroll-user-from-digital-download | v2_unenroll_user_from_digital_download | | Get an enrollment for a digital download | teachable-cli v2-get-enrollment-for-digital-download | v2_get_enrollment_for_digital_download | | Enroll a user in a digital download | teachable-cli v2-enroll-user-in-digital-download | v2_enroll_user_in_digital_download | | List enrollments for a digital download | teachable-cli v2-list-enrollments-for-digital-download | v2_list_enrollments_for_digital_download | | Delete a digital download | teachable-cli v2-delete-digital-download | v2_delete_digital_download | | Get a digital download | teachable-cli v2-get-digital-download | v2_get_digital_download | | Update a digital download | teachable-cli v2-update-digital-download | v2_update_digital_download | | List all digital downloads | teachable-cli v2-list-digital-downloads | v2_list_digital_downloads | | Create a digital download | teachable-cli v2-create-digital-download | v2_create_digital_download | | Unenroll a user from a product collection | teachable-cli v2-unenroll-user-from-product-collection | v2_unenroll_user_from_product_collection | | Get an enrollment for a product collection | teachable-cli v2-get-enrollment-for-product-collection | v2_get_enrollment_for_product_collection | | Update a product collection enrollment | teachable-cli v2-update-product-collection-enrollment | v2_update_product_collection_enrollment | | Enroll a user in a product collection | teachable-cli v2-enroll-user-in-product-collection | v2_enroll_user_in_product_collection | | List enrollments for a product collection | teachable-cli v2-list-enrollments-for-product-collection | v2_list_enrollments_for_product_collection | | Remove a product from a product collection | teachable-cli v2-remove-product-from-product-collection | v2_remove_product_from_product_collection | | List products in a product collection | teachable-cli v2-list-products-in-product-collection | v2_list_products_in_product_collection | | Add a product to a product collection | teachable-cli v2-add-product-to-product-collection | v2_add_product_to_product_collection | | Delete a product collection | teachable-cli v2-delete-product-collection | v2_delete_product_collection | | Get a product collection | teachable-cli v2-get-product-collection | v2_get_product_collection | | Update a product collection | teachable-cli v2-update-product-collection | v2_update_product_collection | | Replace a product collection | teachable-cli v2-replace-product-collection | v2_replace_product_collection | | List all product collections | teachable-cli v2-list-product-collections | v2_list_product_collections | | Create a product collection | teachable-cli v2-create-product-collection | v2_create_product_collection | | List all products | teachable-cli v2-list-products | v2_list_products | | Get a purchase | teachable-cli v2-get-purchase | v2_get_purchase | | List purchases | teachable-cli v2-list-purchases | v2_list_purchases | | Get a transaction | teachable-cli v2-get-transaction | v2_get_transaction | | List transactions | teachable-cli v2-list-transactions | v2_list_transactions | | Create pre-signed upload credentials | teachable-cli v2-create-pre-signed-upload-credentials | v2_create_pre_signed_upload_credentials | | List purchases for a user | teachable-cli v2-list-purchases-for-user | v2_list_purchases_for_user | | List quiz responses for a user | teachable-cli v2-list-quiz-responses-for-user | v2_list_quiz_responses_for_user | | Revoke a user session | teachable-cli v2-revoke-user-session | v2_revoke_user_session | | Revoke all user sessions | teachable-cli v2-revoke-user-sessions | v2_revoke_user_sessions | | List user sessions | teachable-cli v2-list-user-sessions | v2_list_user_sessions | | Delete a user | teachable-cli v2-delete-user | v2_delete_user | | Get a user | teachable-cli v2-get-user | v2_get_user | | Update a user | teachable-cli v2-update-user | v2_update_user | | List users | teachable-cli v2-list-users | v2_list_users | | Create a user | teachable-cli v2-create-user | v2_create_user | | List private school profiles | teachable-cli list-accounts | list_accounts | | Inspect native contract | teachable-cli get-operation-schema | get_operation_schema | | Review ordered school effects | teachable-cli preview-school-batch | preview_school_batch | | Execute reviewed school effects | teachable-cli submit-school-batch | submit_school_batch | | Export bounded private metadata | teachable-cli export-resources | export_resources |

Contents

1. 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.

2. 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.

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.

3. 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.

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. teachable-cli install <client> writes the entry for Claude Code, Codex, Claude Desktop, Cursor, VS Code or Gemini CLI in that client's own format; add --dry-run to see it first. The desktop release is teachable-3.0.0.mcpb; use the supported host Extensions screen. It bundles production JavaScript dependencies, while the host must supply a compatible Node runtime.

4. 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. --dry-run checks a command and prints what would run, without running it. --yes never grants effect approval. Errors go to stderr as one JSON object with error, code and, where it helps, hint.

| Exit | Meaning | | --- | --- | | 0 | Successful command | | 1 | Unexpected error, worth an issue | | 2 | Usage, invalid arguments or refused effect | | 3 | Resource not found | | 4 | Provider authentication/permission failure | | 5 | Other API or network failure | | 7 | Provider rate limit | | 10 | Missing or invalid local configuration |

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.

5. 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.

| Mode | Discovered tasks | Read operations | Confirmed effects | | --- | --- | --- | --- | | Stable v1 default | 26 | 19 | 7 | | Stable read-only | 19 | 19 | 0 | | Explicit beta enabled | 123 | 64 | 59 | | Beta enabled read-only | 64 | 64 | 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.

Measured 2026-10-04, 2.0.1 against 3.0.0, with tasks that need no school account, so they measure the tools' own cost rather than provider responses:

| What | 2.0.1 | 3.0.0 | | --- | --- | --- | | Claude Code 2.1.286, every tool loaded (ENABLE_TOOL_SEARCH=false) | 12,576 and 12,579 tokens | 12,548 and 12,550 tokens | | Claude Code, default tool search | 753 and 757 tokens | 754 and 757 tokens | | SKILL.md, read once in Claude Code | 1,232 and 1,227 tokens | 1,258 and 1,259 tokens | | Codex 0.159.3 over MCP: preview one enrollment batch, reply with its hash | 77,218 and 77,222 input tokens | 77,266 and 77,274 input tokens | | Codex over the CLI, the same task, median of five runs | 166,358 input tokens; a failed command in every run | 147,386 input tokens; no failed commands |

Each Claude Code number is one short prompt with and without the server or the skill, so the difference is exactly what Claude Code sends. Codex ran gpt-6.1-sol with approval policy never and a read-only sandbox, and its numbers are total input tokens from codex exec --json. Over MCP, the 48 extra Codex tokens come from the standard confirm wording: putting the old wording back removed them. Over the CLI, 2.0.1 rejected the tasks as a JSON array, so the model retried, while 3.0.0 accepted them and which found the command. The skill's one-line description is unchanged. No schema-character estimate or borrowed benchmark is published as savings.

6. 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | course_id | integer (minimum=1, format=int32) | Required | Return enrollments for a specific course by the unique course ID. | | enrolled_in_after | string (format=date-time) | Optional | Search for students who are enrolled after a specific date/time. Formatted in ISO8601. | | enrolled_in_before | string (format=date-time) | Optional | Search for students who are enrolled before a specific date/time. Formatted in ISO8601. | | sort_direction | asc, desc | Optional | Enrollments are sorted by the 'enrolled_at' datetime. You can choose the direction by including the sort_direction param. | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | course_id | integer (minimum=1, format=int32) | Required | The unique course ID that contains the lecture. | | lecture_id | integer (minimum=1, format=int32) | Required | The unique lecture ID. | | user_id | integer (format=int32) | Optional | The unique ID of the user. | | account | string | Optional | Exact private school profile label; not a provider identity or authorization proof. | | confirm | boolean | Optional | Set true only when the user asked for exactly this action. | | payload | object | Optional | Complete current native JSON body; cannot mix with native body flags or payload_file. | | payload_file | string (minLength=1) | Optional | Absolute regular non-symlink native JSON body file, at most 1 MiB. 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.

| Native JSON field | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | user_id | integer (format=int32) | Required | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | course_id | integer (minimum=1, format=int32) | Required | Return results by unique course ID that contains the lecture. | | lecture_id | integer (minimum=1, format=int32) | Required | Return results by unique lecture ID. | | quiz_id | integer (minimum=1, format=int32) | Required | Return results by unique quiz attachment ID. | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | course_id | integer (minimum=1, format=int32) | Required | Return results by unique course ID that contains the lecture. | | lecture_id | integer (minimum=1, format=int32) | Required | Return results by unique lecture ID. | | quiz_id | integer (minimum=1, format=int32) | Required | Return results by unique quiz attachment ID. | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | course_id | integer (minimum=1, format=int32) | Required | Return results by unique course ID that contains the lecture. | | lecture_id | integer (minimum=1, format=int32) | Required | Return results by unique lecture ID. | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | course_id | integer (minimum=1, format=int32) | Required | Return results by unique course ID that contains the lecture. | | lecture_id | integer (minimum=1, format=int32) | Required | Return results by unique lecture ID. | | video_id | integer (minimum=1, format=int32) | Required | Return results by unique video attachment ID. | | user_id | integer (format=int32) | Optional | Specify the user who is watching the video | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | course_id | integer (minimum=1, format=int32) | Required | Return results by unique course ID that contains the lecture. | | lecture_id | integer (minimum=1, format=int32) | Required | Return results by unique lecture ID. | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | course_id | integer (minimum=1, format=int32) | Required | The unique course ID that contains the lecture. | | user_id | integer (format=int32) | Required | The unique ID of the user. | | page | integer (format=int32) | Optional | Used in pagination when number of courses exceed the maximum amount of results per page | | per | integer (format=int32) | Optional | Used in pagination to define amount of courses per page, when not defined the maximum is 20 | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | course_id | integer (minimum=1, format=int32) | Required | Return a course by its unique ID. | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | name | string | Optional | Filter courses by course name | | is_published | boolean | Optional | Filter courses by published status. If true, return published courses. If false, return unpublished courses. | | author_bio_id | integer (format=int32) | Optional | Filter courses by a specific course author via the course author's bio ID. | | created_at | string (format=date-time) | Optional | Return courses by the date & time of course creation. Formatted in ISO8601. | | page | integer (format=int32) | Optional | Used in pagination when number of courses exceed the maximum amount of results per page | | per | integer (format=int32) | Optional | Used in pagination to define amount of courses per page, when not defined the maximum is 20 | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | user_id | integer (format=int32) | Optional | The unique ID of the user. | | course_id | integer (format=int32) | Optional | The unique ID of the course. | | account | string | Optional | Exact private school profile label; not a provider identity or authorization proof. | | confirm | boolean | Optional | Set true only when the user asked for exactly this action. | | payload | object | Optional | Complete current native JSON body; cannot mix with native body flags or payload_file. | | payload_file | string (minLength=1) | Optional | Absolute regular non-symlink native JSON body file, at most 1 MiB. 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.

| Native JSON field | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | user_id | integer (format=int32) | Required | The unique ID of the user. | | course_id | integer (format=int32) | Required | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | pricing_plan_id | integer (minimum=1, format=int32) | Required | Search for a pricing plan by its unique ID. | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | page | integer (format=int32) | Optional | Used in pagination when number of pricing plans exceeds the maximum amount of results per page | | per | integer (format=int32) | Optional | Used in pagination to define amount of pricing plans per page, when not defined the maximum is 5 | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | user_id | integer (format=int32) | Optional | Native field | | affiliate_id | integer (format=int32) | Optional | Native field | | course_id | integer (format=int32) | Optional | Native field | | pricing_plan_id | integer (format=int32) | Optional | Native field | | is_fully_refunded | boolean | Optional | Native field | | is_chargeback | boolean | Optional | Native field | | start | string (format=date-time) | Optional | The beginning of the time period to return results for (exclusive), in ISO8601 format. | | end | string (format=date-time) | Optional | The end of the time period to return results for (inclusive), in ISO8601 format. | | page | integer (format=int32) | Optional | Used in pagination when number of transactions exceed the maximum amount of results per page | | per | integer (format=int32) | Optional | Used in pagination to define amount of transactions per page, when not defined the maximum is 20 | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | user_id | integer (format=int32) | Optional | The unique ID of the user. | | course_id | integer (format=int32) | Optional | The unique ID of the course. | | account | string | Optional | Exact private school profile label; not a provider identity or authorization proof. | | confirm | boolean | Optional | Set true only when the user asked for exactly this action. | | payload | object | Optional | Complete current native JSON body; cannot mix with native body flags or payload_file. | | payload_file | string (minLength=1) | Optional | Absolute regular non-symlink native JSON body file, at most 1 MiB. 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.

| Native JSON field | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | user_id | integer (format=int32) | Required | The unique ID of the user. | | course_id | integer (format=int32) | Required | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | user_id | integer (minimum=1, format=int32) | Required | The unique ID of the user. | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | user_id | integer (minimum=1, format=int32) | Required | The unique ID of the user. | | name | string | Optional | The name of the user. | | src | string | Optional | The signup source of the user, which is displayed on the Information tab of the user profile. . | | account | string | Optional | Exact private school profile label; not a provider identity or authorization proof. | | confirm | boolean | Optional | Set true only when the user asked for exactly this action. | | payload | object | Optional | Complete current native JSON body; cannot mix with native body flags or payload_file. | | payload_file | string (minLength=1) | Optional | Absolute regular non-symlink native JSON body file, at most 1 MiB. 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.

| Native JSON field | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | name | string | Optional | The name of the user. | | src | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | page | integer (format=int32) | Optional | Used in pagination when number of users exceed the maximum amount of results per page | | per | integer (format=int32) | Optional | Used in pagination to define amount of users per page, when not defined the maximum is 20 | | email | string | Optional | Filter users by user email. | | search_after | integer (format=int32) | Optional | 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 | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | name | string | Optional | The name of the new user. | | email | string | Optional | The email address of the new user.. | | src | string | Optional | 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 | string | Optional | Exact private school profile label; not a provider identity or authorization proof. | | confirm | boolean | Optional | Set true only when the user asked for exactly this action. | | payload | object | Optional | Complete current native JSON body; cannot mix with native body flags or payload_file. | | payload_file | string (minLength=1) | Optional | Absolute regular non-symlink native JSON body file, at most 1 MiB. 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.

| Native JSON field | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | name | string | Optional | The name of the new user. | | email | string | Required | The email address of the new user.. | | password | string | Optional | The password of the new user. Must be at least 6 characters. | | src | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | webhook_id | integer (format=int32) | Required | The unique ID of the webhook. | | response_http_status_gte | integer (format=int32) | Optional | 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 | integer (format=int32) | Optional | 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 | string (format=date-time, default=2020-04-17T19:44:03Z) | Optional | Search for webhook events that were created before a specific date/time. Formatted in ISO 8601. | | created_after | string (format=date-time, default=2020-04-17T19:44:03Z) | Optional | Search for webhook events that were created after a specific date/time. Formatted in ISO 8601. | | page | integer (format=int32) | Optional | 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 | integer (format=int32) | Optional | Set the maximum number of results to be returned by page. By default, each page will return 20 results. | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | product_type | string | Required | Product type (courses, product-collections, digital-downloads, coaching, membership-tiers) | | product_id | integer | Required | Product ID | | plan_id | integer | Required | Pricing plan ID | | account | string | Optional | Exact private school profile label; not a provider identity or authorization proof. | | confirm | boolean | Optional | Set true only when the user asked for exactly this action. |

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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | product_type | string | Required | Product type (courses, product-collections, digital-downloads, coaching, membership-tiers) | | product_id | integer | Required | Product ID | | plan_id | integer | Required | Pricing plan ID | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | product_type | string | Required | Product type (courses, product-collections, digital-downloads, coaching, membership-tiers) | | product_id | integer | Required | Product ID | | plan_id | integer | Required | Pricing plan ID | | name | string nullable | Optional | Native field | | description | string nullable | Optional | Native field | | detailed_description | string nullable | Optional | Native field | | cc_statement_description | string nullable | Optional | Text shown on customer card statements. On schools using the new payments experience this is stored but not yet applied to statements. | | is_published | boolean | Optional | Native field | | access_limit_date | string nullable (format=date-time) | Optional | Native field | | access_limit_interval | string nullable | Optional | Native field | | access_limit_duration | integer nullable | Optional | Native field | | enrollment_cap | integer nullable | Optional | 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 | string nullable (format=date-time) | Optional | 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 | string nullable | Optional | Native field | | enrollment_cap_fulfillment_count | integer nullable | Optional | Native field | | enrollment_cap_visible | boolean nullable | Optional | Native field | | account | string | Optional | Exact private school profile label; not a provider identity or authorization proof. | | confirm | boolean | Optional | Set true only when the user asked for exactly this action. | | payload | object | Optional | Complete current native JSON body; cannot mix with native body flags or payload_file. | | payload_file | string (minLength=1) | Optional | Absolute regular non-symlink native JSON body file, at most 1 MiB. 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.

| Native JSON field | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | name | string nullable | Optional | Native field | | description | string nullable | Optional | Native field | | detailed_description | string nullable | Optional | Native field | | cc_statement_description | string nullable | Optional | Text shown on customer card statements. On schools using the new payments experience this is stored but not yet applied to statements. | | is_published | boolean | Optional | Native field | | access_limit_date | string nullable (format=date-time) | Optional | Native field | | access_limit_interval | string nullable | Optional | Native field | | access_limit_duration | integer nullable | Optional | Native field | | enrollment_cap | integer nullable | Optional | 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 | string nullable (format=date-time) | Optional | 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 | string nullable | Optional | Native field | | enrollment_cap_fulfillment_count | integer nullable | Optional | Native field | | enrollment_cap_visible | boolean nullable | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | product_type | string | Required | Product type (courses, product-collections, digital-downloads, coaching, membership-tiers) | | product_id | integer | Required | Product ID | | page | integer (minimum=1) | Optional | Page number (1-based integer) | | per_page | integer (minimum=1, maximum=100) | Optional | Items per page (integer) | | sort_by | string | Optional | Sort field (created_at, updated_at) | | sort_direction | string | Optional | Sort direction (asc, desc) | | is_published | boolean | Optional | Filter by publish status. When omitted, returns both published and unpublished pricing plans. | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | product_type | string | Required | Product type (courses, product-collections, digital-downloads, coaching, membership-tiers) | | product_id | integer | Required | Product ID | | name | string | Optional | Native field | | currency | string | Optional | 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 | integer | Optional | Native field | | is_recurring | boolean | Optional | Native field | | billing_interval | day, week, month, year | Optional | Required when is_recurring is true. Membership tier plans on schools using the new payments experience accept only month or year. | | billing_interval_count | integer nullable | Optional | 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 | string nullable | Optional | Native field | | detailed_description | string nullable | Optional | Native field | | free_trial_length | integer nullable | Optional | Native field | | access_limit_date | string nullable (format=date-time) | Optional | Native field | | access_limit_interval | string nullable | Optional | Native field | | access_limit_duration | integer nullable | Optional | Native field | | enrollment_cap | integer nullable | Optional | 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 | string nullable (format=date-time) | Optional | 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 | string nullable | Optional | Native field | | enrollment_cap_fulfillment_count | integer nullable | Optional | Native field | | enrollment_cap_visible | boolean nullable | Optional | Native field | | num_payments_required | integer nullable | Optional | Native field | | position | integer nullable | Optional | Native field | | is_published | boolean | Optional | Native field | | account | string | Optional | Exact private school profile label; not a provider identity or authorization proof. | | confirm | boolean | Optional | Set true only when the user asked for exactly this action. | | payload | object | Optional | Complete current native JSON body; cannot mix with native body flags or payload_file. | | payload_file | string (minLength=1) | Optional | Absolute regular non-symlink native JSON body file, at most 1 MiB. 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.

| Native JSON field | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | name | string | Required | Native field | | currency | string | Required | 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 | integer | Required | Native field | | is_recurring | boolean | Optional | Native field | | billing_interval | day, week, month, year | Optional | Required when is_recurring is true. Membership tier plans on schools using the new payments experience accept only month or year. | | billing_interval_count | integer nullable | Optional | 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 | string nullable | Optional | Native field | | detailed_description | string nullable | Optional | Native field | | free_trial_length | integer nullable | Optional | Native field | | access_limit_date | string nullable (format=date-time) | Optional | Native field | | access_limit_interval | string nullable | Optional | Native field | | access_limit_duration | integer nullable | Optional | Native field | | enrollment_cap | integer nullable | Optional | 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 | string nullable (format=date-time) | Optional | 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 | string nullable | Optional | Native field | | enrollment_cap_fulfillment_count | integer nullable | Optional | Native field | | enrollment_cap_visible | boolean nullable | Optional | Native field | | num_payments_required | integer nullable | Optional | Native field | | position | integer nullable | Optional | Native field | | is_published | boolean | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | coupon_id | integer | Required | Native field | | account | string | Optional | Exact private school profile label; not a provider identity or authorization proof. | | confirm | boolean | Optional | Set true only when the user asked for exactly this action. |

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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | coupon_id | integer | Required | Native field | | account | string | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | coupon_id | integer | Required | Native field | | name | string nullable | Optional | Native field | | expiration_date | string nullable (format=date-time) | Optional | Native field | | number_available | integer nullable | Optional | Native field | | cap_visible | boolean | Optional | Native field | | display_priority | time, uses | Optional | Native field | | account | string | Optional | Exact private school profile label; not a provider identity or authorization proof. | | confirm | boolean | Optional | Set true only when the user asked for exactly this action. | | payload | object | Optional | Complete current native JSON body; cannot mix with native body flags or payload_file. | | payload_file | string (minLength=1) | Optional | Absolute regular non-symlink native JSON body file, at most 1 MiB. 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.

| Native JSON field | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | name | string nullable | Optional | Native field | | expiration_date | string nullable (format=date-time) | Optional | Native field | | number_available | integer nullable | Optional | Native field | | cap_visible | boolean | Optional | Native field | | display_priority | time, uses | Optional | 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.

| Argument | Type or constraint | Requirement | Meaning | | --- | --- | --- | --- | | is_published | boolean | Optional | Native field | | pricing_plan_id | integer | Optional | Filter by pricing plan ID. Meaningful on schools not using the new payments experience; o