• 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. Transfer an enrollment
HomeBlogDocumentationPricingContact

Transfer an enrollment

PreviousExtend a deadlineNextClose an enrollment
On this page
AuthorizationOrganization roleBusiness authorizationPath parametersRequest headersRequest bodyExampleResponseResponse fieldsExample responseAgent recipeNotesRelated

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

Moves one participation to another cohort of the same program. The enrollment itself does not change: history, progress, deliverables, reviews, attendance, current action, deadlines and the assigned coach all stay attached to it. Only the cohort context changes, on the date you choose — which is what live sessions, the community space and cohort dashboards read from that moment on.

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
Resource scopeEnrollment and cohort of the organization attached to the API key
ParticipationNot applicable — an assigned coach cannot transfer a participation
Resource stateThe enrollment must not be closed; the target cohort must accept an entry

Moving someone to another promotion is an operating decision, so it takes the same authorization as pausing one: a coach assigned to the enrollment can document sessions and plan interventions, but cannot transfer. A platform-wide role grants nothing here. An enrollment or a cohort 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 transfer intention
X-Correlation-IdnoCaller correlation id, returned or generated

Request body

FieldTypeRequiredNullableDescription
toCohortIdUUIDyesnoTarget cohort: same program, still accepting an entry, different from the current one
reasonstringyesno1 to 2000 characters; visible to your team and in the enrollment history, not to the member
effectiveAtISO 8601 stringnonoWhen the new cohort context starts. Defaults to now; a past value is accepted, a future one is refused
capacityOverrideobjectnonoEnter a full target cohort anyway: {"enabled": true, "reason": "…"}, reason 1 to 500 characters. Refused unless the bearer can manage enrollments. Recorded in the audit

A cohort is a valid target when all three hold:

  • it belongs to the same program as the enrollment;
  • it still accepts an entry — a completed or archived cohort does not;
  • it is not the cohort the enrollment is already in.

A cohort still in preparation is a valid target. Its content stays locked for the member until that cohort opens, exactly as it would for a new enrollment.

json
{
  "toCohortId": "3b0e51a4-0000-4000-8000-000000000000",
  "effectiveAt": "2026-09-01T09:00:00.000Z",
  "reason": "Resumes with the next promotion."
}

Example

bash
curl -X POST "$COHORTE_API_BASE_URL/api/v1/enrollments/ENROLLMENT_ID/transfer" \
  -H "x-api-key: $COHORTE_API_KEY" \
  -H "Idempotency-Key: transfer-2026-09-01" \
  -H 'Content-Type: application/json' \
  -d '{"toCohortId":"COHORT_ID","reason":"Resumes with the next promotion."}'

Response

  • 201 Created — the participation now belongs to the target cohort.
  • 200 OK — the same Idempotency-Key replayed the original transfer; nothing was written a second time.
  • 400 Bad Request — missing Idempotency-Key, invalid JSON, an empty reason, or an effective date in the future.
  • 401 Unauthorized — the key is missing, invalid, or no longer attached to a member.
  • 403 Forbidden — the bearer cannot change the lifecycle of enrollments in this organization.
  • 404 Not Found — the enrollment or the target cohort is unknown, or belongs to another organization.
  • 409 Conflict — the participation is closed, the target cohort belongs to another program, no longer accepts an entry, or is the one the enrollment is already in.

Response fields

FieldTypeNullableDescription
successbooleannotrue for a successful request
replayedbooleannotrue when the idempotency key replayed a transfer
data.idUUIDnoTransfer identifier
data.enrollmentIdUUIDnoEnrollment that moved
data.fromCohortIdUUIDyesCohort left behind; null when there was none
data.fromCohortNamestringyesDisplay name of that cohort
data.toCohortIdUUIDnoCohort the enrollment now belongs to
data.toCohortNamestringyesDisplay name of that cohort
data.effectiveAtISO 8601 stringnoWhen the new cohort context starts, in UTC
data.reasonstringnoReason given for the transfer
data.transferredByUUIDnoAccount that decided the transfer
data.transferredByNamestringyesDisplay name of that account
data.createdAtISO 8601 stringnoWhen the transfer was recorded, in UTC
correlationIdUUIDnoCorrelation id for support

Example response

json
{
  "success": true,
  "replayed": false,
  "data": {
    "id": "7c1d9a20-0000-4000-8000-000000000000",
    "enrollmentId": "4af4cd8d-0000-4000-8000-000000000000",
    "fromCohortId": "0f2a77b1-0000-4000-8000-000000000000",
    "fromCohortName": "Autumn promotion",
    "toCohortId": "3b0e51a4-0000-4000-8000-000000000000",
    "toCohortName": "Summer 2026 promotion",
    "effectiveAt": "2026-09-01T09:00:00.000Z",
    "reason": "Resumes with the next promotion.",
    "transferredBy": "6d41ab55-0000-4000-8000-000000000000",
    "transferredByName": "Paul Vidal",
    "createdAt": "2026-09-01T09:00:05.000Z"
  },
  "correlationId": "0f6b1d92-0000-4000-8000-000000000000"
}

Agent recipe

  1. List the cohorts of the enrollment's program and keep those that still accept an entry, excluding the one the member is already in.
  2. Transfer with a reason your team will read later, and an effective date if the move was agreed earlier.
  3. Read the enrollment timeline to confirm the move — it now carries a "transferred" entry naming both cohorts.

Notes

  • A paused participation can be transferred, and that is the main use case: someone who interrupted their journey resumes with the next promotion. Only a closed participation is refused. The transfer does not resume a pause — that is a separate call.
  • Capacity is not checked. There is no headcount or seat limit anywhere in the product yet, so a target cohort is never refused for being full. If your process caps a promotion, enforce it before calling.
  • No notification, email or message is sent by this endpoint, to the member or to anyone else.
  • The coach assignment, deadlines, current action, open blockers, planned interventions and recorded attendance are untouched. Attendance already recorded on a session of the previous cohort stays: it belongs to the participation, not to the cohort.
  • What follows the member immediately, because it is read from the current cohort: visible live sessions, the cohort community space, the content lock that depends on the cohort state, and the cohort dashboards. The enrollment appears in the target cohort's views with its full history and leaves the previous one.
  • Retrying with the same Idempotency-Key returns the original transfer and writes no second record, audit entry or event.
  • One enrollment can be transferred as many times as needed, including back to a cohort it already left. Each move is recorded with its own effective date, so the whole path stays readable.
  • The transfer, its audit entry and its domain event are written in one transaction.

Related

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