List the change history of a plan's campaigns
media_planner.changes.list
Lists the change history of a media plan's rows, newest first, paginated by cursor: who changed what and when, field by field with the value before and after (budget, status, dates, platform, currency, labels, link, Auto-Budget, carryover), plus creations, deletions and imports. source says where it came from (user, ai, autobudget, carryover, system). Pass campaign_id for the history of one row (it survives the row's deletion). Reordering and the daily cost sync are not history. Requires view access to the Media Planner. With Google Ads, LinkedIn or TikTok, their terms limit it through the API and the MCP: what they do not allow answers 403 platform_terms_restricted, and their records are left out of the response (the permissions guide lists what each platform allows).
- Scope
media_planner:read- Permission
- View the module
- MCP tool
media_planner_changes_listOn the full surface; on the compact one,mb_execute_operationwithid: "media_planner.changes.list".
Declared cost: up to 203 reads and 0 writes per call (they count against the daily quota).
Parameters
plan_idstringpathMedia plan id (from media_planner.plans.list).
limitintegerqueryoptionalHow many items this page brings at most (see the maximum and the default in the schema).
Default: 50
cursorstringqueryoptionalThe next_cursor of the previous page, exactly as it came (only for the same list and filters); without it, the first page.
campaign_idstringqueryoptionalOnly the history of this row (it survives the row's deletion).
Response
dataarray<object>has_morebooleannext_cursorstringErrors
Example
curl "https://api.mb-suite.com/v1/media-planner/plans/{plan_id}/changes" \
-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/plans/{plan_id}/changes" \
-H "Authorization: Bearer $MB_TEST_KEY"