MMetadata /docs
Docs/Tools/update_meta_placements

update_meta_placements

Set the channel-level Meta placement default of an existing DRAFT wizard campaign's Facebook or Instagram channel: automatic placements (Meta decides where ads serve) or a manua…

Destructive creative

Deletes, archives, launches or moves budget. Do not give an agent this one without a human gate.

What it does

Set the channel-level Meta placement default of an existing DRAFT wizard campaign's Facebook or Instagram channel: automatic placements (Meta decides where ads serve) or a manual list of surfaces (Feed, Stories, Reels, ...).

                Placements are where the ads serve inside Meta's networks. This is the same
                "Placements" control the platform UI shows in the Facebook/Instagram section of
                the campaign draft page. The campaign MUST already have the channel enabled
                (via create_campaign / add_and_edit_campaign_elements).

                ⚠️ DRAFT-ONLY: the platform rejects the edit once the campaign is Launching/Launched.

                KEYWORDS: meta, facebook, instagram, threads, placements, placement, feed, stories,
                reels, explore, search results, profile feed, automatic placements, manual placements,
                advantage+ placements, where ads serve, surfaces, channel settings, campaign settings

                WHEN TO USE:
                - Serve ads only on specific surfaces (e.g. Instagram Reels and Stories)
                - Switch a channel back to automatic placements (Meta optimizes delivery)
                - The user asks where their Facebook/Instagram ads will appear

                PARAMETERS:
                - campaign_id: the wizard campaign ID (required)
                - channel: FACEBOOK | INSTAGRAM (required — the campaign channel to edit)
                - mode: AUTO | MANUAL (required). AUTO = automatic placements, clears any
                  manual set. MANUAL = serve only on the placements listed.
                - placements: array of placement codes, required when mode=MANUAL, ignored
                  for AUTO. Facebook surfaces: FB_FEED, FB_STORIES, FB_REELS,
                  FB_SEARCH_RESULTS. Instagram surfaces: IG_FEED, IG_PROFILE_FEED,
                  IG_EXPLORE, IG_EXPLORE_HOME, IG_STORIES, IG_REELS, IG_SEARCH_RESULTS.
                  Threads: TH_THREADS_STREAM.

                PLACEMENT RULES (enforced; violations return a descriptive error):
                - Companion rules: FB_STORIES and FB_SEARCH_RESULTS require FB_FEED;
                  IG_PROFILE_FEED, IG_SEARCH_RESULTS and IG_EXPLORE require IG_FEED;
                  IG_EXPLORE_HOME requires IG_EXPLORE; TH_THREADS_STREAM requires IG_FEED.
                - An INSTAGRAM channel accepts IG_* placements only.
                - A FACEBOOK channel always accepts FB_* placements. IG_* / TH_* placements
                  on a FACEBOOK channel additionally need the account's unified-placement
                  rollout (feature flag CORE_META_IG_PLACEMENT_ON_FB) — the platform rejects
                  them on accounts without it.
                - IG_PROFILE_FEED is not available on Lead Gen (CPL) campaigns.
                - AUTO is rejected while the channel has ad groups (per-ad-group setups keep
                  manual placements).

                This tool sets the campaign-wide default for the channel. Per-ad-group
                placement overrides exist in the platform UI but are not editable through
                chat yet — send users to the campaign page for per-ad-group customization.

                EXAMPLES:

                Instagram channel, Reels + Stories + Feed only:
                update_meta_placements({"campaign_id": 12345, "channel": "INSTAGRAM",
                    "mode": "MANUAL", "placements": ["IG_FEED", "IG_STORIES", "IG_REELS"]})

                Facebook channel back to automatic placements:
                update_meta_placements({"campaign_id": 12345, "channel": "FACEBOOK", "mode": "AUTO"})

                RESPONSE: {success, campaign_id, channel_id, channel, campaign_status,
                applied:{mode, placements}, previous?, errors?}
                `previous` echoes the channel's placement state before the edit.

                INTEGRATION WITH OTHER TOOLS:
                - Use search_campaigns_by_names / get_campaign_by_wizard_id to find the campaign
                - The channel is enabled by create_campaign or add_and_edit_campaign_elements
                - Reddit placements (feed/conversations) are a different system: use
                  update_reddit_channel_settings for those

Arguments

ArgumentTypeNotes
campaign_id integer required The unique identifier of the wizard campaign
channel string required Which campaign channel to edit. Meta placements only exist on Facebook and Instagram channels.
one of: FACEBOOK, INSTAGRAM
mode string required AUTO = automatic placements (Meta decides, clears the manual set). MANUAL = serve only on the placements listed in `placements`.
one of: AUTO, MANUAL
placements array Placement codes to serve on. Required when mode=MANUAL (at least one); ignored for AUTO. Companion rules apply — see the tool description.

Request

curl
curl -s -X POST https://mcp-server.metadata.io/mcp \
  -H "Authorization: $METADATA_PAT" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"update_meta_placements","arguments":{"campaign_id":0,"channel":"FACEBOOK","mode":"AUTO"}}}'

Response

No recorded response. This tool can delete, archive, launch or move budget, so it is never executed to build these docs. The request above is still the exact shape to send. Nothing on this page is invented.

Other creative tools:

All 160 tools · machine-readable index