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-10and 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
AppFeatureID you pass astemplate_id. - As an authorized partner: Use the internal
app_featuresquery 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
TemplateInstallationStatusResultdescribing the current state of a template installation, ornullif theprocess_idis 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
| Argument | Type | Description | Enum Values |
|---|---|---|---|
| process_id | ID! | The value returned by the use_template mutation. |
Fields
| Field | Type | Description | Enum 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_complete | Boolean! | Shorthand for status == COMPLETE. | |
| is_failed | Boolean! | Shorthand for status == FAILED. | |
| process_id | ID! | Echo of the input process_id. | |
| status | TemplateInstallationStatus! | 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
| Argument | Type | Description | Enum Values |
|---|---|---|---|
| template_id | Int! | The AppFeature ID of the template to install. | |
| board_kind | BoardKind | The visibility kind of the created board(s). | privatepublicshare |
| 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_complete | String | A webhook URL that monday.com calls with the created board/workspace IDs when the installation completes. | |
| destination_folder_id | Int | The ID of the folder to install the template into. | |
| destination_folder_name | String | The name of the folder to create for a multi-board template. | |
| destination_name | String | The name for the created instance. | |
| destination_workspace_id | Int | The ID of the workspace to install the template into. Defaults to the Main Workspace. | |
| skip_target_folder_creation | Boolean | When true, skips folder creation for multi-entity templates. | |
| solution_extra_options | JSON | Additional installation options for the template. |
Polling pattern
The installation runs asynchronously, so the recommended flow is:
- Call
use_templateand store the returnedprocess_id. - Poll
template_installation_statuswith thatprocess_idevery 2–5 seconds. - Stop polling when
is_completeistrue,is_failedistrue, or the result isnull(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_idsis populated incrementally as boards are created, but duringIN_PROGRESSthey 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 untilstatus == COMPLETE. - Records expire after 1 hour. Polling
template_installation_statusmore than 1 hour after theuse_templatecall returnsnull. - Timeout safety net. A stuck
IN_PROGRESSrecord is converted toFAILEDafter 30 minutes to prevent indefinite polling. - Cross-account security. Querying a
process_idthat belongs to a different account returnsnull(indistinguishable from an expired or invalidprocess_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:
| Error | Description |
|---|---|
ManagedTemplateMaxInstancesForTemplateError | The account reached the per-template instance limit. |
ManagedTemplateMaxInstancesForAccountError | The account reached the global template instance limit. |
USER_UNAUTHORIZED (HTTP 403) | The user lacks access to the requested template or the workspaces:write scope. |
