Data model

What each object in the API holds, how objects connect, and the values their status fields take. For the complete list of fields on every type, browse the full schema on Apollo Studio.

Fields every object has

Every object shares these fields, so they're not repeated in the tables below:

FieldWhat it holds
idThe item's ID: a UUID, used in item(id:) queries and in update mutations.
companyIdThe company the item belongs to. Required when you create anything.
stateIdACTIVE, or DELETED once someone deletes it. Filter on ACTIVE to match the app.
createdAt, updatedAtWhen the item was created and last changed (UTC).
lastUpdatedByUserIdWho changed it last, as a user ID. Follow lastUpdatedByUser for their name.

In the tables, required means you must send the field when you create the item.

Users and teams

users are the people in your company. A person has a different user ID in each company they belong to.

FieldWhat it holds
firstName, lastName, email, jobTitleWho they are.
userPermissionIdTheir role: OWNER, ADMIN, MANAGER, TEAMMEMBER, OBSERVER, IMPLEMENTER and others. See the userPermissions list.
userStatusIdACTIVE, or INACTIVE for people who've been deactivated.
timeZone, languageIdTheir settings, such as Europe/Dublin and en.

teams are the teams in your company. isLeadership is true for the Leadership Team. A team's people are in usersOnTeams, a linking list with one record per person per team:

GraphQL
query {
  teams(filter: { stateId: { equalTo: "ACTIVE" } }) {
    nodes {
      id
      name
      isLeadership
      usersOnTeams(filter: { stateId: { equalTo: "ACTIVE" } }) {
        nodes { user { id firstName lastName } }
      }
    }
  }
}

To add someone to a team, create a usersOnTeam with their userId, the teamId and your companyId. To take them off, set its stateId to DELETED.

To-dos

todos are 7-day action items, each owned by one person on one team.

FieldWhat it holdsRequired
nameThe To-do itself
descDetails, as HTML. Send "" for none.Yes
teamIdThe team it belongs toYes
userIdWho owns it
todoStatusIdTODO (open) or COMPLETE (done)Yes
dueDateYYYY-MM-DD
priorityNoPriority; send 999 for noneYes
typeteam, or private for a private To-do
meetingIdThe meeting it was raised inif any
statusUpdatedAtWhen its status last changed

Follow team, user, todoStatus and meeting for the related items.

Issues

issues are the Issues List: things to discuss and solve (IDS™).

