Menu

API reference · Dashboards

Templates

dashboards · templates · 8 operations

GET/v1/dashboards/templates

List dashboard templates

dashboards.templates.list

ReadIdempotentSince 2026-11-01

Lists the dashboard templates this organization can use: its own (ORGANIZATION, drafts included), the published templates of its workspace when it is an account (INHERITED) and the published system templates (SYSTEM). Each item has its data source slots (what a dashboard created from it has to map), supported platforms, status, version (system templates raise it when saved or published in their editor; the organization's start at 1, or at the version of the template they came from, and go up by one with every dashboards.templates.update, not with the editor's autosave; null when the template has none) page and widget counts, labels (dashboards.labels.list with of: templates) and who created it (created_by with created_by_name). Filter with source; paginated by cursor (limit 50 by default, up to 200; own templates first, by manual position). Use dashboards.templates.get for the pages and widgets.

Scope
dashboards:read
Permission
View the module
MCP tool
dashboards_templates_listOn the full surface; on the compact one, mb_execute_operation with id: "dashboards.templates.list".

Declared cost: up to 702 reads and 0 writes per call (they count against the daily quota).

Parameters

limitintegerqueryoptional

How many templates per page (default 50, at most 200).

Default: 50

cursorstringqueryoptional

The next_cursor of the previous page, to get the next one; omit it for the first page.

sourceenumqueryoptional

Which templates: the organization's (ORGANIZATION), its workspace's published ones (INHERITED), the published system ones (SYSTEM) or all (default).

Values: all, SYSTEM, ORGANIZATION, INHERITED · Default: "all"

Response

dataarray<object>
has_moreboolean
next_cursorstring

Errors

Example

curl "https://api.mb-suite.com/v1/dashboards/templates" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl "https://api.mb-suite.com/v1/dashboards/templates" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/dashboards/templates/{template_id}

Get one dashboard template

dashboards.templates.get

ReadIdempotentSince 2026-11-01

Returns a dashboard template with its version (as in dashboards.templates.list), data source slots, date range, global filters (id, field, operator, value), the filter controls its viewers get (filter_controls: a field name, or {field, label, default_value, sort_field, sort_direction}; send them back as they are with dashboards.templates.update) and its pages with a summary of each widget (type, title, slot or source, metrics, dimensions, grid position). With raw: true it also returns raw_pages, the pages exactly as stored (each widget's internal configuration): use it to back a template up and to restore it with dashboards.templates.update (pages); it is not a stable format, so send back what you read instead of building it by hand. Without source it looks in the organization's own templates, then the workspace's published ones (for an account), then the published system templates. Not found if no reachable template has that id.

Scope
dashboards:read
Permission
View the module
MCP tool
dashboards_templates_getOn the full surface; on the compact one, mb_execute_operation with id: "dashboards.templates.get".

Declared cost: up to 3 reads and 0 writes per call (they count against the daily quota).

Parameters

template_idstringpathrequired

The template id (dashboards.templates.list).

sourceenumqueryoptional

Where to look first (SYSTEM, ORGANIZATION or INHERITED); the others are tried after.

Values: SYSTEM, ORGANIZATION, INHERITED

rawbooleanqueryoptional

true: also the pages exactly as stored (raw_pages), to back them up and write them back with dashboards.templates.update.

Response

idstring

Template id.

sourceenum

SYSTEM, ORGANIZATION or INHERITED (published by the workspace).

Values: SYSTEM, ORGANIZATION, INHERITED

source_org_idstring | null

INHERITED: the workspace it belongs to.

titlestring

Title.

descriptionstring | null

Description.

subtitlestring | null

Subtitle.

statusenum

draft or published (accounts only see and deploy published ones).

Values: draft, published

supported_platformsarray<string>

Platforms it is built for.

data_source_slotsarray<object>

Data slots a dashboard maps to its own sources.

default_data_sourcestring | null

The slot or platform widgets without a source use.

page_countnumber

How many pages.

widget_countnumber

How many widgets.

label_idsarray<string>

Template labels (dashboards.labels.list with of: templates).

positionnumber | null

Manual order in the list.

versionnumber | null

Template version (goes up by one with each update).

created_atnumber | null

Created (epoch ms).

updated_atnumber | null

Last edited (epoch ms).

created_bystring | null

Uid of who created it, or the system label that did.

pagesarray<object>

Pages with a summary of each widget.

date_rangeobject | null

The default period.

compare_date_rangeobject | null

The comparison period, if any.

filtersarray<object>

Global filters.

filter_controlsarray<any>

Filter controls shown to the viewer.

styleobject | null

Cover style.

created_by_namestring | null

Their name («MB Suite» for the system).

raw_pagesarray<object>

Errors

Example

curl "https://api.mb-suite.com/v1/dashboards/templates/{template_id}" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl "https://api.mb-suite.com/v1/dashboards/templates/{template_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/dashboards/templates

Create a dashboard template

dashboards.templates.create

WriteSince 2026-11-01

Creates a draft dashboard template in this organization with a title, optional description, supported platforms and default data source slot, and one empty page. Its widgets are designed in MB Suite's template editor; publish it with dashboards.templates.publish so the workspace's accounts can use it. Returns the template id. Requires edit access to Dashboards.

Scope
dashboards:write
Permission
Edit in the module
MCP tool
dashboards_templates_createOn the full surface; on the compact one, mb_execute_operation with id: "dashboards.templates.create".

Declared cost: up to 0 reads and 1 writes per call (they count against the daily quota).

Parameters

titlestringbodyrequired

Title.

descriptionstringbodyoptional

Description.

supported_platformsarray<string>bodyoptional

Platforms it is built for (google_ads, meta_ads, tiktok…). The platform ids of dashboards.data.sources work too (tiktok and tiktok_organic are the same platform).

default_data_sourcestringbodyoptional

The slot or platform widgets without a source use (the screen sends the main platform).

Response

template_idstring

The new template id.

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/dashboards/templates" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "title": "TITLE"
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/dashboards/templates" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "title": "TITLE"
}'
PATCH/v1/dashboards/templates/{template_id}

