Templates

Learn how to install a template as a background job and poll its installation status using the platform API

monday.com templates let you create ready-made boards (and multi-board solutions) from a predefined structure. The use_template mutation installs a template as a background job and immediately returns a process_id. Because an installation can take anywhere from a few seconds to several minutes, you poll template_installation_status with that process_id to track progress and retrieve the created board IDs.

🚧

Only available in API versions 2026-10 and later

How to find a template ID

There is currently no public query to list installable templates. To get a template_id:

  • From the monday.com UI: Open the template in the Template Center and copy the numeric ID from the page URL. This is the AppFeature ID you pass as template_id.
  • As an authorized partner: Use the internal app_features query if you have access. A public discovery API is not yet available.

Queries

Get template installation status

  • Required scope: none beyond a valid API token
  • Returns a TemplateInstallationStatusResult describing the current state of a template installation, or null if the process_id is unknown, expired, or belongs to a different account
  • Can be queried directly at the root
query {
  template_installation_status(process_id: "c072acaf68e0be9fd0e451f0884383b6") {
    process_id
    status
    is_complete
    is_failed
    board_ids
    board_ids_map {
      source_board_id
      created_board_id
    }
  }
}

Arguments

ArgumentTypeDescriptionEnum Values
process_idID!The value returned by the use_template mutation.

Fields

FieldTypeDescriptionEnum Values
board_ids[ID]!The IDs of the boards created so far. Populated incrementally during IN_PROGRESS.
board_ids_map[BoardIdMapping]!Maps each template (source) board ID to the newly created board ID.source_board_id created_board_id
is_completeBoolean!Shorthand for status == COMPLETE.
is_failedBoolean!Shorthand for status == FAILED.
process_idID!Echo of the input process_id.
statusTemplateInstallationStatus!The lifecycle status of the installation.PENDING IN_PROGRESS COMPLETE FAILED

Mutations

Use template

Required scope: workspaces:write

Installs a template as a background job. Returns a Template containing a process_id. Pass that process_id to template_installation_status to poll for completion and retrieve the created board IDs.

mutation {
  use_template(template_id: 1234567890, destination_workspace_id: 9876543210) {
    process_id
  }
}

Arguments

ArgumentTypeDescriptionEnum Values
template_idInt!The AppFeature ID of the template to install.
board_kindBoardKindThe visibility kind of the created board(s).private
public
share
board_owner_ids[Int]User IDs to set as owners of the created board(s).
board_owner_team_ids[Int]Team IDs to set as owners of the created board(s).
board_subscriber_ids[Int]User IDs to subscribe to the created board(s).
board_subscriber_teams_ids[Int]Team IDs to subscribe to the created board(s).
callback_url_on_completeStringA webhook URL that monday.com calls with the created board/workspace IDs when the installation completes.
destination_folder_idIntThe ID of the folder to install the template into.
destination_folder_nameStringThe name of the folder to create for a multi-board template.
destination_nameStringThe name for the created instance.
destination_workspace_idIntThe ID of the workspace to install the template into. Defaults to the Main Workspace.
skip_target_folder_creationBooleanWhen true, skips folder creation for multi-entity templates.
solution_extra_optionsJSONAdditional installation options for the template.

Polling pattern

The installation runs asynchronously, so the recommended flow is:

  1. Call use_template and store the returned process_id.
  2. Poll template_installation_status with that process_id every 2–5 seconds.
  3. Stop polling when is_complete is true, is_failed is true, or the result is null (the record expired).
# Step 1: start the installation
mutation {
  use_template(template_id: 1234567890, destination_workspace_id: 9876543210) {
    process_id
  }
}

# Step 2: poll until done (every ~3 seconds)
query {
  template_installation_status(process_id: "c072acaf68e0be9fd0e451f0884383b6") {
    status
    is_complete
    is_failed
    board_ids
    board_ids_map {
      source_board_id
      created_board_id
    }
  }
}

A successful COMPLETE response looks like this:

{
  "data": {
    "template_installation_status": {
      "status": "COMPLETE",
      "is_complete": true,
      "is_failed": false,
      "board_ids": ["1234567890", "1234567891", "1234567892"],
      "board_ids_map": [
        { "source_board_id": "9876543210", "created_board_id": "1234567890" },
        { "source_board_id": "9876543211", "created_board_id": "1234567891" },
        { "source_board_id": "9876543212", "created_board_id": "1234567892" }
      ]
    }
  }
}
👍

Poll every 2–5 seconds. Polling more than once per second can hit the rate limit (60 requests per minute per account by default).


Important caveats

  • Board content is not ready during IN_PROGRESS. board_ids is populated incrementally as boards are created, but during IN_PROGRESS they exist as empty shells — no items, broken mirror columns, no automations. It is safe to store the IDs early, but do not read from or write to board content until status == COMPLETE.
  • Records expire after 1 hour. Polling template_installation_status more than 1 hour after the use_template call returns null.
  • Timeout safety net. A stuck IN_PROGRESS record is converted to FAILED after 30 minutes to prevent indefinite polling.
  • Cross-account security. Querying a process_id that belongs to a different account returns null (indistinguishable from an expired or invalid process_id).
  • Rate limiting. Polling is capped at 60 requests per minute per account by default.

Error cases

The use_template mutation can return the following errors:

ErrorDescription
ManagedTemplateMaxInstancesForTemplateErrorThe account reached the per-template instance limit.
ManagedTemplateMaxInstancesForAccountErrorThe account reached the global template instance limit.
USER_UNAUTHORIZED (HTTP 403)The user lacks access to the requested template or the workspaces:write scope.