Menu

API reference · Media Planner

Templates

media_planner · templates · 9 operations

GET/v1/media-planner/templates

List media plan templates

media_planner.templates.list

ReadIdempotentSince 2026-11-01

Lists the strategy templates a media plan can start from: a structure of campaigns (name + platform), without budgets or dates. source=own (default) returns this organization's templates in their order; source=available adds the workspace's (for an account, source: parent) and MB Suite's published system templates (source: system), which is what media_planner.plans.create accepts as template_id. Requires view access to the Media Planner.

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

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

Parameters

sourceenumqueryoptional

own: this organization's templates; available: own + inherited from the workspace + published system templates (what a new plan can start from).

Values: own, available · Default: "own"

Response

dataarray<object>

The templates, in their order.

Errors

Example

curl "https://api.mb-suite.com/v1/media-planner/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/media-planner/templates" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/media-planner/templates/{template_id}

Get one media plan template

media_planner.templates.get

ReadIdempotentSince 2026-11-01

Returns one of this organization's strategy templates: name, description, color, labels and its campaign structure (campaign_templates: name, platform, order), with the platforms it uses. Not found (media_plan_template_not_found) for a template of another organization or a system template (see media_planner.templates.list_system). Requires view access to the Media Planner.

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

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

Parameters

template_idstringpathrequired

Media plan template id (from media_planner.templates.list).

Response

idstring

Template id.

namestring

Template name.

descriptionstring

Its description (may be empty).

colorstring

Hex color.

campaign_templatesarray<object>

The campaign structure (name + platform), without budgets or dates.

campaign_countnumber

Campaigns in the template.

platformsarray<string>

Platforms it uses.

sourceenum

own (this organization), parent (inherited from the workspace) or system (MB Suite's).

Values: own, parent, system

label_idsarray<string>

Template labels (media_planner.labels.list).

ordernumber

Position among the templates (own and inherited ones and the system ones, in their own list).

created_atnumber

Epoch ms.

updated_atnumber

Epoch ms.

Errors

Example

curl "https://api.mb-suite.com/v1/media-planner/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/media-planner/templates/{template_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/media-planner/templates

Create a media plan template

media_planner.templates.create

WriteSince 2026-11-01

Creates a strategy template: name, optional description, color (#rrggbb, default #2563eb), label_ids and campaign_templates (up to 200: name, platform, platform_custom_name for 'other', order). It stores only the structure (no budgets or dates); a new plan in campaigns mode can start from it. Placed last. Returns the template. Requires full access to the Media Planner.

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

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

Parameters

namestringbodyrequired

Template name.

descriptionstringbodyoptional

What the template is for.

Default: ""

colorstringbodyoptional

Hex color of the template's card.

Default: "#2563eb"

campaign_templatesarray<object>bodyoptional

The campaign structure (name + platform), without budgets or dates.

Default: []

label_idsarray<string>bodyoptional

Template labels (ids).

Response

template_idstring

The template's id.

templateobject

The template.

Errors

Example

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

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/media-planner/templates" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "name": "NAME"
}'
PATCH/v1/media-planner/templates/{template_id}

Update a media plan template

media_planner.templates.update

WriteIdempotentSince 2026-11-01

Updates a template of this organization, with the fields inside updates ({ template_id, updates: { … } }): name, description, color, label_ids and/or campaign_templates (the whole structure is replaced; the platforms and the campaign count are recomputed). Plans already created from it do not change. Returns the template. Requires full access to the Media Planner.

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

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

Parameters

template_idstringpathrequired

Media plan template id (from media_planner.templates.list).

updatesobjectbodyrequired

The fields to change (at least one).

Response

templateobject

The template as it is now.

Errors

Example

curl -X PATCH "https://api.mb-suite.com/v1/media-planner/templates/{template_id}" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "updates": {}
}'

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/media-planner/templates/{template_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "updates": {}
}'
DELETE/v1/media-planner/templates/{template_id}

