Enroll a trainee in a journey

POST/api/public/journeys/{journeyId}/enroll

Enroll one trainee into an active journey. Identify them with traineeId (their active coaching period is used) or with escortId to pick a specific coaching period. A trainee already enrolled in another journey returns 409 unless replaceExisting is true. Enrollments are limited to one per second per coach, so space out loops that enroll many trainees.

Authentication

Requires an API key, sent as Authorization: Bearer cp_live_....

API keys carry scopes. Get the catalog of scopes and webhook events lists every scope.

Path parameters

Path parameters
NameTypeDescription
journeyIdrequiredstring

Header parameters

Header parameters
NameTypeDescription
Idempotency-Keystring

Optional. Send a unique key (e.g. a UUID) to make this POST safe to retry. The same key within 24h returns the original result instead of creating a duplicate.

Request body

application/json, required

Request body fields
NameTypeDescription
traineeIdstring

The trainee to enroll, resolved to their active coaching period. Send this or escortId.

escortIdstring

The coaching period to enroll. Send this or traineeId when you need a specific one.

startDateShiftDaysinteger

Shift the journey start by this many days. Negative values start it in the past, so earlier steps fire immediately.

startAtStepIdstring

Begin at this step instead of the first one.

replaceExistingboolean

Cancel the trainee's current enrollment in another journey instead of returning 409.

Request examples

cURL
curl --request POST \
  --url 'https://api.coach-platform.com/api/public/journeys/<journeyId>/enroll' \
  --header 'Authorization: Bearer cp_live_...' \
  --header 'Content-Type: application/json' \
  --data '{
  "traineeId": "<string>"
}'
JavaScript (fetch)
const response = await fetch('https://api.coach-platform.com/api/public/journeys/<journeyId>/enroll', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer cp_live_...',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "traineeId": "<string>"
  }),
});

const data = await response.json();

Responses

201 Created

Example body (application/json)
{
  "data": {},
  "warnings": [
    {
      "field": "<string>",
      "message": "<string>"
    }
  ]
}
Response fields (4)
Response fields
NameTypeDescription
dataobject
warningsobject[]

Non-fatal problems with follow-up writes. The resource was created, but each listed field was not applied.

warnings[].fieldstring
warnings[].messagestring

Error responses

  • 400 Bad Request
  • 401 Unauthorized
  • 403 Forbidden
  • 404 Not Found
  • 409 Conflict
  • 429 Too Many Requests
  • 500 Internal Server Error

These statuses share the same response body.

Example body (application/json)
{
  "error": {
    "code": "<string>",
    "message": "<string>",
    "fix": "<string>",
    "details": {},
    "retryAfterMs": 123
  }
}
Error fields (6)
Error fields
NameTypeDescription
errorobject
error.codestring
error.messagestring
error.fixstring | null
error.detailsobject | null
error.retryAfterMsnumber | null

This page is also available as Markdown. Browse it in the interactive explorer or download the OpenAPI spec.