• Documentation
  • Introduction
    • The member journey
  • Training
    • Create a program
    • Courses and sections
    • Lessons, media and publication
    • Milestones and paths
    • Tasks and deliverables
    • Cohorts and groups
  • Student & Community
    • Joining a school
    • Learning and resuming
    • Submitting and revising work
    • Calendar and lives
    • Spaces and questions
    • Reading progress
  • Coaching
    • Roles and assignments
    • Member context and work queue
    • Reviews and feedback
    • Sessions and interventions
    • Cohort cockpit and live operations
  • Leads & Qualification
    • People, leads and applications
    • Contacts and import
    • Qualification forms
    • Application triage
  • Setting & Booking
    • Setter scope
    • Sales availability
    • Share a booking link
    • Prospect booking
    • Agenda and booking management
    • Prepare a call and share its meeting link
  • Closing, Offers & Payments
    • Closer scope
    • Compose an offer
    • Share a nominal payment link
    • Buyer checkout and access
    • Instalments
    • Offline payment
    • Track payment and access failures
    • Stripe school account
  • Administration & Integrations
    • Organization roles and domains
    • API keys and tenant binding
    • Webhooks
    • Payment setup
  • API quickstart
  • API reference
    • Connect with MCP
    • Enrollments
      • GETGet the enrollment timeline
      • GETGet the coaching briefing
      • POSTPause an enrollment
      • POSTResume an enrollment
      • POSTExtend a deadline
      • POSTTransfer an enrollment
      • POSTClose an enrollment
      • POSTSubmit an outcome measure
      • GETList outcome measures
      • GETList deadline extensions
      • DELETECancel a deadline extension
      • GETList enrollments
      • POSTEnroll a person
    • Cohorts
      • GETGet the cohort cockpit
      • GETList the enrollments behind a cockpit signal
      • PATCHConfigure a cohort
      • POSTMove a cohort to another phase
      • POSTCreate a cohort
      • POSTChange a cohort's status
    • Coaching sessions
      • GETList coaching sessions
      • GETGet a coaching session
      • POSTRecord a coaching session
      • POSTAppend coaching session entries
    • Interventions
      • GETList interventions
      • POSTPlan an intervention
      • POSTClose an intervention
    • Live sessions
      • PATCHRecord live attendance
      • GETList live attendance
      • GETRead one enrollment's attendance
      • GETList live sessions
      • POSTSchedule a live session
      • PATCHUpdate a live session
      • POSTCancel a live session
      • GETGet live session
    • Programs
      • GETList programs
      • POSTCreate a program
      • GETRead a program
      • PATCHUpdate a program
      • POSTArchive a program
      • POSTRestore a program
    • Courses
      • GETList the courses of a program
      • POSTCreate a course
      • PATCHUpdate a course
      • POSTRename a course
      • POSTArchive a course
      • POSTReorder the courses of a program
      • POSTUpload a course cover
    • Sections
      • GETList the sections of a course
      • POSTCreate a section
      • POSTRename a section
      • POSTDissolve a section
      • POSTReorder the sections of a course
      • POSTMove a lesson into a section
      • DELETETake a lesson out of its section
    • Lessons
      • GETList the lessons of a program
      • POSTCreate a lesson
      • GETRead a lesson
      • PATCHUpdate a lesson
      • POSTPublish a lesson
      • POSTArchive a lesson
      • POSTMove a lesson to another course
      • POSTReorder the lessons of a program
      • POSTAttach a resource
      • DELETEDetach a resource
      • POSTReorder the resources of a lesson
      • POSTUpload a lesson resource
      • POSTUpload a lesson video
      • GETRead a lesson by its identifier
      • PATCHUpdate a lesson by its identifier
      • GETRead the discussion of a lesson
      • POSTComment on a lesson
    • Milestones
      • GETList the milestones of a program
      • POSTCreate a milestone
      • PATCHUpdate a milestone
      • POSTArchive a milestone
      • POSTReorder the milestones of a program
      • GETList the contributions of a milestone
      • POSTAttach a contribution
      • DELETEDetach a contribution
    • People
      • POSTImport people
      • POSTLink a duplicate person
      • DELETEUnlink a duplicate person
    • Delivery analytics
      • GETGet delivery analytics
    • Sales availability
      • GETRead sales availability
      • GETPreview sales slots
      • PUTReplace sales availability
      • GETList eligible sales closers
    • Community
      • POSTUpload an attachment
      • POSTAttach to a thread
      • POSTCreate a space
      • POSTPost a thread
      • POSTReply to a thread
      • POSTLink a thread
      • GETList spaces
      • GETRead a thread
      • GETSearch the community
    • Offer payments
      • POSTPause automatic charging
      • DELETEResume automatic charging
      • POSTCharge an instalment now
      • GETGet collections dashboard
    • Member tasks
      • POSTCreate a member task
      • GETList the tasks of a milestone
      • PUTUpdate a member task
      • POSTArchive a member task
      • POSTReorder the tasks of a milestone
      • GETRead a task
      • GETList program tasks
    • Deliverables
      • POSTCreate a deliverable
      • GETList the deliverables of a task
      • GETGet a deliverable
      • PUTUpdate a deliverable
      • POSTArchive a deliverable
    • Groups
      • GETList groups
      • POSTCreate a group
      • GETGet a group
      • PATCHUpdate a group
      • POSTAdd a Group membership
      • DELETERemove a Group membership
    • Paths
      • GETList program paths
      • POSTCreate a path
      • GETGet a path
      • PATCHVersion or promote a path
    • Webhooks
      • GETList webhook subscriptions
      • POSTCreate a webhook subscription
      • GETGet a webhook subscription
      • PATCHUpdate a webhook subscription
      • DELETEDelete a webhook subscription
      • POSTVerify a webhook subscription
      • POSTRotate a webhook secret
      • POSTPause or reactivate a webhook subscription
      • GETList webhook deliveries
      • GETGet a webhook delivery
      • POSTReplay a webhook delivery
    • Media
      • GETList media
      • POSTUpload a media
      • PATCHRename a media
      • DELETEDelete a media
    • Bookings
      • GETList the open slots of a booking link
      • POSTSave a booking lead
      • POSTBook a call for a prospect
      • GETGet booking details
      • GETList bookings
      • GETGet booking
      • PATCHUpdate booking details
      • GETGet booking agenda
      • GETGet closer meeting link
      • GETList person bookings
      • PUTSet closer meeting link
      • GETList booking links
      • POSTSend a booking email
      • GETRead booking follow-up
      • POSTCreate booking link
      • GETGet booking link
      • PUTRecord booking attendance
      • GETRead booking reminder settings
      • PATCHUpdate booking link
      • POSTReschedule booking
      • PUTSet booking reminder settings
      • POSTCancel booking
      • GETList booking reassignment candidates
      • POSTReassign booking
      • GETList booking reschedule slots
      • GETList booking reassignment slots
    • My learning
      • GETList my enrollments
      • GETGet my learning context
      • GETList my lessons
      • GETGet one of my lessons
      • GETList my agenda
      • GETGet my lesson note
      • PUTSave my lesson note
      • DELETEDelete my lesson note
      • GETList my lesson notes
      • GETGet my lesson's agent section
      • GETList my tasks
      • GETRead my submission
      • POSTOpen my submission draft
      • PUTSave my submission draft
      • POSTSubmit my work
      • POSTResubmit my work
    • Forms
      • GETList forms
      • POSTCreate a form
      • GETGet a form
      • PATCHUpdate form identity
      • DELETEDelete a form
      • PUTSave form definition
      • PUTSet form theme
      • PUTSet form qualification
      • PUTSet submission mode
      • PUTOpen or close a form
      • POSTPublish a form
      • POSTUnpublish a form
      • GETList form responses
      • GETGet a form response
      • GETRead form statistics
      • POSTRetry response qualification
      • GETRead form definition
      • GETRead form theme
      • GETRead form qualification
      • GETRead form submission-settings
      • GETRead form identity fields
      • PUTSet form identity fields
    • Calendar connections
      • GETList calendar connections
      • GETRead a calendar connection
      • POSTRequest calendar consent
      • GETList writable calendars
      • PUTSelect a calendar
      • DELETEDisconnect a calendar
    • Offers
      • GETList offers
      • POSTCreate an offer
      • GETGet an offer
      • PATCHUpdate an offer
      • GETGet composer options
    • Responsibilities
      • GETList responsibilities
      • POSTAssign a responsibility
      • DELETERemove a responsibility
    • Submission reviews
      • GETList submission reviews
      • GETRead a submission review
      • POSTTake a submission in review
      • POSTDecide a submission review
    • Closers
      • GETList closer invitations
      • POSTInvite a closer
      • POSTResend a closer invitation
      • DELETECancel a closer invitation
      • GETRead commercial responsibility
      • PUTAssign commercial responsibility
      • GETRead my sales availability
      • PUTUpdate my sales availability
      • GETRead my closer setup
    • Personal preparation
      • GETRead my work profile
      • PATCHUpdate my work profile
      • GETRead my preparation
    • Video library
      • GETList video resources
      • GETGet a video resource
      • POSTPublish a video resource
      • PATCHUpdate a video resource
      • POSTUnpublish a video resource
      • POSTRepublish a video resource
    • Video questions
      • POSTAsk a question
      • GETList my questions
      • GETGet my question
      • GETList received questions
      • PATCHAssign a question
      • POSTAnswer a question
      • POSTCancel a question
  1. Documentation
  2. API reference
  3. Enrollments
  4. Close an enrollment