FieldWhat it holdsRequired
name, descThe Issue and its details (HTML)
teamIdThe team whose list it's onYes
userIdWho raised or owns itYes
issueStatusIdTODO (not solved, the default) or COMPLETE (solved)
typeshort-term (this week's list) or long-term (the parking lot)
numberThe Issue's number, as shown in the app
priorityNo1 to 3 for a top-three priority, 999 for none
meetingIdThe meeting it was raised inif any

Issue IDs are strings rather than UUIDs, so use String! for them in variables.

Rocks and Milestones

rocks are 90-day priorities.

FieldWhat it holdsRequired
nameThe Rock
descDetails, as HTML. Send "" for none.Yes
userIdWho owns itYes
dueDateYYYY-MM-DDYes
rockStatusIdONTRACK, OFFTRACK, COMPLETE (done) or INCOMPLETE (not done)Yes
typecompany or personal (an individual Rock)
isArchivedtrue once the Rock has been archived, usually at the end of its quarter

A Rock can be shared with several teams, so it has no teamId. The link is in teamsOnRocks, with one record per team per Rock. To get one team's Rocks, look up the Rock IDs first:

GraphQL
query TeamRocks($teamId: UUID!) {
  teamsOnRocks(filter: { teamId: { equalTo: $teamId }, stateId: { equalTo: "ACTIVE" } }) {
    nodes { rockId }
  }
}

Then fetch those Rocks, with their Milestones:

GraphQL
query RocksById($ids: [UUID!]) {
  rocks(
    filter: { id: { in: $ids }, stateId: { equalTo: "ACTIVE" }, isArchived: { equalTo: false } }
    orderBy: DUE_DATE_ASC
  ) {
    nodes {
      id
      name
      dueDate
      rockStatus { name }
      user { firstName lastName }
      milestones(filter: { stateId: { equalTo: "ACTIVE" } }, orderBy: DUE_DATE_ASC) {
        nodes { name dueDate milestoneStatusId }
      }
    }
  }
}

When you create a Rock, create its teamsOnRock link in the same request, or it won't appear on any team. Creating and updating data has the full example.

milestones are the steps of a Rock. Each has a rockId, name, dueDate, userId and milestoneStatusId (TODO or COMPLETE). rockId, dueDate and userId are required.

Headlines

headlines are the good news and updates shared in meetings.

FieldWhat it holdsRequired
name, descThe Headline and its details (HTML)name: Yes
teamIdThe team it's shared withYes
userIdWho shared itYes
headlineStatusIdDISCUSS (not shared yet), DISCUSSED (shared) or BACKLOG
isCascadingMessagetrue for a Cascading Message rather than a Headline

Scorecards

A Scorecard is made of two objects:

  • Measurables (dataFields) are the rows: the number, who owns it and its goal.
  • Values (dataValues) are the cells: one number per measurable per period.
Measurable fieldWhat it holds
name, descWhat's measured
userIdWho owns the number
typeHow often it's measured: WEEKLY, MONTHLY, QUARTERLY or ANNUALLY
unitTypenumber, percentage, currency, time or yes/no
goalTarget, unitComparisonThe goal, such as 150 with >=. Comparisons: >=, <=, =, >, <. A range uses goalTargetEnd too.
goalCurrencyThe currency symbol for currency measurables, such as $
dataFieldStatusIdACTIVE, or ARCHIVED once archived
formulaSet when the number is calculated from other measurables

Like Rocks, measurables can be on several teams. The link is in teamsOnDataFields, with a teamId and a dataFieldId.

Value fieldWhat it holdsRequired
dataFieldIdThe measurable it belongs toYes
startDateThe first day of the period, YYYY-MM-DD (see below)Yes
valueThe number, sent as a string, such as "42" or "98.5"
noteA note on this value
customGoalTargetA different goal for just this period

startDate must be the exact start of the measurable's period, or the value is refused:

Measurable typestartDate must be
WEEKLYA Monday, such as 2026-11-09 for the week of 12 November
MONTHLYThe 1st of the month
QUARTERLYThe first day of one of your company's quarters (by default 1 January, 1 April, 1 July and 1 October; your company may use different dates)
ANNUALLY1 January

There's one value per measurable per period. To change a number that's already there, update it rather than creating another. Recipes shows the full pattern.

Meetings

Meetings come in two parts:

  • meetingInfos are the recurring meetings you set up, such as a team's weekly Level 10 Meeting™. Each has a name, a teamId, an ownerUserId and the agenda it follows (meetingAgenda).
  • meetings are each time it takes place, with its date, meetingInfoId, meetingStatusId (NOT-STARTED, STARTED, PAUSED or FINISHED), startTime, endTime and averageRating.

To-dos, Issues and Headlines raised in a meeting carry its meetingId, so you can list what came out of one:

GraphQL
query MeetingOutcomes($meetingId: UUID!) {
  meeting(id: $meetingId) {
    date
    averageRating
    todos(filter: { stateId: { equalTo: "ACTIVE" } }) { nodes { name user { firstName } } }
    issues(filter: { stateId: { equalTo: "ACTIVE" } }) { nodes { name issueStatusId } }
  }
}

Comments

comments are the comments on Rocks, To-dos, Issues, Headlines, Scorecard measurables and processes. Each has:

  • objectId: the ID of the item it's on.
  • type: what kind of item that is: rocks, todos, issues, headlines, dataFields (Scorecard measurables) or processes.
  • text: the comment, as HTML.
  • userId: who wrote it.

To get the comments on an Issue:

GraphQL
query IssueComments($issueId: String!) {
  comments(
    filter: { objectId: { equalTo: $issueId }, type: { equalTo: "issues" }, stateId: { equalTo: "ACTIVE" } }
    orderBy: CREATED_AT_ASC
  ) {
    nodes { text createdAt user { firstName lastName } }
  }
}

To add one, create a comment with objectId, type, text, userId and companyId.

Status values

Statuses are short IDs. Their display names, as the app shows them, are in a list for each kind, such as rockStatuses { nodes { id name } }.

FieldValues
todoStatusIdTODO (To-do), COMPLETE (Done)
issueStatusIdTODO (Not solved), COMPLETE (Solved)
rockStatusIdONTRACK (On-track), OFFTRACK (Off-track), COMPLETE (Done), INCOMPLETE (Not done)
milestoneStatusIdTODO (To-do), COMPLETE (Complete)
headlineStatusIdDISCUSS (Not shared), DISCUSSED (Shared), BACKLOG (Backlog)
meetingStatusIdNOT-STARTED, STARTED, PAUSED, FINISHED
dataFieldStatusIdACTIVE, ARCHIVED
userStatusIdACTIVE, INACTIVE
stateId (all objects)ACTIVE, DELETED

Everything else

The API also covers the V/TO™ (visions and their entities), the Accountability Chart™ (accCharts, accChartSeats), processes, the People Analyzer™, SWOT items and more. These follow the same patterns, and their fields are listed in the full schema.