← All action domains

Courses

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.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe course to archive.

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.archive_course \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

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

FieldTypeRequiredDescription
lesson_idstring (uuid)requiredThe lesson to mark complete.
contact_idstring (uuid)requiredThe contact to mark it complete for.
skip_quiz_gatebooleanoptionalOverride a quiz-required lesson and complete it without a passing attempt. Default: false

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.complete_lesson \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "lesson_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "contact_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

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

FieldTypeRequiredDescription
titlestringrequiredThe course title, shown to members.
descriptionstringoptionalWhat the course covers, shown on its card.
funnel_idstring (uuid)optionalMount the course in this funnel's member classroom. Omit to build it unmounted.
cover_urlstring (uri)optionalCover image URL for the course card.

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.create_course \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Example"
  }'
Test with your API key

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

FieldTypeRequiredDescription
module_idstring (uuid)requiredThe module the lesson belongs to.
titlestringrequiredThe lesson's title, shown to members.
video_urlstring (uri)optionalEmbed URL — YouTube/Vimeo/Loom/Wistia or a direct video file.
contentstringoptionalThe lesson body as HTML.
attachmentsobject[]optionalDownloadable resources shown under the lesson.
attachments[].labelstringrequiredThe link text members see.
attachments[].urlstring (uri)requiredPublic URL of the downloadable resource.
quizobjectoptionalAn optional multiple-choice quiz members take on this lesson.
quiz.pass_pctnumberrequiredPassing score, 0–100. An attempt at or above this percentage passes.
quiz.questionsobject[]requiredThe questions, in the order members see them.
quiz.questions[].idstringrequiredA stable id for the question (e.g. 'q1').
quiz.questions[].promptstringrequiredThe question shown to the member.
quiz.questions[].optionsobject[]requiredThe answer choices (at least 2).
quiz.questions[].options[].idstringrequiredA stable id for the option (e.g. 'a').
quiz.questions[].options[].labelstringrequiredThe answer text shown to the member.
quiz.questions[].correctstring[]requiredThe option ids that must ALL (and only) be selected for the answer to count as correct.
quiz_requiredbooleanoptionaltrue = the lesson only completes via a passing quiz attempt. Default: false
duration_minutesintegeroptionalHow long the lesson takes, in minutes. Shown to members as a time estimate.
status"draft" | "published"optionaldraft is invisible to members; published counts toward course completion. Default: "draft"

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.create_lesson \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "module_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "title": "Example"
  }'
Test with your API key

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

FieldTypeRequiredDescription
course_idstring (uuid)requiredThe course the module belongs to.
titlestringrequiredThe module's title, shown to members.
descriptionstringoptionalOne line about what this module covers.
drip_daysintegeroptionalUnlocks this many days after the member enrolls. 0 = immediately. Default: 0
min_levelintegeroptionalMembers below this community level see the module locked. 0 = everyone. Default: 0

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.create_module \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "course_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "title": "Example"
  }'
Test with your API key

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.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe course to delete.

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.delete_course \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

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.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe lesson to delete.

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.delete_lesson \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

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.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe module to delete.

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.delete_module \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

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.

Parameters

FieldTypeRequiredDescription
course_idstring (uuid)requiredThe course to enroll them in.
contact_idstring (uuid)requiredThe contact to enroll.

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.enroll_contact \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "course_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "contact_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

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

FieldTypeRequiredDescription
lesson_idstring (uuid)requiredThe lesson to draft a quiz from (its saved title + content are used).

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.generate_quiz \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "lesson_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

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

FieldTypeRequiredDescription
serialstringrequiredThe certificate's serial, e.g. 'A1B2-C3D4-E5F6-A7B8'.

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.get_certificate \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "serial": "example"
  }'
Test with your API key

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.

Parameters

FieldTypeRequiredDescription
course_idstring (uuid)requiredThe course.
contact_idstring (uuid)requiredThe contact.

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.get_contact_progress \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "course_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "contact_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

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.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe course's id.

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.get_course \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

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.

Parameters

FieldTypeRequiredDescription
course_idstring (uuid)optionalOnly certificates for this course.
contact_idstring (uuid)optionalOnly certificates issued to this contact.
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.list_certificates \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "course_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "contact_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

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.

Parameters

FieldTypeRequiredDescription
funnel_idstring (uuid)optionalOnly courses mounted in this funnel's classroom.
status"draft" | "published" | "archived"optionalOnly courses in this status.

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.list_courses \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "funnel_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "status": "draft"
  }'
Test with your API key

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.

Parameters

FieldTypeRequiredDescription
course_idstring (uuid)requiredThe course whose roster to read.
limitintegeroptionalMax rows to return (1–100). Default: 25
offsetintegeroptionalRows to skip. Default: 0

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.list_enrollments \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "course_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

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

