Menu

API reference · SEO Planner

Packs

seo_planner · packs · 11 operations

GET/v1/seo-planner/pack-labels

List the labels of SEO action packs

seo_planner.packs.labels.list

ReadIdempotentSince 2026-11-01

Lists the organization's pack labels (the ones the pack library of the app uses to group packs), in their order: id, name, color and order. Their ids are what label_ids of seo_planner.packs.create and seo_planner.packs.update take (an id that is not here is ignored there). Labels are created and edited in the app. Requires view access to the SEO Planner.

Scope
seo_planner:read
Permission
View the module
MCP tool
seo_planner_packs_labels_listOn the full surface; on the compact one, mb_execute_operation with id: "seo_planner.packs.labels.list".

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

Parameters

limitintegerqueryoptional

How many items this page brings at most (see the maximum and the default in the schema).

Default: 50

cursorstringqueryoptional

The next_cursor of the previous page, exactly as it came (only for the same list and filters); without it, the first page.

Response

dataarray<object>
has_moreboolean
next_cursorstring

Errors

Example

curl "https://api.mb-suite.com/v1/seo-planner/pack-labels" \
  -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/seo-planner/pack-labels" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/seo-planner/packs

List SEO action packs

seo_planner.packs.list

ReadIdempotentSince 2026-11-01

Lists SEO action packs: reusable plans of several actions spread over months (month_offset) that seo_planner.packs.apply turns into planner actions from a base month. source picks where from: all (default) = the organization's own, then its agency workspace's when the organization is an Account (read only), then the published packs of the MB Suite library; or org, parent, system. Each pack has name, description, icon_key, color, label_ids (seo_planner.packs.labels.list), item_count, month_span, source (and source_org_id for a workspace's) and who created it (created_by_id, created_by_name). Its actions are in seo_planner.packs.items.list. Paginated by cursor. Requires view access to the SEO Planner.

Scope
seo_planner:read
Permission
View the module
MCP tool
seo_planner_packs_listOn the full surface; on the compact one, mb_execute_operation with id: "seo_planner.packs.list".

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

Parameters

limitintegerqueryoptional

How many items this page brings at most (see the maximum and the default in the schema).

Default: 50

cursorstringqueryoptional

The next_cursor of the previous page, exactly as it came (only for the same list and filters); without it, the first page.

sourceenumqueryoptional

all (default: the organization's, then its workspace's when it is an Account, then the published ones of the MB Suite library), org, parent or system.

Values: all, org, parent, system · Default: "all"

Response

dataarray<object>
has_moreboolean
next_cursorstring

Errors

Example

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

Get one SEO action pack

seo_planner.packs.get

ReadIdempotentSince 2026-11-01

Returns one SEO action pack. Without source it looks in the organization's packs, then its workspace's (for an Account) and then the published packs of the MB Suite library; drafts of the library do not exist for an organization. 404 seo_pack_not_found otherwise. Requires view access to the SEO Planner.

Scope
seo_planner:read
Permission
View the module
MCP tool
seo_planner_packs_getOn the full surface; on the compact one, mb_execute_operation with id: "seo_planner.packs.get".

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

Parameters

pack_idstringpathrequired

The pack id (id of an item of seo_planner.packs.list).

sourceenumqueryoptional

Where to look: org, parent (the workspace of an Account) or system (the MB Suite library). Without it, in that order.

Values: org, parent, system

Response

idstring
namestring
sourceenum

org (the organization's, editable), parent (its agency workspace's, read only) or system (the MB Suite library, read only: copy it with seo_planner.packs.clone_system).

Values: org, parent, system

descriptionstring | null
icon_keystring | null

MDI icon name (mdiMagnify).

colorstring | null

Hex color.

ordernumber

Position in the organization's list.

label_idsarray<string>

Pack label ids (seo_planner.packs.labels.list).

item_countnumber

Actions in the pack (seo_planner.packs.items.list).

month_spannumber

Months it covers when applied (the highest month_offset + 1).

source_org_idstring | null

With source parent: the workspace the pack belongs to.

source_keystring | null

The key a script loaded the pack with (packs loaded in bulk), if any.

created_by_idstring | null

Who created it (null or system for the library).

created_by_namestring | null

Their name, when it is a person.

created_atnumber
updated_atnumber

Errors

Example

curl "https://api.mb-suite.com/v1/seo-planner/packs/{pack_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/seo-planner/packs/{pack_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
GET/v1/seo-planner/packs/{pack_id}/items

List the actions of an SEO action pack

seo_planner.packs.items.list

ReadIdempotentSince 2026-11-01

Lists the actions of a pack in order: title, subtitle, seo_type, description, month_offset (months after the base month when applied; 0 = the base month), icon, color and sub-actions (titles). Works for the organization's packs, its workspace's and the published library packs (same lookup as seo_planner.packs.get). Requires view access to the SEO Planner.

Scope
seo_planner:read
Permission
View the module
MCP tool
seo_planner_packs_items_listOn the full surface; on the compact one, mb_execute_operation with id: "seo_planner.packs.items.list".

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

Parameters

pack_idstringpathrequired

The pack id (id of an item of seo_planner.packs.list).

limitintegerqueryoptional

How many items this page brings at most (see the maximum and the default in the schema).

Default: 50

cursorstringqueryoptional

The next_cursor of the previous page, exactly as it came (only for the same list and filters); without it, the first page.

sourceenumqueryoptional

Where to look: org, parent (the workspace of an Account) or system (the MB Suite library). Without it, in that order.

Values: org, parent, system

Response

dataarray<object>
has_moreboolean
next_cursorstring

Errors

Example

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

Create an SEO action pack

seo_planner.packs.create

WriteSince 2026-11-01

Creates an empty SEO action pack at the end of the organization's list, owned by the caller: name, optional description, icon_key (an MDI name like mdiMagnify, the default), color (hex, default #3b82f6) and label_ids (pack labels from seo_planner.packs.labels.list; unknown ids are left out and returned in ignored_label_ids). Add its actions with seo_planner.packs.items.replace. Returns pack_id and the pack. Requires full access to the SEO Planner.

Scope
seo_planner:write
Permission
Edit in the module
MCP tool
seo_planner_packs_createOn the full surface; on the compact one, mb_execute_operation with id: "seo_planner.packs.create".

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

Parameters

namestringbodyrequired

The pack's name (1 to 200 characters).

descriptionstringbodyoptional

What the pack is for.

icon_keystringbodyoptional

MDI icon name, e.g. mdiMagnify (the default).

colorstringbodyoptional

Hex color, default #3b82f6.

label_idsarray<string>bodyoptional

Pack label ids (seo_planner.packs.labels.list), up to 50; ids that do not exist are left out and returned in ignored_label_ids.

Response

pack_idstring
packobject
ignored_label_idsarray<string>

The label_ids given that are not labels of the organization (seo_planner.packs.labels.list): they were left out.

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/seo-planner/packs" \
  -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/seo-planner/packs" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "name": "NAME"
}'
PATCH/v1/seo-planner/packs/{pack_id}

