Journeys

A journey is a sequence of content (courses, handbooks, forms, checklists) employees work through — the onboarding flow, an optional offboarding flow, and custom journeys such as a leadership track. Journeys are assigned through the groups their content is targeted at, optionally gated by a days-after-hire trigger. Use these endpoints to list journeys and read each employee's status on them: when it was assigned, when it is due, when it was completed and whether it is overdue. Aggregated completion totals live under Academy Statistics.

Required scope: read:journeys.

Endpoints

GET
/api/open/v1/journeys

List journeys (paginated)

GET
/api/open/v1/journeys/{id}

Get a single journey

GET
/api/open/v1/journeys/{id}/users

List the users a journey is assigned to, with their status

GET
/api/open/v1/users/{id}/journeys

List the journeys assigned to a user, with their status

List

curl "https://customer.monotree.com/api/open/v1/journeys?is_published=true&type=custom" \
  -H "Authorization: Bearer mono_your_token_here"
Query paramNotes
is_publishedtrue returns published journeys only, false returns drafts only. Omit for all.
typeonboarding, custom or offboarding.
sinceISO 8601 — filter by created_at.
page, per_pageStandard pagination — per_page max 50.

Journeys are ordered onboarding first, then custom journeys in their CMS order, then offboarding.

Response

{
  "data": {
    "id": 7,
    "title": "Leadership Track",
    "description": "Everything a new shift lead needs in the first month.",
    "type": "custom",
    "is_locked": false,
    "days_after_hire": 30,
    "is_published": true,
    "published_at": "2026-06-01T10:00:00+00:00",
    "created_at": "2026-05-20T09:00:00+00:00",
    "updated_at": "2026-06-01T10:00:00+00:00"
  }
}
FieldNotes
typeonboarding (the onboarding flow), custom, or offboarding.
is_lockedSequential journey — items must be completed in order.
days_after_hireWhen set, the journey only becomes available this many days after the employee's hire date.

A journey's users

GET /journeys/{id}/users returns every user the journey is currently assigned to, with their user_state. Not paginated. A draft journey returns an empty list.

Who counts as assigned

  • Real, active employees only — no kiosk, bot, shadow, deactivated, unregistered or already-terminated users. This is the same pool /stats/academy/journeys counts, so the two surfaces agree.
  • The onboarding flow is assigned to every such employee.
  • Custom and offboarding journeys are assigned to the employees who can access at least one of the journey's items, restricted by the journey's own groups if it has any, and whose days-after-hire trigger date has been reached.
{
  "data": [
    {
      "id": 501,
      "name": "Jane Doe",
      "email": "jane@example.com",
      "avatar_url": null,
      "user_state": {
        "has_completed": false,
        "assigned_at": "2026-08-01T09:00:00+00:00",
        "due_at": "2026-08-15T09:00:00+00:00",
        "completed_at": null,
        "is_overdue": true
      }
    },
    {
      "id": 502,
      "name": "Alex Doe",
      "email": "alex@example.com",
      "avatar_url": null,
      "user_state": {
        "has_completed": true,
        "assigned_at": "2026-08-03T08:00:00+00:00",
        "due_at": "2026-08-17T08:00:00+00:00",
        "completed_at": "2026-08-10T14:22:00+00:00",
        "is_overdue": false
      }
    }
  ]
}

A user's journeys

GET /users/{id}/journeys returns the published journeys assigned to a user, with the same status fields flattened onto each journey. Returns 404 for kiosk, bot, shadow and deactivated users.

{
  "data": [
    {
      "id": 3,
      "title": "Onboarding",
      "description": null,
      "type": "onboarding",
      "is_locked": true,
      "days_after_hire": null,
      "is_published": true,
      "published_at": "2025-01-10T08:00:00+00:00",
      "created_at": "2025-01-10T08:00:00+00:00",
      "updated_at": "2026-05-02T11:30:00+00:00",
      "has_completed": false,
      "assigned_at": "2026-08-01T09:00:00+00:00",
      "due_at": "2026-08-15T09:00:00+00:00",
      "completed_at": null,
      "is_overdue": true
    },
    {
      "id": 7,
      "title": "Leadership Track",
      "description": "Everything a new shift lead needs in the first month.",
      "type": "custom",
      "is_locked": false,
      "days_after_hire": 30,
      "is_published": true,
      "published_at": "2026-06-01T10:00:00+00:00",
      "created_at": "2026-05-20T09:00:00+00:00",
      "updated_at": "2026-06-01T10:00:00+00:00",
      "has_completed": false,
      "assigned_at": "2026-08-31T00:00:00+00:00",
      "due_at": null,
      "completed_at": null,
      "is_overdue": false
    }
  ]
}

Status fields

FieldMeaning
has_completedThe user has completed the journey.
assigned_atWhen the journey became available to the user. Onboarding: registration (or the latest onboarding reset). Offboarding: the termination date. Other journeys: the later of the journey's publish date and the day it started applying to the user — their days-after-hire trigger date, else their hire date (registration if no hire date).
due_atThe deadline, if the journey has one. Onboarding: assigned_at + the onboarding weeks limit; offboarding: termination date + the offboarding weeks limit (both CMS settings). null when no limit is configured, and always null for custom journeys.
completed_atWhen the user completed the journey, or null.
is_overduetrue once due_at has passed without a completion.