• 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. Coaching sessions
  4. Record a coaching session
HomeBlogDocumentationPricingContact

Record a coaching session

PreviousGet a coaching sessionNextAppend coaching session entries
On this page
AuthorizationOrganization roleBusiness authorizationPath parametersRequest headersRequest bodyExampleResponseResponse fieldsExample responseNotesRelatedScheduling retry contract

POST /api/v1/enrollments/{enrollmentId}/coaching-sessions

Records one coaching session on one enrollment, with its notes, decisions and commitments. At most one commitment may be promoted to the member's next action; the promotion replaces the current one. Everything is append-only: nothing recorded here is ever updated or deleted.

Authorization

Organization role

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

Business authorization

RequirementRule for this endpoint
Business rolecoach scoped to this enrollment, or program_director scoped to the organization
Resource scopeEnrollment of the organization attached to the API key
ParticipationThe coach must be assigned to this enrollment
Resource stateThe enrollment must be active

A platform-wide role grants nothing here. An enrollment of another organization, or one outside the caller's scope, 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 recording intention
X-Correlation-IdnoCaller correlation id, returned or generated

Request body

FieldTypeRequiredNullableDescription
heldAtISO 8601 stringyesnoWhen the session is held; a future instant schedules it
entriesarrayyesnoAt least one entry
entries[].kindstringyesnonote, decision or commitment
entries[].visibilitystringyesnocoach_only or shared_with_member
entries[].bodystringyesno1 to 4000 characters; the title for a commitment
entries[].ownerTypestringcommitments onlyyesmember or coach
entries[].ownerUserIdUUIDcoach owner onlyyesMust be a coach assigned to this enrollment
entries[].dueAtISO 8601 stringcommitments onlyyesMust be in the future
entries[].promotebooleannonoAt most one entry in the request may set it
json
{
  "heldAt": "2026-09-01T14:30:00.000Z",
  "entries": [
    {
      "kind": "note",
      "visibility": "coach_only",
      "body": "Still hesitating between industrial SMEs and consultancies."
    },
    {
      "kind": "decision",
      "visibility": "shared_with_member",
      "body": "Focus on industrial SMEs until the end of the month."
    },
    {
      "kind": "commitment",
      "visibility": "shared_with_member",
      "body": "Build a list of 50 qualified industrial SMEs",
      "ownerType": "member",
      "dueAt": "2026-09-08T21:59:00.000Z",
      "promote": true
    }
  ]
}

Example

bash
curl -X POST "$COHORTE_API_BASE_URL/api/v1/enrollments/ENROLLMENT_ID/coaching-sessions" \
  -H "x-api-key: $COHORTE_API_KEY" \
  -H "Idempotency-Key: coaching-session-2026-09-01" \
  -H 'Content-Type: application/json' \
  -d '{"heldAt":"2026-09-01T14:30:00.000Z","entries":[{"kind":"note","visibility":"coach_only","body":"Short debrief."}]}'

Response

  • 201 Created — the session and its entries were recorded.
  • 200 OK — the same Idempotency-Key replayed the original recording.
  • 400 Bad Request — missing Idempotency-Key, invalid JSON, invalid entry, a past deadline, two promoted commitments, an inactive enrollment, or a blocker escalation holding the current action.
  • 401 Unauthorized — the key is missing, invalid, or no longer attached to a member.
  • 403 Forbidden — the bearer cannot document this enrollment.
  • 404 Not Found — the enrollment is unknown or belongs to another organization.
  • 409 Conflict — the current action changed while the session was being recorded.

Response fields

FieldTypeNullableDescription
successbooleannotrue for a successful request
replayedbooleannotrue when the idempotency key replayed a recording
data.idUUIDnoCoaching session identifier
data.enrollmentIdUUIDnoEnrollment the session belongs to
data.heldAtISO 8601 stringnoWhen the session is held, in UTC
data.recordedByUUIDnoAccount that recorded the session
data.recordedByNamestringyesDisplay name of that account
data.recordedAtISO 8601 stringnoRecording time in UTC
data.promotedNextActionIdUUIDyesNext action created or replaced by the promotion
data.entries[].idUUIDnoEntry identifier
data.entries[].kindstringnonote, decision or commitment
data.entries[].visibilitystringnocoach_only or shared_with_member
data.entries[].bodystringnoEntry content
data.entries[].ownerTypestringyesmember or coach on a commitment
data.entries[].ownerUserIdUUIDyesOwning coach on a commitment
data.entries[].dueAtISO 8601 stringyesCommitment deadline in UTC
data.entries[].promotedNextActionIdUUIDyesSet on the promoted commitment only
data.entries[].supersedesEntryIdUUIDyesEntry this one replaces
data.entries[].addedAtISO 8601 stringnoWhen the entry was appended, in UTC
correlationIdUUIDnoCorrelation id for support

Example response

json
{
  "success": true,
  "replayed": false,
  "data": {
    "id": "9f2c0a1e-0000-4000-8000-000000000000",
    "enrollmentId": "4af4cd8d-0000-4000-8000-000000000000",
    "heldAt": "2026-09-01T14:30:00.000Z",
    "recordedBy": "1b7d2f30-0000-4000-8000-000000000000",
    "recordedByName": "Karim Haddad",
    "recordedAt": "2026-09-01T14:32:00.000Z",
    "promotedNextActionId": "6d41ab55-0000-4000-8000-000000000000",
    "entries": [
      {
        "id": "3ac91b70-0000-4000-8000-000000000000",
        "kind": "commitment",
        "visibility": "shared_with_member",
        "body": "Build a list of 50 qualified industrial SMEs",
        "ownerType": "member",
        "ownerUserId": null,
        "dueAt": "2026-09-08T21:59:00.000Z",
        "promotedNextActionId": "6d41ab55-0000-4000-8000-000000000000",
        "supersedesEntryId": null,
        "addedAt": "2026-09-01T14:32:00.000Z"
      }
    ]
  },
  "correlationId": "0f6b1d92-0000-4000-8000-000000000000"
}

Notes

  • Retrying with the same Idempotency-Key returns the original session and creates no second entry, audit record or event.
  • The session, its entries and the promoted next action are written in one transaction: if the promotion is refused, nothing is recorded.
  • Promotion replaces the member's current next action. When that action belongs to a blocker escalation, the whole request is refused with 400; record the session again without a promotion.
  • The mutation emits coaching.session_recorded, and coaching.commitment_promoted when a commitment was promoted. No email or notification is sent by this endpoint.

Related

  • List coaching sessions
  • Get a coaching session
  • Record live attendance

Scheduling retry contract

Keep one idempotency key for one normalized intention. Current authorization is checked again on retry. A different payload or resource with that key, or an older key whose intention cannot be verified, returns 409 conflict without another mutation. Inspect the original outcome before creating a new command. Identical retries do not resend notifications.