Status

Learn how to filter by, read, update, and clear the status column on monday boards using the platform API

The status column represents a label designation for your item(s). It's commonly used to track project progress, item states, or any custom labeling system. Each status column contains a collection of indexes with corresponding labels and colors.

The API allows you to read, filter, create, update, and clear status columns across your monday.com boards.

Read a status column

You can query status columns using the column_values object that enables you to return column-specific subfields by sending a fragment in your query.

Before working with status columns, it's important to understand that the API returns different value types depending on your board type:

  • Classic boards: Status columns return StatusValue type
  • Multi-level boards: Status rollup columns return BatteryValue type

This affects how you query and interpret the data, as shown in the examples below.

StatusValue (Classic Boards)

query {
  items (ids:[1234567890, 9876543210]) {
    name
    column_values {
      ... on StatusValue {
        id
        index
        label
        text
        is_done
        label_style {
          color
          is_done
        }
      }
    }
  }
}

StatusValue Fields

You can use the following fields to specify what information to return.

FieldDescription
column Column!The column the value belongs to.
id ID!The column's unique identifier.
index IntThe status index (used for updates).
is_done BooleanWhether the item's status is complete.
label StringThe column's status label value. This returns the current label value, not all possible values.
label_style StatusLabelStyleThe label's color and styling information.
text StringThe column's value as text. Returns null if the column has an empty value.
type ColumnType!The column's type.
update_id IDThe unique identifier of the update attached to the column's status.
updated_at DateThe column's last updated date.
value JSONThe column's JSON-formatted raw value.

BatteryValue (Multi-Level Boards)

This type aggregates status values from sub-items, showing counts for each status type.

query {
  items (ids:[1234567890, 9876543210]) {
    name
    column_values {
      ... on BatteryValue {
        id
        text
        battery_value {
          count
          key
        }
      }
    }
  }
}

BatteryValue Fields

Field

Description

Supported Fields

battery_value [BatteryValueItem!]!

The column's indices and number of occurrences.

count Int!
key ID!

column Column!

The column the value belongs to.

id ID!

The column's unique identifier.

text String

The column's value as text. Returns null if the column has an empty value.

type ColumnType!

The column's type.

value JSON

The column's JSON-formatted raw value.

Filter a status column

Using the items_page object, you can filter a board's items by specific status values.

Filter Options

Compare Values

Description

Operators

The label's ID

Items with a specific label ID. You can find the ID by querying the column's settings.

  • any_of: returns items with the specified index
  • not_any_of: returns items without the specified index

The label's text (as a string)

Items with a specific label.

  • contains_terms: returns items with the specified text value

5

Represents items with empty status values. Empty labels currently use ID 5 by default.

  • any_of: returns items with empty values
  • not_any_of: returns items without empty values

[]

Items with empty values.

  • is_empty: returns items with empty values
  • is_not_empty: returns items without empty values

Examples

Filter by empty status

This example returns all items on the specified board with an empty status value.

query {
  boards(ids: 1234567890) {
    items_page(
      query_params: {
        rules: [
          {
            column_id: "status"
            compare_value: [5]
            operator: any_of
          }
        ]
      }
    ) {
      items {
        id
        name
      }
    }
  }
}

Filter by status label

This example returns all items on the specific board with a "Done" label.

query {
  boards(ids: 1234567890) {
    items_page(
      query_params: {
        rules: [
          {
            column_id: "status"
            compare_value: "Done"
            operator: contains_terms
          }
        ]
      }
    ) {
      items {
        id
        name
        column_values {
          ... on StatusValue {
            label
          }
        }
      }
    }
  }
}

Create a status column

Required scope: boards:write

The create_status_column mutation creates a new status column with strongly typed settings via the API. You can specify which fields to return in the mutation response.

mutation {
  create_status_column(
    board_id: 1234567890
    id: "project_status"
    title: "Project Status"
    defaults: {
      labels: [
        { color: working_orange, label: "On Hold", index: 2}
        { color: done_green, label: "Done", index: 1}
        { color: sky, label: "Working On It", index: 3}
      ]
    },
    description: "The project's status."
  ) {
    description
    id
    title
    settings_str
  }
}

Arguments