Update a dashboard template

dashboards.templates.update

WriteSince 2026-11-01

Updates one of the organization's own templates: title, description, subtitle, labels (ids from dashboards.labels.list with of: templates; an unknown one is label_unknown), cover gradient, its default data source (a slot, one of its platforms or crm; null removes it; default_data_source_invalid otherwise), its global filters, its filter controls and/or its pages; only what you send changes, and every update raises the template's version by one (a template without a version counts as version 1; MB Suite's editor autosave does not change it). filters replaces the template's global filters ([] removes them); they are checked like MB Suite's filter editor: the template needs a default data source whose platform filters, each field is a filterable dimension or a metric of that platform, the operator one that platform runs for that field, and the value fits the operator (a list for in / not_in, [min, max] numbers for between, nothing for is_empty / is_not_empty, a short regex without nested quantifiers); a filter sent back unchanged (same id, field, operator and value) is kept as it was, and one without id gets a new one. filter_controls replaces the dropdowns the dashboard's viewers filter with ([] removes them; up to 20), each a field name or {field, label, default_value (one value or a list), sort_field (name or value), sort_direction (asc or desc)} as dashboards.templates.get returns them; each field must be one the template's platform offers as a filter control (the platform of its default data source, or of the slot that source names; without a default data source, its first supported platform with filter controls, none when its platforms have none, and Google Ads only when it declares no platform) and appear once, or 400 invalid_template_filter_control; a control sent back unchanged is kept as it was. Dashboards linked to the template without controls of their own get its controls. pages replaces all its pages with the stored form that dashboards.templates.get returns in raw_pages (with raw: true): back up, restore or copy pages with it; the widget summaries of pages are rejected, page ids and the widget ids of a page must be unique, and every new ad account, property or page a widget names must be connected to the organization (template slots pass). The whole template stays under 950 KB. Slots, platforms and the date range are designed in MB Suite's template editor; the publication status changes with dashboards.templates.publish. Dashboards linked to the template show the changes. Returns the updated template with its new version. Requires edit access to Dashboards.

Scope
dashboards:write
Permission
Edit in the module
MCP tool
dashboards_templates_updateOn the full surface; on the compact one, mb_execute_operation with id: "dashboards.templates.update".

Declared cost: up to 1 reads and 1 writes per call (they count against the daily quota).

Parameters

template_idstringpathrequired

The template id (dashboards.templates.list).

titlestringbodyoptional

New title.

descriptionstringbodyoptional

New description.

subtitlestringbodyoptional

New subtitle.

label_idsarray<string>bodyoptional

Template labels (ids from dashboards.labels.list with of: templates); replaces the list. An id that does not exist is label_unknown.

styleobjectbodyoptional

Cover style.

default_data_sourcestring | nullbodyoptional

The slot or platform widgets without a source use: a data_source_slots[].id, one of supported_platforms, or crm; null removes it. Filters and filter controls of the same call are checked against the new one.

filtersarray<object>bodyoptional

The global filters (replace the stored ones; [] removes them), up to 50, checked against the default data source's platform.

filter_controlsarray<string | object>bodyoptional

The filter controls the viewer gets (replace the stored ones; [] removes them), up to 20: a field id, or {field, …}; checked against the default data source's platform.

pagesarray<object>bodyoptional

All the pages as stored (the raw_pages of dashboards.templates.get with raw: true), up to 50: they replace the stored ones.

Response

templateobject

The template as saved, with its new version.

Errors

Example

curl -X PATCH "https://api.mb-suite.com/v1/dashboards/templates/{template_id}" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X PATCH "https://api.mb-suite.com/v1/dashboards/templates/{template_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/dashboards/templates/{template_id}/publish

Publish a template or move it back to draft

dashboards.templates.publish

WriteIdempotentSince 2026-11-01

Sets the publication status of one of the organization's own templates: published (a workspace's published templates are offered to its accounts as INHERITED and to bulk deployment) or draft (status: draft; dashboards already created keep rendering). Idempotent: changed is false when it already had that status. Requires edit access to Dashboards.

