24 operations. Call each with POST https://app.chirply.io/api/v1/actions/<name> and a bearer token; the response is { "data": { "action", "summary", "result" } }. A read badge means the operation changes nothing; write requires the credential’s write scope.
Archive a course
courses.archive_coursewriteconfirmadmin only
Archive a course: members can no longer open it, but every enrollment, progress record, and certificate is kept. Re-publish it to bring it back. Use this instead of delete when people have taken the course. Outward-facing — it vanishes from every enrolled member's classroom the moment it lands (same blast radius as publishing), so it asks first.
Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.
Over MCP the same operation is the tool courses_archive_course at https://app.chirply.io/api/mcp, same bearer token, same input.
Mark a lesson complete
courses.complete_lessonwriteconfirmadmin only
Mark a published lesson complete for a contact, exactly as if they finished it themselves: it awards the course's per-lesson community points, enrolls them if they weren't yet, and — when it's their last remaining lesson — completes the whole course, awards the completion bonus, ISSUES A REAL SERIAL-NUMBERED CERTIFICATE in that person's name (if enabled), and fires the 'Lesson completed' / 'Course completed' automations, which can email or text them for real on the org's own provider accounts. It falsifies a learning record on someone's behalf and there is no un-issue for a certificate, so it always asks first. If the lesson requires a passed quiz, this refuses unless skip_quiz_gate is set.
Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.
Parameters
Field
Type
Required
Description
lesson_id
string (uuid)
required
The lesson to mark complete.
contact_id
string (uuid)
required
The contact to mark it complete for.
skip_quiz_gate
boolean
optional
Override a quiz-required lesson and complete it without a passing attempt. Default: false
Over MCP the same operation is the tool courses_complete_lesson at https://app.chirply.io/api/mcp, same bearer token, same input.
Create a course
courses.create_coursewriteadmin only
Create a new course as a DRAFT (members can't see it until you publish). Optionally mount it in a group's classroom right away. The URL slug is generated from the title. Courses are a counted plan limit — at the cap this refuses with 402 plan_limit_reached, exactly like the app.
Parameters
Field
Type
Required
Description
title
string
required
The course title, shown to members.
description
string
optional
What the course covers, shown on its card.
funnel_id
string (uuid)
optional
Mount the course in this funnel's member classroom. Omit to build it unmounted.
Over MCP the same operation is the tool courses_create_course at https://app.chirply.io/api/mcp, same bearer token, same input.
Add a lesson
courses.create_lessonwriteadmin only
Add a lesson to a module, appended at the end. A lesson can carry an embedded video, rich HTML content, downloadable attachments, and an optional multiple-choice quiz (set quiz_required to make passing it the only way to complete the lesson). New lessons start as DRAFTS members can't see until you set status to 'published'.
Parameters
Field
Type
Required
Description
module_id
string (uuid)
required
The module the lesson belongs to.
title
string
required
The lesson's title, shown to members.
video_url
string (uri)
optional
Embed URL — YouTube/Vimeo/Loom/Wistia or a direct video file.
content
string
optional
The lesson body as HTML.
attachments
object[]
optional
Downloadable resources shown under the lesson.
attachments[].label
string
required
The link text members see.
attachments[].url
string (uri)
required
Public URL of the downloadable resource.
quiz
object
optional
An optional multiple-choice quiz members take on this lesson.
quiz.pass_pct
number
required
Passing score, 0–100. An attempt at or above this percentage passes.
quiz.questions
object[]
required
The questions, in the order members see them.
quiz.questions[].id
string
required
A stable id for the question (e.g. 'q1').
quiz.questions[].prompt
string
required
The question shown to the member.
quiz.questions[].options
object[]
required
The answer choices (at least 2).
quiz.questions[].options[].id
string
required
A stable id for the option (e.g. 'a').
quiz.questions[].options[].label
string
required
The answer text shown to the member.
quiz.questions[].correct
string[]
required
The option ids that must ALL (and only) be selected for the answer to count as correct.
quiz_required
boolean
optional
true = the lesson only completes via a passing quiz attempt. Default: false
duration_minutes
integer
optional
How long the lesson takes, in minutes. Shown to members as a time estimate.
status
"draft" | "published"
optional
draft is invisible to members; published counts toward course completion. Default: "draft"
Over MCP the same operation is the tool courses_create_lesson at https://app.chirply.io/api/mcp, same bearer token, same input.
Add a module
courses.create_modulewriteadmin only
Add a module (section) to a course, appended at the end. Optionally drip it (unlock N days after each member's enrollment) or gate it behind a community level.
Parameters
Field
Type
Required
Description
course_id
string (uuid)
required
The course the module belongs to.
title
string
required
The module's title, shown to members.
description
string
optional
One line about what this module covers.
drip_days
integer
optional
Unlocks this many days after the member enrolls. 0 = immediately. Default: 0
min_level
integer
optional
Members below this community level see the module locked. 0 = everyone. Default: 0
Over MCP the same operation is the tool courses_create_module at https://app.chirply.io/api/mcp, same bearer token, same input.
Delete a course
courses.delete_coursewriteconfirmadmin only
Permanently delete a course AND everything under it: modules, lessons, quizzes, every member's enrollment and progress, and their issued certificates (public certificate links stop working). This cannot be undone — archive instead if anyone has taken it.
Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.
Over MCP the same operation is the tool courses_delete_course at https://app.chirply.io/api/mcp, same bearer token, same input.
Delete a lesson
courses.delete_lessonwriteconfirmadmin only
Permanently delete a lesson, including every member's completion record and quiz attempts for it. Members' course progress recalculates without it. Cannot be undone.
Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.
Over MCP the same operation is the tool courses_delete_lesson at https://app.chirply.io/api/mcp, same bearer token, same input.
Delete a module
courses.delete_modulewriteconfirmadmin only
Permanently delete a module AND every lesson in it, including members' completion records for those lessons. Members' overall course progress recalculates without them. Cannot be undone.
Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.
Over MCP the same operation is the tool courses_delete_module at https://app.chirply.io/api/mcp, same bearer token, same input.
Enroll a contact
courses.enroll_contactwriteconfirmadmin only
Enroll a contact in a course. They see it in their classroom right away (once they can sign in), drip timers start counting from now, and the org's 'Enrolled in a course' automations fire — which can send that real person a real welcome email or SMS, billed to the org's own Mailgun/Twilio account, without any further step. Idempotent — enrolling someone already enrolled changes nothing and fires nothing.
Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.
Over MCP the same operation is the tool courses_enroll_contact at https://app.chirply.io/api/mcp, same bearer token, same input.
Generate quiz with AI
courses.generate_quizwriteconfirmadmin only
Draft a 5-question multiple-choice quiz from a lesson's title and content using the account's own AI connection. This SPENDS MONEY: the request is billed to the org's own AI provider key (requires one under Settings → AI), so it is not a free read despite saving nothing. Returns the quiz for review — NOTHING is stored; persist it by passing the result to 'Update a lesson' as its quiz.
Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.
Parameters
Field
Type
Required
Description
lesson_id
string (uuid)
required
The lesson to draft a quiz from (its saved title + content are used).
Over MCP the same operation is the tool courses_generate_quiz at https://app.chirply.io/api/mcp, same bearer token, same input.
Look up a certificate
courses.get_certificateread
Verify a completion certificate by its serial (the public token printed on it). Returns the recipient, course, and issue date if the serial is genuine and belongs to this account.
Parameters
Field
Type
Required
Description
serial
string
required
The certificate's serial, e.g. 'A1B2-C3D4-E5F6-A7B8'.
Over MCP the same operation is the tool courses_get_certificate at https://app.chirply.io/api/mcp, same bearer token, same input.
A contact's course progress
courses.get_contact_progressread
One contact's progress through one course: their enrollment (when, how, finished or not), the completion percentage, exactly which lessons they've completed, and their certificate serial if one was issued.
Over MCP the same operation is the tool courses_get_contact_progress at https://app.chirply.io/api/mcp, same bearer token, same input.
Open a course
courses.get_courseread
Fetch one course with its full outline — every module and lesson in order, including drafts and each lesson's quiz — the builder's view, not the member's.
Over MCP the same operation is the tool courses_get_course at https://app.chirply.io/api/mcp, same bearer token, same input.
List certificates
courses.list_certificatesread
List completion certificates this account has issued, newest first — each with its public serial (the verification token printed on the certificate), recipient, and course. Optionally filter by course or contact.
Over MCP the same operation is the tool courses_list_certificates at https://app.chirply.io/api/mcp, same bearer token, same input.
List courses
courses.list_coursesread
List the account's courses in display order, with status (draft/published/archived), which group's classroom each is mounted in, access rules, and gamification settings. Optionally filter by status or by the funnel a course is mounted on.
Over MCP the same operation is the tool courses_list_courses at https://app.chirply.io/api/mcp, same bearer token, same input.
List enrollments
courses.list_enrollmentsread
List who is enrolled in a course, newest first, with each person's name, how they were enrolled, completion percentage, and whether (and when) they finished.
Over MCP the same operation is the tool courses_list_enrollments at https://app.chirply.io/api/mcp, same bearer token, same input.
Move a lesson up or down
courses.move_lessonwriteadmin only
Move a lesson one step up or down within its module — the builder's arrow buttons. Atomically swaps display positions with its neighbor (unlike setting `position` by hand, which can leave two lessons sharing a slot). Moving past the top or bottom changes nothing and reports so. To move a lesson into a DIFFERENT module, use courses.update_lesson's module_id.
Parameters
Field
Type
Required
Description
id
string (uuid)
required
The lesson to move.
direction
"up" | "down"
required
up = one step earlier in its module, down = one step later.
Over MCP the same operation is the tool courses_move_lesson at https://app.chirply.io/api/mcp, same bearer token, same input.
Move a module up or down
courses.move_modulewriteadmin only
Move a module one step up or down in its course's curriculum — the builder's arrow buttons. Atomically swaps display positions with its neighbor (unlike setting `position` by hand, which can leave two modules sharing a slot). Moving past the top or bottom changes nothing and reports so.
Parameters
Field
Type
Required
Description
id
string (uuid)
required
The module to move.
direction
"up" | "down"
required
up = one step earlier in the curriculum, down = one step later.
Over MCP the same operation is the tool courses_move_module at https://app.chirply.io/api/mcp, same bearer token, same input.
Publish a course
courses.publish_coursewriteconfirmadmin only
Publish a course so members who qualify (mounted group + access rules) can see and take it. This is outward-facing: the moment it lands, everyone with access sees the course in their classroom, half-finished modules included — only published LESSONS are visible, and publishing the course does not publish its draft lessons.
Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.
Over MCP the same operation is the tool courses_publish_course at https://app.chirply.io/api/mcp, same bearer token, same input.
Unenroll a contact
courses.unenroll_contactwriteconfirmadmin only
Remove a contact from a course AND take back everything it gave them: every completed-lesson record and quiz attempt for this course is deleted, and the community points they earned from those lessons (and from finishing the course) are removed from their balance. Cannot be recovered — re-enrolling starts them from zero, quizzes included. An already-issued certificate is kept.
Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.
Over MCP the same operation is the tool courses_unenroll_contact at https://app.chirply.io/api/mcp, same bearer token, same input.
Unpublish course
courses.unpublish_coursewriteconfirmadmin only
Take a published course back to DRAFT. This is outward-facing: the moment it lands, the course disappears from every enrolled member's classroom — someone mid-lesson loses access on their next click. Nothing is deleted: enrollments, progress, and certificates are all kept, and re-publishing puts everyone back exactly where they were.
Marked confirm: this operation is irreversible, reaches real people, or spends money. Holding a credential is itself the confirmation for API and MCP callers — call it only when you mean it. The in-app assistant refuses to run it without a human approving first.
Over MCP the same operation is the tool courses_unpublish_course at https://app.chirply.io/api/mcp, same bearer token, same input.
Edit course settings
courses.update_coursewriteadmin only
Update a course's settings: title, description, cover, which group's classroom it's mounted in (funnel_id; null unmounts it), access rules (level gate / required access product), the points members earn per lesson and on completion, and the completion certificate. Omitted fields are left alone. Changes affect what enrolled members see immediately.
Parameters
Field
Type
Required
Description
id
string (uuid)
required
The course to edit.
title
string
optional
New title.
description
string (or null)
optional
New description (null clears it).
cover_url
string (uri) (or null)
optional
New cover image URL (null clears it).
funnel_id
string (uuid) (or null)
optional
Mount in this funnel's classroom, or null to unmount (members lose sight of it).
access
"members" | "entitlement"
optional
members = any signed-in member; entitlement = only holders of required_product_id.
required_product_id
string (uuid) (or null)
optional
The access product required (used with access 'entitlement'; null clears it).
min_level
integer
optional
Members below this community level see the course locked. 0 = everyone.
points_per_lesson
integer
optional
Community points a member earns per completed lesson. 0 disables.
points_on_complete
integer
optional
Bonus points for finishing the whole course. 0 disables.
certificate_enabled
boolean
optional
true issues a shareable completion certificate automatically.
certificate_settings
object
optional
How the certificate looks (headline, signature, accent color). Replaces the stored settings.
certificate_settings.headline
string
optional
Headline on the certificate (e.g. 'Certificate of Completion').
Over MCP the same operation is the tool courses_update_course at https://app.chirply.io/api/mcp, same bearer token, same input.
Edit a lesson
courses.update_lessonwriteadmin only
Update a lesson's content, video, attachments, quiz, position, duration, or status. Omitted fields are left alone; pass quiz null to remove the quiz. Publishing/unpublishing changes what counts toward every enrolled member's completion percentage.
Parameters
Field
Type
Required
Description
id
string (uuid)
required
The lesson to edit.
title
string
optional
The lesson's title, shown to members.
video_url
string (uri) (or null)
optional
New embed URL (null clears it).
content
string
optional
New HTML body.
attachments
object[]
optional
Replaces the stored attachment list.
attachments[].label
string
required
The link text members see.
attachments[].url
string (uri)
required
Public URL of the downloadable resource.
quiz
object (or null)
optional
Replaces the quiz; null removes it entirely.
quiz.pass_pct
number
required
Passing score, 0–100. An attempt at or above this percentage passes.
quiz.questions
object[]
required
The questions, in the order members see them.
quiz.questions[].id
string
required
A stable id for the question (e.g. 'q1').
quiz.questions[].prompt
string
required
The question shown to the member.
quiz.questions[].options
object[]
required
The answer choices (at least 2).
quiz.questions[].options[].id
string
required
A stable id for the option (e.g. 'a').
quiz.questions[].options[].label
string
required
The answer text shown to the member.
quiz.questions[].correct
string[]
required
The option ids that must ALL (and only) be selected for the answer to count as correct.
quiz_required
boolean
optional
true = the lesson only completes via a passing quiz attempt.
duration_minutes
integer (or null)
optional
How long the lesson takes, in minutes. Shown to members as a time estimate.
position
integer
optional
Raw sort value within the module. Sets THIS row only — it does NOT swap with the lesson already holding that slot, and positions aren't unique, so two lessons can end up sharing one and sort by creation date. To reorder, use courses.move_lesson instead.
module_id
string (uuid)
optional
Move the lesson into another module of the same course.
status
"draft" | "published"
optional
draft hides it from members; published counts toward completion.
Over MCP the same operation is the tool courses_update_lesson at https://app.chirply.io/api/mcp, same bearer token, same input.
Edit a module
courses.update_modulewriteadmin only
Update a module's title, description, position, drip delay, or level gate. Omitted fields are left alone. Gate changes apply to enrolled members immediately.
Parameters
Field
Type
Required
Description
id
string (uuid)
required
The module to edit.
title
string
optional
The module's title, shown to members.
description
string (or null)
optional
New description (null clears it).
position
integer
optional
Raw sort value within the course (0 = first). Sets THIS row only — it does NOT swap with the module already holding that slot, and positions aren't unique, so two modules can end up sharing one and sort by creation date. To reorder, use courses.move_module instead.
drip_days
integer
optional
Unlocks this many days after enrollment. 0 = immediately.