Update an SEO action pack

seo_planner.packs.update

WriteSince 2026-11-01

Changes the name, description, icon_key, color or label_ids of one of the organization's packs, inside updates. A pack of the workspace or of the MB Suite library is 409 seo_pack_read_only (details.source parent or system), with the way to go: a library pack is copied with seo_planner.packs.clone_system and the copy is edited; a workspace pack is changed on the workspace. An id that does not exist anywhere is 404 seo_pack_not_found. Its actions change with seo_planner.packs.items.replace. Unknown fields are rejected; unknown label ids are left out and returned in ignored_label_ids. Returns the pack. Requires full access to the SEO Planner.

Scope
seo_planner:write
Permission
Edit in the module
MCP tool
seo_planner_packs_updateOn the full surface; on the compact one, mb_execute_operation with id: "seo_planner.packs.update".

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

Parameters

pack_idstringpathrequired

The id of one of the organization's own packs (a workspace or library pack cannot be edited: copy it first).

updatesobjectbodyrequired

The fields to change (at least one). Its actions change with seo_planner.packs.items.replace.

Response

packobject
ignored_label_idsarray<string>

The label_ids given that are not labels of the organization (seo_planner.packs.labels.list): they were left out.

Errors

Example

curl -X PATCH "https://api.mb-suite.com/v1/seo-planner/packs/{pack_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/seo-planner/packs/{pack_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "updates": {}
}'
DELETE/v1/seo-planner/packs/{pack_id}

Delete an SEO action pack

seo_planner.packs.delete

IrreversibleSince 2026-11-01

Deletes one of the organization's packs with all its actions. It goes to the 30-day trash and comes back whole (actions included). Planner actions already created from the pack are not touched. 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 SEO 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
seo_planner:write and “Allow deletions” (seo_planner:delete in OAuth)
Permission
Edit in the module
MCP tool
seo_planner_packs_deleteOn the full surface; on the compact one, mb_execute_operation with id: "seo_planner.packs.delete".

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

Parameters

pack_idstringpathrequired

The id of one of the organization's own packs (source org in seo_planner.packs.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/seo-planner/packs/{pack_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/seo-planner/packs/{pack_id}" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/seo-planner/packs/{pack_id}/duplicate

Duplicate an SEO action pack

seo_planner.packs.duplicate

WriteSince 2026-11-01

Copies one of the organization's packs with all its actions into a new pack named '<name> (Copy)' (the suffix in the caller's language: '(Copia)', '(Copy)' or '(Cópia)'), owned by the caller. Returns the new pack id. Requires full access to the SEO Planner.

