# Update a coaching period

`PATCH https://api.coach-platform.com/api/public/escorts/{escortId}`

Update a coaching period. Only supplied fields change. Plan reassignment is not supported here, but the active plan or menu can be detached: send removeTrainingPlan or removeNutritionPlan as true to leave the trainee without an active training plan or nutrition menu (the plan or menu itself is kept and moves to the trainee's history). Send skipRegistrationForms to stop or resume asking the trainee to fill registration forms in the app.

- Resource: Escorts
- Authentication: API key in the `Authorization: Bearer cp_live_...` header
- HTML version: https://www.coach-platform.com/docs/api/reference/patch-escorts-escort-id
- OpenAPI spec: https://www.coach-platform.com/openapi.json

## Path parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `escortId` | string | Yes |   |

## Header parameters

| Name | Type | Required | Description |
|---|---|---|---|
| `Idempotency-Key` | string | No | 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

Content type: `application/json`. Required.

| Field | Type | Required | Description |
|---|---|---|---|
| `goal` | string | No |   |
| `startDate` | string | No |   |
| `endDate` | string | No |   |
| `months` | number | No |   |
| `price` | number | No |   |
| `paymentDate` | string | No |   |
| `paymentMethod` | string | No | Allowed values: `Cash`, `Credit card`, `Bank transfer`, `Other`. |
| `paymentNumber` | number | No |   |
| `escortMeetingType` | string | No | Allowed values: `Online`, `In person`. |
| `onlineEscort` | string | No |   |
| `inPersonEscort` | string | No |   |
| `cardioDays` | number | No |   |
| `cardioTime` | number | No |   |
| `trainingDays` | number | No |   |
| `dailyStepsTarget` | number | No |   |
| `note` | string | No | Append a note to the coaching period. |
| `skipRegistrationForms` | boolean | No | true: the trainee is not asked to fill registration forms in the app during this coaching period. false: the app asks the trainee to fill every active registration form aimed at them that they have not filled yet. Defaults to true when omitted on create. This is the same switch as the registration-forms toggle on the trainee profile. It belongs to this coaching period only, and a link to a specific form sent to the trainee keeps working either way. |
| `removeTrainingPlan` | boolean | No | true detaches the active training plan from this coaching period without deleting the plan. The plan moves to the trainee's plan history and the trainee has no active training plan until a new one is assigned. Future scheduled plan changes are kept. Does nothing when no training plan is active. Cannot be combined with assigning a training plan in the same request. |
| `removeNutritionPlan` | boolean | No | true detaches the active nutrition menu from this coaching period without deleting the menu. The menu moves to the trainee's menu history and the trainee has no active nutrition menu until a new one is assigned. Future scheduled menu changes are kept. Does nothing when no nutrition menu is active. Cannot be combined with assigning a nutrition menu in the same request. |

## Responses

| Status | Description |
|---|---|
| `200` OK | Successful response |
| `400` Bad Request |  |
| `401` Unauthorized |  |
| `403` Forbidden |  |
| `404` Not Found |  |
| `409` Conflict |  |
| `429` Too Many Requests |  |
| `500` Internal Server Error |  |

### 200 OK

Content type: `application/json`

| Field | Type | Description |
|---|---|---|
| `data` | object |   |
| `data.id` | string |   |
| `data.coach` | string |   |
| `data.trainee` | object | The escorted trainee. email and phoneNumber are returned only when the key also has the trainees:read scope. |
| `data.trainee.id` | string |   |
| `data.trainee.name` | string |   |
| `data.trainee.email` | string |   |
| `data.trainee.phoneNumber` | string |   |
| `data.status` | string | Allowed values: `pending`, `active`, `canceled`, `completed`, `suspended`. |
| `data.escortType` | string |   |
| `data.startDate` | string<date-time> |   |
| `data.endDate` | string<date-time> \| null | When the coaching period ends. null when the escort runs with no time limit, in which case isUnlimited is true. |
| `data.months` | integer \| null | Duration in months. null when the escort runs with no time limit. |
| `data.isUnlimited` | boolean | True when the escort has no end date. |
| `data.training` | object |   |
| `data.training.activeTrainingPlan` | object \| null |   |
| `data.training.activeTrainingPlan.id` | string |   |
| `data.training.activeTrainingPlan.title` | string |   |
| `data.training.activeTrainingPlan.level` | string |   |
| `data.training.trainingDays` | any |   |
| `data.nutrition` | object |   |
| `data.nutrition.activeNutritionPlan` | object \| null |   |
| `data.nutrition.activeNutritionPlan.id` | string |   |
| `data.nutrition.activeNutritionPlan.title` | string |   |
| `data.nutrition.activeNutritionPlan.level` | string |   |
| `data.skipRegistrationForms` | boolean | true when the trainee is not asked to fill registration forms in the app during this coaching period. Change it with PATCH /escorts/{escortId}. |
| `data.createdAt` | string<date-time> |   |

Example:

```json
{
  "data": {
    "id": "<string>",
    "coach": "<string>",
    "trainee": {
      "id": "<string>",
      "name": "<string>",
      "email": "<string>",
      "phoneNumber": "<string>"
    },
    "status": "pending",
    "escortType": "<string>",
    "startDate": "<date-time>",
    "endDate": "<date-time>",
    "months": 123,
    "isUnlimited": true,
    "training": {
      "activeTrainingPlan": {
        "id": "<string>",
        "title": "<string>",
        "level": "<string>"
      },
      "trainingDays": null
    },
    "nutrition": {
      "activeNutritionPlan": {
        "id": "<string>",
        "title": "<string>",
        "level": "<string>"
      }
    },
    "skipRegistrationForms": true,
    "createdAt": "<date-time>"
  }
}
```

### Error responses 400, 401, 403, 404, 409, 429, 500

Content type: `application/json`

| Field | Type | Description |
|---|---|---|
| `error` | object |   |
| `error.code` | string |   |
| `error.message` | string |   |
| `error.fix` | string \| null |   |
| `error.details` | object \| null |   |
| `error.retryAfterMs` | number \| null |   |

Example:

```json
{
  "error": {
    "code": "<string>",
    "message": "<string>",
    "fix": "<string>",
    "details": {},
    "retryAfterMs": 123
  }
}
```

## Examples

### cURL

```bash
curl --request PATCH \
  --url 'https://api.coach-platform.com/api/public/escorts/<escortId>' \
  --header 'Authorization: Bearer cp_live_...' \
  --header 'Content-Type: application/json' \
  --data '{
  "goal": "<string>"
}'
```

### JavaScript (fetch)

```js
const response = await fetch('https://api.coach-platform.com/api/public/escorts/<escortId>', {
  method: 'PATCH',
  headers: {
    Authorization: 'Bearer cp_live_...',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    "goal": "<string>"
  }),
});

const data = await response.json();
```

## Related endpoints

- [Get a coaching period](https://www.coach-platform.com/docs/api/reference/get-escorts-escort-id/index.md): `GET /api/public/escorts/{escortId}`. Get a coaching period by id.
- [Cancel a coaching period](https://www.coach-platform.com/docs/api/reference/delete-escorts-escort-id/index.md): `DELETE /api/public/escorts/{escortId}`. Cancel a coaching period.
- [Start a coaching period](https://www.coach-platform.com/docs/api/reference/post-escorts/index.md): `POST /api/public/escorts`. Start a new coaching period (escort) for a trainee.
- Previous: [Get a coaching period](https://www.coach-platform.com/docs/api/reference/get-escorts-escort-id/index.md): `GET /api/public/escorts/{escortId}`. Get a coaching period by id.
- Next: [Cancel a coaching period](https://www.coach-platform.com/docs/api/reference/delete-escorts-escort-id/index.md): `DELETE /api/public/escorts/{escortId}`. Cancel a coaching period.
