Journeys

A journey is a sequence of content (courses, handbooks, forms, checklists) employees work through — the onboarding flow, an optional preboarding journey that has to be completed before onboarding unlocks, 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.
typepreboarding, onboarding, custom or offboarding. Any other value returns 422.
sinceISO 8601 — filter by created_at.
page, per_pageStandard pagination — per_page max 50.

Journeys are ordered preboarding first, then onboarding, 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+02:00",
    "created_at": "2026-05-20T09:00:00+02:00",
    "updated_at": "2026-06-01T10:00:00+02:00"
  }
}
FieldNotes
typepreboarding (completed before onboarding unlocks), onboarding (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.

Preboarding

Companies with preboarding enabled have one preboarding journey: content employees must complete, for example compliance training, before their onboarding journey unlocks. It only appears in the API while preboarding is enabled for the company. Otherwise the list leaves it out and GET /journeys/{id} returns 404. It is assigned and reported like a custom journey, but only to employees who registered after it was first published, and has no due_at.

While an employee still has the preboarding journey to complete, their onboarding journey is locked: its assigned_at and due_at are null and is_overdue is false. When they complete the preboarding journey and onboarding unlocks, onboarding's assigned_at is the unlock date and its due_at counts from there.

A journey's users

GET /journeys/{id}/users returns every user the journey is currently assigned to, sorted by first and last name, 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 or already-terminated users, and no users excluded from statistics. Unregistered (invited) users are left out too, unless the company has chosen to count invited employees in its statistics. This is the same pool /stats/academy/journeys counts, so the two surfaces agree.
  • The onboarding flow is assigned to every such employee.
  • Preboarding, 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 (the preboarding journey never has), whose days-after-hire trigger date has been reached, and who meet the journey's age restriction when the company uses age restrictions (a user without a date of birth never does).
{
  "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+02:00",
        "due_at": "2026-08-15T09:00:00+02: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+02:00",
        "due_at": "2026-08-17T08:00:00+02:00",
        "completed_at": "2026-08-10T14:22:00+02:00",
        "is_overdue": false
      }
    }
  ]
}

A user's journeys

GET /users/{id}/journeys returns the published journeys assigned to a user, in the list order above, with the same status fields flattened onto each journey. Not paginated. Returns 404 for kiosk, bot, shadow, deactivated and deleted users, and for an unknown id.

{
  "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+01:00",
      "created_at": "2025-01-10T08:00:00+01:00",
      "updated_at": "2026-05-02T11:30:00+02:00",
      "has_completed": false,
      "assigned_at": "2026-08-01T09:00:00+02:00",
      "due_at": "2026-08-15T09:00:00+02: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+02:00",
      "created_at": "2026-05-20T09:00:00+02:00",
      "updated_at": "2026-06-01T10:00:00+02:00",
      "has_completed": false,
      "assigned_at": "2026-08-31T00:00:00+02: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), and null while a preboarding journey still locks it. 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), and for an age-restricted journey no earlier than the day they reached the age.
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.