Scope
seo_planner:write
Permission
Edit in the module
MCP tool
seo_planner_packs_duplicateOn the full surface; on the compact one, mb_execute_operation with id: "seo_planner.packs.duplicate".

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

Parameters

pack_idstringpathrequired

The id of one of the organization's own packs (source org in seo_planner.packs.list).

Response

pack_idstring

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/seo-planner/packs/{pack_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/seo-planner/packs/{pack_id}/duplicate" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/seo-planner/packs/system/{system_pack_id}/clone

Copy a library pack into the organization

seo_planner.packs.clone_system

WriteSince 2026-11-01

Copies a published pack of the MB Suite library (an id from seo_planner.packs.list with source system) into the organization, actions included, so it can be edited. Drafts of the library cannot be copied (404 seo_pack_not_found). Returns the new pack id. Requires full access to the SEO Planner.

Scope
seo_planner:write
Permission
Edit in the module
MCP tool
seo_planner_packs_clone_systemOn the full surface; on the compact one, mb_execute_operation with id: "seo_planner.packs.clone_system".

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

Parameters

system_pack_idstringpathrequired

The id of a published library pack (an item of seo_planner.packs.list with source system).

Response

pack_idstring

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/seo-planner/packs/system/{system_pack_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/seo-planner/packs/system/{system_pack_id}/clone" \
  -H "Authorization: Bearer $MB_TEST_KEY"
POST/v1/seo-planner/packs/{pack_id}/items/replace

Replace the actions of an SEO action pack

seo_planner.packs.items.replace

WriteSince 2026-11-01

Saves the whole ordered list of actions of one of the organization's packs (up to 100), like the pack editor: each one with title, seo_type, month_offset (0–60 months after the base month), optional subtitle, description, icon and color (default: those of its type), sub_actions (titles) and source_template_id. Actions that carry the item_id of an existing one keep that id; the rest are new; existing ones missing from the list are removed. item_count and month_span are recalculated. Returns the saved list. Requires full access to the SEO Planner.

Scope
seo_planner:write
Permission
Edit in the module
MCP tool
seo_planner_packs_items_replaceOn the full surface; on the compact one, mb_execute_operation with id: "seo_planner.packs.items.replace".

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

Parameters

pack_idstringpathrequired

The id of one of the organization's own packs.

itemsarray<object>bodyrequired

The WHOLE list of the pack's actions, in order (up to 100): it replaces the current one.

Response

itemsarray<object>
item_countnumber
month_spannumber

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/seo-planner/packs/{pack_id}/items/replace" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "items": []
}'

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/seo-planner/packs/{pack_id}/items/replace" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
  "items": []
}'
POST/v1/seo-planner/packs/{pack_id}/apply

Create the planner actions of an SEO action pack

seo_planner.packs.apply

WriteBulk · up to 100Since 2026-11-01

Creates one SEO Planner action per action of a pack (the organization's, its workspace's or a published library pack; without source, looked up in that order), each in the month base_month_key (YYYY-MM) + its month_offset, pending, with the pack action's title, subtitle, type and sub-actions, and linked to the pack (pack_id, pack_source, pack_item_id). items can leave some out (include: false). The pack is read on the server: nothing of its content comes from the caller. Up to 100 actions. Outside the app it requires a dry run (which lists the actions and their months) and a confirm_token. Requires full access to the SEO Planner.

Needs confirmation: first dry_run: true (preview and confirm_token, valid 10 minutes and for one run), then the same body with confirm_token. In a few operations only with certain data: the description says when. Why and how: Dry run and confirm_token.

Scope
seo_planner:write
Permission
Edit in the module
MCP tool
seo_planner_packs_applyOn the full surface; on the compact one, mb_execute_operation with id: "seo_planner.packs.apply".
Events it can emit
seo_planner.item.created

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

Parameters

pack_idstringpathrequired

The pack id (id of an item of seo_planner.packs.list).

base_month_keystringbodyrequired

The base month (YYYY-MM): each pack action goes to base_month_key + its month_offset.

sourceenumbodyoptional

Where to look: org, parent (the workspace of an Account) or system (the MB Suite library). Without it, in that order.

Values: org, parent, system

itemsarray<object>bodyoptional

Pack actions to leave out (include: false); the ones not listed are created. Up to 100, the most a pack has.

Response

creatednumber
item_idsarray<string>

Errors

Example

curl -X POST "https://api.mb-suite.com/v1/seo-planner/packs/{pack_id}/apply" \
  -H "Authorization: Bearer $MB_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "base_month_key": "BASE_MONTH_KEY",
  "dry_run": true
}'

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/seo-planner/packs/{pack_id}/apply" \
  -H "Authorization: Bearer $MB_TEST_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "base_month_key": "BASE_MONTH_KEY",
  "dry_run": true
}'