Scope
dashboards:write
Permission
Edit in the module
MCP tool
dashboards_templates_publishOn the full surface; on the compact one, mb_execute_operation with id: "dashboards.templates.publish".

Declared cost: up to 1 reads and 1 writes per call (they count against the daily quota).

Parameters

template_idstringpathrequired

The template id (dashboards.templates.list).

statusenumbodyoptional

published (its accounts see and deploy it) or draft. Default published.

Values: published, draft · Default: "published"

Response

template_idstring

The template.

statusenum

Its status now.

Values: draft, published

changedboolean

false when it already had that status.

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/dashboards/templates/{template_id}/publish" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/dashboards/templates/{template_id}/publish" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/dashboards/templates/{template_id}/duplicate

Duplicate a dashboard template

dashboards.templates.duplicate

WriteSince 2026-11-01

Copies one of the organization's own templates (pages, widgets, slots, filters, style) into a new draft titled '<title> (Copia)' (the suffix in the caller's language: (Copia), (Copy) or (Cópia)). Returns the new template id. Requires edit access to Dashboards.

Scope
dashboards:write
Permission
Edit in the module
MCP tool
dashboards_templates_duplicateOn the full surface; on the compact one, mb_execute_operation with id: "dashboards.templates.duplicate".

Declared cost: up to 1 reads and 1 writes per call (they count against the daily quota).

Parameters

template_idstringpathrequired

The template id (dashboards.templates.list).

Response

template_idstring

The copy's id.

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/dashboards/templates/{template_id}/duplicate" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/dashboards/templates/{template_id}/duplicate" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/dashboards/templates/clone

Copy a system template into the organization

dashboards.templates.clone

WriteSince 2026-11-01

Copies a published system template (source SYSTEM in dashboards.templates.list) into the organization's own templates as a draft titled title (default the system template's with the copy suffix in the caller's language, e.g. '<title> (Copia)'), placed after the organization's ordered templates, so it can be customized and published to its accounts. To just use a system template as it is, create a dashboard from it with dashboards.dashboards.create_from_template instead. Returns the new template id. Requires edit access to Dashboards.

Scope
dashboards:write
Permission
Edit in the module
MCP tool
dashboards_templates_cloneOn the full surface; on the compact one, mb_execute_operation with id: "dashboards.templates.clone".

Declared cost: up to 1 reads and 1 writes per call (they count against the daily quota).

Parameters

system_template_idstringbodyrequired

The published system template (dashboards.templates.list with source SYSTEM).

titlestringbodyoptional

Title of the copy; default the system template's with the copy suffix.

Response

template_idstring

The copy's id.

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/dashboards/templates/clone" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "system_template_id": "SYSTEM_TEMPLATE_ID"
}'

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X POST "https://api.mb-suite.com/v1/dashboards/templates/clone" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "system_template_id": "SYSTEM_TEMPLATE_ID"
}'
DELETE/v1/dashboards/templates/{template_id}

Delete a dashboard template

dashboards.templates.delete

IrreversibleSince 2026-11-01

Deletes one of the organization's own templates. It goes to the 30-day trash. Dashboards created from it (in this organization and, if it was published by a workspace, in its accounts) stop rendering until it is restored: the dry run says how many of this organization's dashboards are linked. Outside the screen it requires a dry run and a confirm_token, except a plain REST DELETE with a key allowed to delete. Requires edit access to Dashboards.

Instructions for agents

Before confirming, tell the person how many dashboards depend on the template (the dry run says it).

With an API key, this DELETE runs directly: the record stays 30 days in the trash and the response carries its trash_item_id. With an OAuth token, and through the MCP, it needs dry_run → confirm_token.

Scope
dashboards:write and “Allow deletions” (dashboards:delete in OAuth)
Permission
Edit in the module
MCP tool
dashboards_templates_deleteOn the full surface; on the compact one, mb_execute_operation with id: "dashboards.templates.delete".

Declared cost: up to 102 reads and 2 writes per call (they count against the daily quota).

Parameters

template_idstringpathrequired

The template id (dashboards.templates.list).

Response

oktrue
trash_item_idstring

The trash item this deletion left: the item_id of platform.trash.restore (POST /trash/{item_id}/restore). Missing if nothing went to the trash.

trash_item_idsarray<string>

Only when the deletion left more than one copy: all of them, the first being trash_item_id.

trash_expires_atnumber

When the copy leaves the trash for good (epoch ms): 30 days after the deletion.

Errors

Example

curl -X DELETE "https://api.mb-suite.com/v1/dashboards/templates/{template_id}" \
  -H "Authorization: Bearer $MB_API_KEY"

Try it with your test API key

With a test API key the request always goes to your practice organization: example data you can reset.

curl -X DELETE "https://api.mb-suite.com/v1/dashboards/templates/{template_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"