GET /api/v1/programs/{programId}/milestones
Returns the milestones of a program, in the order of its main path. Archived milestones are included, at their place: the operator view keeps showing them.
| Role in the organization | This endpoint |
|---|---|
OWNER | Allowed |
ADMIN | Allowed |
MEMBER | Conditional — with the program_director business role scoped to the organization, or as coach of this program |
| Parameter | Type | Required | Description |
|---|---|---|---|
programId | UUID | yes | Program visible from the key's school |
| Header | Required | Description |
|---|---|---|
x-api-key | yes | API key created for this school |
X-Correlation-Id | no | Caller correlation id, returned or generated |
curl "$COHORTE_API_BASE_URL/api/v1/programs/$PROGRAM_ID/milestones" \
-H "x-api-key: $COHORTE_API_KEY"200 OK — the list, in path order, possibly empty.400 Bad Request — programId is not a UUID.401 Unauthorized — the key is missing, invalid, or no longer attached to a member.403 Forbidden — the bearer is not OWNER, ADMIN, an organization-scoped program_director of this school, nor the coach of this program.| Field | Type | Nullable | Description |
|---|---|---|---|
success | boolean | no | true for a successful request |
data[].id | UUID | no | Milestone identifier |
data[].programId | UUID | no | Program that carries it |
data[].title | string | no | What the member must reach |
data[].objective | string | yes | The objective, in full |
data[].expectedProof | string | yes | What the member submits as proof |
data[].successCriteria | string | yes | What makes it a success |
data[].status | string | no | active or archived |
data[].createdAt | ISO 8601 string | no | Creation time, in UTC |
data[].updatedAt | ISO 8601 string | no | Last change, in UTC |
correlationId | UUID | no | Correlation id for support |
There is no position field: the rank of a milestone belongs to its
relation with the path, not to the milestone. The order is the order of this
list.
{
"success": true,
"data": [
{
"id": "2e6a9c14-8b7d-4f3e-a5c2-0f1a2b3c4d5e",
"programId": "9f2c0a1e-4b7d-4c1a-9e3f-2a6b8c0d1e2f",
"title": "First agent in production",
"objective": "Deploy an agent that answers real users.",
"expectedProof": "A public URL and a short demo video.",
"successCriteria": "Three consecutive answers.",
"status": "active",
"createdAt": "2026-09-01T09:00:00.000Z",
"updatedAt": "2026-09-04T17:12:00.000Z"
},
{
"id": "7f3c5b28-4a1e-4d6b-8c93-1a2b3c4d5e6f",
"programId": "9f2c0a1e-4b7d-4c1a-9e3f-2a6b8c0d1e2f",
"title": "Agent with memory",
"objective": null,
"expectedProof": null,
"successCriteria": null,
"status": "active",
"createdAt": "2026-09-01T09:00:00.000Z",
"updatedAt": "2026-09-04T17:12:00.000Z"
}
],
"correlationId": "0f6b1d92-5c3e-4a8b-9d71-3e2f4a6b8c10"
}