ArgumentDescriptionSupported Fields
after_column_id IDThe unique identifier of the column after which the new status column will be created.
board_id ID!The unique identifier of the board where the new status column should be created.
capabilities StatusColumnCapabilitiesInputThe new status column's capabilities configuration. If omitted, defaults apply: on multi-level boards, numeric, date, timeline, and status columns are created with the calculated capability enabled. To override this default on multi-level boards, pass an empty argument to create the column without capabilities.calculated StatusCalculatedCapabilityInput
defaults CreateStatusColumnSettingsInputThe new status column's settings.labels [CreateStatusLabelInput!]!
description StringThe new status column's description.
id StringThe status column's user-specified unique identifier. If not provided, a new ID will be auto-generated. If provided, it must meet the following requirements:
• [1-20] characters in length (inclusive)
• Only lowercase letters (a-z) and underscores (_)
• Must be unique (no other column on the board can have the same ID)
• Can't reuse column IDs, even if the column has been deleted from the board
• Can't be null, blank, or an empty string
title String!The new status column's title.

Update a status column

You can update status columns using either simple strings or JSON strings. Each status column can have a maximum of 40 labels. When updating, you can use either the index value or the label text.

Using index vs label values

  • Index values (recommended): Numeric identifiers that remain consistent regardless of label text changes
  • Label values: The actual text displayed, but may be ambiguous if labels contain numbers

Important: If a label is purely numeric (like "2023" or "100"), you must use the index value instead of the label text to avoid conflicts.

Simple string updates

Using the change_simple_column_value mutation, you can pass either the index or the label value of the status you want to update in the value argument.

Update by index

mutation {
  change_simple_column_value(
    item_id: 9876543210
    board_id: 1234567890
    column_id: "status"
    value: "1"
  ) {
    id
    name
  }
}

Update by label Text

mutation {
  change_simple_column_value(
    item_id: 9876543210
    board_id: 1234567890
    column_id: "status"
    value: "Done"
    create_labels_if_missing: true
  ) {
    id
    name
  }
}

JSON updates

Using the change_multiple_column_values mutation, you can update multiple columns at once.

Update by index (JSON)

mutation {
  change_multiple_column_values(
    item_id: 9876543210
    board_id: 1234567890
    column_values: "{\"status\": {\"index\": 1}}"
  ) {
    id
    name
  }
}

Update by label (JSON)

mutation {
  change_multiple_column_values(
    item_id: 9876543210
    board_id: 1234567890
    column_values: "{\"status\": {\"label\": \"Done\"}}"
    create_labels_if_missing: true
  ) {
    id
    name
  }
}

Clear a status column

You have several options to clear a status column value.

Using change_multiple_column_values

Pass null, an empty string, or an empty object in the column_values argument:

mutation {
  change_multiple_column_values(
    item_id: 9876543210
    board_id: 1234567890
    column_values: "{\"status\": null}"
  ) {
    id
    name
  }
}

Using change_simple_column_value

Pass an empty string in the value argument:

mutation {
  change_simple_column_value(
    item_id: 9876543210
    board_id: 1234567890
    column_id: "status"
    value: ""
  ) {
    id
    name
  }
}

Index values and color mapping

Understanding the relationship between index values, labels, and colors is crucial for working with status columns effectively.

Default index and color mapping

Every status column starts with default index values that correspond to specific colors. Here are the most common default mappings:

IndexDefault LabelDefault ColorColor Code
0(Empty/Blank)Gray#c4c4c4
1DoneGreen#00c875
2Working on itOrange#fdab3d
3StuckRed#e2445c
4(Custom)Blue#0086c0
5(Empty)Gray#c4c4c4

View the complete list of default index values and colors.

Important considerations

While index values remain constant, users can change the colors and labels associated with them. For example:

  • Index 1 might start as "Done" with green color
  • A user could change it to "Completed" with blue color
  • The index remains 1, but the appearance changes

When working across multiple boards, do not assume that the same index will have the same color or label. Each board can have different customizations.

Best Practice: Query the column settings to get current label and color mappings before making assumptions:

query {
  boards(ids: 1234567890) {
    columns(ids: ["status"]) {
      id
      title
      settings_str
    }
  }
}

When to use index vs label

  • Use index values when you need consistency across different boards or when labels might change
  • Use label values when working within a single board and you want human-readable updates
  • Always use index values when the label text is purely numeric