FieldTypeRequiredDescription
idstring (uuid)requiredThe lesson to move.
direction"up" | "down"requiredup = one step earlier in its module, down = one step later.

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.move_lesson \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "direction": "up"
  }'
Test with your API key

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

FieldTypeRequiredDescription
idstring (uuid)requiredThe module to move.
direction"up" | "down"requiredup = one step earlier in the curriculum, down = one step later.

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.move_module \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "direction": "up"
  }'
Test with your API key

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.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe course to publish.

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.publish_course \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

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.

Parameters

FieldTypeRequiredDescription
course_idstring (uuid)requiredThe course to remove them from.
contact_idstring (uuid)requiredThe contact to unenroll.

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.unenroll_contact \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "course_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11",
    "contact_id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

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.

Parameters

FieldTypeRequiredDescription
idstring (uuid)requiredThe course to unpublish back to draft.

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.unpublish_course \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

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

FieldTypeRequiredDescription
idstring (uuid)requiredThe course to edit.
titlestringoptionalNew title.
descriptionstring (or null)optionalNew description (null clears it).
cover_urlstring (uri) (or null)optionalNew cover image URL (null clears it).
funnel_idstring (uuid) (or null)optionalMount in this funnel's classroom, or null to unmount (members lose sight of it).
access"members" | "entitlement"optionalmembers = any signed-in member; entitlement = only holders of required_product_id.
required_product_idstring (uuid) (or null)optionalThe access product required (used with access 'entitlement'; null clears it).
min_levelintegeroptionalMembers below this community level see the course locked. 0 = everyone.
points_per_lessonintegeroptionalCommunity points a member earns per completed lesson. 0 disables.
points_on_completeintegeroptionalBonus points for finishing the whole course. 0 disables.
certificate_enabledbooleanoptionaltrue issues a shareable completion certificate automatically.
certificate_settingsobjectoptionalHow the certificate looks (headline, signature, accent color). Replaces the stored settings.
certificate_settings.headlinestringoptionalHeadline on the certificate (e.g. 'Certificate of Completion').
certificate_settings.signature_namestringoptionalWho signs it.
certificate_settings.signature_titlestringoptionalThe signer's title.
certificate_settings.accentstringoptionalAccent color (CSS color) used on the certificate.
positionintegeroptionalSort position among the org's courses.

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.update_course \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

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

FieldTypeRequiredDescription
idstring (uuid)requiredThe lesson to edit.
titlestringoptionalThe lesson's title, shown to members.
video_urlstring (uri) (or null)optionalNew embed URL (null clears it).
contentstringoptionalNew HTML body.
attachmentsobject[]optionalReplaces the stored attachment list.
attachments[].labelstringrequiredThe link text members see.
attachments[].urlstring (uri)requiredPublic URL of the downloadable resource.
quizobject (or null)optionalReplaces the quiz; null removes it entirely.
quiz.pass_pctnumberrequiredPassing score, 0–100. An attempt at or above this percentage passes.
quiz.questionsobject[]requiredThe questions, in the order members see them.
quiz.questions[].idstringrequiredA stable id for the question (e.g. 'q1').
quiz.questions[].promptstringrequiredThe question shown to the member.
quiz.questions[].optionsobject[]requiredThe answer choices (at least 2).
quiz.questions[].options[].idstringrequiredA stable id for the option (e.g. 'a').
quiz.questions[].options[].labelstringrequiredThe answer text shown to the member.
quiz.questions[].correctstring[]requiredThe option ids that must ALL (and only) be selected for the answer to count as correct.
quiz_requiredbooleanoptionaltrue = the lesson only completes via a passing quiz attempt.
duration_minutesinteger (or null)optionalHow long the lesson takes, in minutes. Shown to members as a time estimate.
positionintegeroptionalRaw 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_idstring (uuid)optionalMove the lesson into another module of the same course.
status"draft" | "published"optionaldraft hides it from members; published counts toward completion.

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.update_lesson \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

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

FieldTypeRequiredDescription
idstring (uuid)requiredThe module to edit.
titlestringoptionalThe module's title, shown to members.
descriptionstring (or null)optionalNew description (null clears it).
positionintegeroptionalRaw 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_daysintegeroptionalUnlocks this many days after enrollment. 0 = immediately.
min_levelintegeroptionalLevel gate. 0 = everyone.

Example

curl -X POST https://app.chirply.io/api/v1/actions/courses.update_module \
  -H "Authorization: Bearer chp_live_…" \
  -H "Content-Type: application/json" \
  -d '{
    "id": "2f6a1c1e-6c3b-4c62-9f6e-8a2d4b7c9e11"
  }'
Test with your API key

Over MCP the same operation is the tool courses_update_module at https://app.chirply.io/api/mcp, same bearer token, same input.

The machine-readable version of this page is GET https://app.chirply.io/api/v1/actions?domain=courses — same operations, with full JSON Schemas. Authentication, errors and rate limits are covered in the API documentation home.