HomeBlogDocumentationPricingContact

Close an enrollment

PreviousTransfer an enrollmentNextSubmit an outcome measure
On this page
AuthorizationOrganization roleBusiness authorizationPath parametersRequest headersRequest bodyExampleResponseResponse fieldsExample responseAgent recipeNotesRelated

POST /api/v1/enrollments/{enrollmentId}/close

Records how one participation ended. Closing is final: it fixes the real outcome and prepares what comes next. The history stays intact and stays readable to the member according to the access policy you pick. The current action and its reminder are cancelled, planned interventions are closed, an open pause is ended. No other enrollment is affected.

Authorization

Organization role

Role in the organizationThis endpoint
OWNERAllowed
ADMINAllowed
MEMBERConditional — only with a business role below

Business authorization

RequirementRule for this endpoint
Business roleprogram_director scoped to the organization, or coach assigned to this enrollment
Resource scopeEnrollment of the organization attached to the API key
ParticipationAn assigned coach can close the participation they accompany
Resource stateThe enrollment must be pending, active or paused

Closing is wider than pausing, and deliberately so: interrupting a participation decides someone's access to the product, while stating that it ended — and writing the summary — is the gesture of whoever accompanied it. A platform-wide role grants nothing here. An enrollment of another organization is refused without revealing whether it exists.