Delete a media plan template

media_planner.templates.delete

IrreversibleSince 2026-11-01

Deletes a template of this organization (plans created from it do not change). It goes to the 30-day trash, where an owner or admin can restore it (platform.trash.restore). Outside the app it needs a dry run and a confirm_token, except a REST DELETE with a key allowed to delete. Requires full access to the Media Planner.

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
media_planner:write and “Allow deletions” (media_planner:delete in OAuth)
Permission
Edit in the module
MCP tool
media_planner_templates_deleteOn the full surface; on the compact one, mb_execute_operation with id: "media_planner.templates.delete".

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

Parameters

template_idstringpathrequired

Media plan template id (from media_planner.templates.list).

Response

oktrue

Always true.

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/media-planner/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/media-planner/templates/{template_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/media-planner/templates/{template_id}/duplicate

Duplicate a media plan template

media_planner.templates.duplicate

WriteSince 2026-11-01

Copies a template of this organization as '<name> (Copia)', placed last, with the same structure, color and labels. Returns the new template. Requires full access to the Media Planner.

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

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

Parameters

template_idstringpathrequired

Media plan template id (from media_planner.templates.list).

Response

template_idstring

The template's id.

templateobject

The template.

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/media-planner/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/media-planner/templates/{template_id}/duplicate" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/media-planner/templates/reorder

Reorder media plan templates

media_planner.templates.reorder

WriteIdempotentSince 2026-11-01

Sets the order of this organization's templates: template_ids in the new order (position = index). All or nothing: an id that is not a template of this organization stops the whole reorder (404). Requires full access to the Media Planner.

Scope
media_planner:write
Permission
Edit in the module
MCP tool
media_planner_templates_reorderOn the full surface; on the compact one, mb_execute_operation with id: "media_planner.templates.reorder".

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

Parameters

template_idsarray<string>bodyrequired

The organization's template ids in the new order (from media_planner.templates.list).

Response

countnumber

Templates reordered.

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/media-planner/templates/reorder" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "template_ids": [
    "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/media-planner/templates/reorder" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "template_ids": [
    "TEMPLATE_ID"
  ]
}'
GET/v1/media-planner/system-templates

List MB Suite's system templates

media_planner.templates.list_system

ReadIdempotentSince 2026-11-01

Lists MB Suite's published strategy templates (lead generation, e-commerce, awareness, B2B…), in their catalog order, with their campaign structure. Copy one into the organization with media_planner.templates.clone_system, or start a plan from it with template_id. Drafts are never listed. Requires view access to the Media Planner.

Scope
media_planner:read
Permission
View the module
MCP tool
media_planner_templates_list_systemOn the full surface; on the compact one, mb_execute_operation with id: "media_planner.templates.list_system".

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

Parameters

No parameters.

Response

dataarray<object>

The templates, in their order.

Errors

Example

curl "https://api.mb-suite.com/v1/media-planner/system-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/media-planner/system-templates" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/media-planner/system-templates/{system_template_id}/clone

Copy a system template into the organization

media_planner.templates.clone_system

WriteSince 2026-11-01

Copies a published MB Suite system template into this organization's templates (placed last), where it can be edited like any other. Not found (system_media_plan_template_not_found) for a draft or unknown id. Returns the new template. Requires full access to the Media Planner.

Scope
media_planner:write
Permission
Edit in the module
MCP tool
media_planner_templates_clone_systemOn the full surface; on the compact one, mb_execute_operation with id: "media_planner.templates.clone_system".

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

Parameters

system_template_idstringpathrequired

Published system template id (from media_planner.templates.list_system).

Response

template_idstring

The template's id.

templateobject

The template.

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/media-planner/system-templates/{system_template_id}/clone" \
  -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/media-planner/system-templates/{system_template_id}/clone" \
  -H "Authorization: Bearer $MB_TEST_KEY"