Path parameters

ParameterTypeRequiredDescription
enrollmentIdUUIDyesEnrollment visible from the key's organization

Request headers

HeaderRequiredDescription
x-api-keyyesAPI key created for this organization
Idempotency-KeyyesStable key for this closing intention
X-Correlation-IdnoCaller correlation id, returned or generated

Request body

FieldTypeRequiredNullableDescription
resultstringyesnocompleted, early_exit or cancelled
reasonstringyesno1 to 2000 characters; visible to your team and in the enrollment history
outcomeAchievedbooleanonly for completionnoWhether the initial objective was reached. Refused for the other results
summarystringonly for completionno1 to 4000 characters. Refused for the other results
finalMilestoneIdUUIDnoyesA milestone of the program's primary path. Refused for the other results
nextRecommendationstringnoyesUp to 2000 characters; the only closing text the member reads
accessPolicystringyesnoread_only or suspended

result decides which transition is allowed:

  • an active or paused enrollment can be closed with any of the three;
  • a pending enrollment can only be cancelled — a participation that never started can neither have completed nor stopped along the way;
  • an already closed enrollment cannot be closed again.

accessPolicy decides what the member can still read:

  • read_only — the member re-reads their journey and history; they no longer write;
  • suspended — the journey leaves the member's view. Their account remains.

Both policies refuse the same writes. Only reading differs.

Closing does not require any completion rate. A completion states the real outcome, not a percentage of lessons.

json
{
  "result": "completed",
  "reason": "Commercial objective reached, final call done.",
  "outcomeAchieved": true,
  "summary": "Six clients signed over the period, two of them recurring.",
  "nextRecommendation": "Scale program next quarter.",
  "accessPolicy": "read_only"
}

Example

bash
curl -X POST "$COHORTE_API_BASE_URL/api/v1/enrollments/ENROLLMENT_ID/close" \
  -H "x-api-key: $COHORTE_API_KEY" \
  -H "Idempotency-Key: close-2026-09-03" \
  -H 'Content-Type: application/json' \
  -d '{"result":"completed","reason":"Commercial objective reached.","outcomeAchieved":true,"summary":"Six clients signed.","accessPolicy":"read_only"}'

Response

  • 201 Created — the participation is closed.
  • 200 OK — the same Idempotency-Key replayed the original closure.
  • 400 Bad Request — missing Idempotency-Key, invalid JSON, an empty reason, an unknown result or policy, a completion without outcomeAchieved or summary, one of those fields sent with another result, a final milestone outside the program's primary path, or a pending enrollment closed with something other than cancelled.
  • 401 Unauthorized — the key is missing, invalid, or no longer attached to a member.
  • 403 Forbidden — the bearer cannot close this enrollment.
  • 404 Not Found — the enrollment is unknown or belongs to another organization.
  • 409 Conflict — the enrollment is already closed.

Response fields

FieldTypeNullableDescription
successbooleannotrue for a successful request
replayedbooleannotrue when the idempotency key replayed a closure
data.idUUIDnoClosure identifier
data.enrollmentIdUUIDnoEnrollment that is closed
data.resultstringnocompleted, early_exit or cancelled
data.reasonstringnoReason given for the closure
data.outcomeAchievedbooleanyesnull outside a completion
data.summarystringyesnull outside a completion
data.nextRecommendationstringyesnull when no next step was recorded
data.finalMilestoneIdUUIDyesnull when no final milestone was named
data.finalMilestoneTitlestringyesTitle of that milestone, resolved for display
data.accessPolicystringnoread_only or suspended
data.closedByUUIDnoAccount that closed the participation
data.closedByNamestringyesDisplay name of that account
data.closedAtISO 8601 stringnoWhen the participation was closed, in UTC
data.createdAtISO 8601 stringnoWhen the closure was recorded, in UTC
correlationIdUUIDnoCorrelation id for support

Example response

json
{
  "success": true,
  "replayed": false,
  "data": {
    "id": "8b71f4c3-0000-4000-8000-000000000000",
    "enrollmentId": "4af4cd8d-0000-4000-8000-000000000000",
    "result": "completed",
    "reason": "Commercial objective reached, final call done.",
    "outcomeAchieved": true,
    "summary": "Six clients signed over the period, two of them recurring.",
    "nextRecommendation": "Scale program next quarter.",
    "finalMilestoneId": null,
    "finalMilestoneTitle": null,
    "accessPolicy": "read_only",
    "closedBy": "6d41ab55-0000-4000-8000-000000000000",
    "closedByName": "Paul Vidal",
    "closedAt": "2026-09-03T09:00:00.000Z",
    "createdAt": "2026-09-03T09:00:00.000Z"
  },
  "correlationId": "0f6b1d92-0000-4000-8000-000000000000"
}

Agent recipe

  1. Read the enrollment state — a closed enrollment cannot be closed again, and a pending one can only be cancelled.
  2. Close it with the result that matches what happened, a reason your team will read later, and the access policy the member should keep.
  3. For a completion, state whether the objective was reached and write the summary; both are required, and both stay internal.
  4. Put anything the member should read next in nextRecommendation.

Notes

  • Retrying with the same Idempotency-Key returns the original closure and writes no second record, audit entry, event or cancellation.
  • One enrollment has at most one closure. Closing is final: there is no reopen endpoint, and re-enrolling the same person creates a new enrollment.
  • The reason and the summary are written by your team, for your team. The member sees the result, the date and nextRecommendation — never those two texts.
  • Closing does not move the person to alumni, renew anything, or sell a new offer. Those remain separate decisions.
  • A closed enrollment does not block a new enrollment of the same person on the same program.
  • The closure, its audit entry and the enrollment.closed event are written in one transaction, together with the cancellation of the current action and its reminder, the closing of planned interventions, and the end of an open pause.
  • An open blocker stays open: a coach can still resolve it after the closure.
  • Fixed program dates and the accumulated pause shift are never changed.
  • No email or notification is sent by this endpoint.

Related

  • Pause an enrollment
  • Resume an enrollment
  • Read an enrollment timeline