MCP tool · Bridge
prepare_bridge_transfer
Prepares a transfer without transferring anything: the source ads (or a Meta ad set's or campaign's ads), the destination campaign and its existing ad set / ad group / ad squad or a new one copied from a template. Returns the recap and a plan_id; ready: false lists what to ask (a TikTok identity, a Snapchat public profile, a website…), then prepare again with extra_fields. Incompatibilities are listed: your yes accepts them. For a Meta → Meta copy, the destination's fields go in mapping.
What it does
Prepare a Bridge transfer WITHOUT transferring anything: the plan and its recap, plan_id valid 24 hours.
Cross-platform: ads of one platform launched on another — e.g. Meta ads (source.ad_ids, or a Meta ad set / campaign = its ads: source.adset_ids / campaign_ids) into a TikTok or Snapchat campaign (destination.campaign_id), in an existing ad group / ad squad (destination.adset_id) or a new one copied from a template (destination.new_adset). The destination's identity / public profile is inherited from the ads already in that ad group when it can be; what is still missing is listed (ready:false + recap.missing): ask the user, then prepare again with extra_fields. Incompatibilities (a CTA remapped, a non-vertical source…) are listed: the user's yes acknowledges them.
Meta → Meta (both platforms meta, two different ad accounts): ads into destination.adset_id, ad sets into destination.campaign_id, or whole campaigns; recap.items shows what gets created (each ad on its source's post or not); recap.fields lists what the destination needs (pixel, page, audience, budget…): give values in mapping ("drop" where allow_drop), then prepare again.
Use list_ad_accounts / list_campaigns / list_adsets / list_ads (with platform) to find the ids.
Parameters
-
sourceobject requiredWhere the ads come from: one of ad_ids, adset_ids, campaign_ids
Fields (5)
-
platformstring required -
ad_account_idstring requiredThe ad account (list_ad_accounts): Meta act_…, a TikTok advertiser id, a Snapchat ad account id
-
ad_idsarray of strings optionalThe ads to transfer (cross-platform: 50 max per run)
-
adset_idsarray of strings optionalMeta: ad sets (cross-platform: their ads; Meta → Meta: the ad sets themselves, 20 max)
-
campaign_idsarray of strings optionalMeta: campaigns (cross-platform: their ads; Meta → Meta: the campaigns themselves, 5 max)
-
-
destinationobject requiredFields (5)
-
platformstring required -
ad_account_idstring requiredThe ad account (list_ad_accounts): Meta act_…, a TikTok advertiser id, a Snapchat ad account id
-
campaign_idstring optionalRequired, except for a Meta → Meta copy of campaigns
-
adset_idstring optionalAn existing destination ad set / TikTok ad group / Snapchat ad squad (list_adsets)
-
new_adsetobject optionalCross-platform: a new ad set copied from a template, instead of adset_id
Fields (3)
-
template_adset_idstring requiredAn ad set / ad group / ad squad of the destination campaign whose settings the new one copies
-
namestring required -
daily_budgetnumber optionalAccount currency; not for a TikTok CBO campaign
-
-
-
launch_statusstring optionalCross-platform. Default CREATED_PAUSED; SCHEDULED_* only with new_adset (+ schedule)
-
scheduleobject optionalA new ad set's schedule, in the destination account's time zone
Fields (4)
-
datestring required -
timestring required -
end_datestring optional -
end_timestring optional
-
-
extra_fieldsobject optionalWhat the plan asked for (recap.missing): the destination's identity / profile / page, URL, CTA, headline
Fields (8)
-
identity_idstring optionalTikTok: the identity the ads run under
-
identity_typestring optionalTikTok: one of the brand's TikTok accounts, TT_USER or BC_AUTH_TT through its Business Center (TikTok refuses a custom identity on these ads)
-
identity_bc_idstring optionalTikTok BC_AUTH_TT: the Business Center
-
profile_idstring optionalSnapchat: the public profile
-
page_idstring optionalMeta: the Facebook page
-
website_urlstring optional -
call_to_actionstring optional -
headlinestring optionalSnapchat: 34 characters
-
-
meta_textsmap optionalDestination Meta: each source ad's texts (by source ad id), instead of the ones the plan suggested (recap.meta_texts)
Fields (3)
-
primary_textstring optional -
headlinestring optional -
descriptionstring optional
-
-
optionsobject optionalMeta → Meta copy only
Fields (3)
-
keep_social_proofboolean optionalDefault true: reuse the source post (likes, comments) when Meta allows it
-
statusstring optionalAfter the copy: PAUSED (default), ACTIVE, or INHERIT (on only what is on in the source)
-
name_suffixstring optional
-
-
mappingmap optionalMeta → Meta copy: values for the plan's fields (recap.fields: pixel, page, audience, budget…), by key
Example
Your assistant calls it for you when you ask in your own words. What it sends (MCP tools/call, JSON-RPC 2.0):
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "prepare_bridge_transfer",
"arguments": {
"source": {
"platform": "meta",
"ad_account_id": "act_1234567890",
"ad_ids": [
"120200000000000003"
]
},
"destination": {
"platform": "tiktok",
"ad_account_id": "7000000000000000001",
"campaign_id": "1800000000000000001",
"adset_id": "1800000000000000002"
}
}
}
} The same call over HTTP with an API key, for an MCP client of your own (an assistant that signs in sends its OAuth token instead):
curl -X POST https://app.apogee.ad/mcp \
-H "Authorization: Bearer $APOGEE_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"prepare_bridge_transfer","arguments":{"source":{"platform":"meta","ad_account_id":"act_1234567890","ad_ids":["120200000000000003"]},"destination":{"platform":"tiktok","ad_account_id":"7000000000000000001","campaign_id":"1800000000000000001","adset_id":"1800000000000000002"}}}}' Access and cost
| Plans | Pro and Scale. |
|---|---|
| Scope | launch: a connection or an API key without it does not see this tool (scopes). |
| Effect | Stores a plan or an action and says what it will do. Nothing changes on the ad account until it is confirmed. |
| Credits | Free up to the daily free reads (5,000 a day on Pro, 10,000 on Scale), then 1 credit per read. A call that fails costs nothing (credits). |
| Rate limit | 600 MCP requests per 15 minutes on Pro, 1,200 on Scale (rate limits). |
| Daily cap | Counts 10 units toward the 2,000 units one API key or assistant connection can use in 24 hours. |
In the REST API
The same thing for your own code, with an API key:
- Create bridge transfer:
POST /bridge-transfers
Related tools
Bridge: Ads of one platform launched on another (Meta → TikTok or Snapchat, and back), or a Meta → Meta copy between two ad accounts. Prepared, shown in full, then run after your explicit yes; a plan runs once, within 24 hours.
bridge_transfer: Runs a prepared transfer, once, after your explicit yes; the plan is checked again first. Answers with the outcome (completed, partial, failed…) within about 25 seconds, orrunning. A Meta → Meta copy reuses each ad's post (likes, comments) when Meta lets the destination use it, and copies it as a new post otherwise.bridge_transfer_status: Where a transfer is: running, completed, partial (with the failures), failed, not run, or unknown (check the destination before running it again).list_bridge_transfers: The ads already bridged from a source ad account, newest first, with where each one went.get_bridge_stats: The Bridge's Stats tab: each creative bridged from a Meta ad account, its Meta ad next to its TikTok and Snapchat copies, with their spend and results over the period (7-day click attribution everywhere), each platform in its own currency.get_bridge_daily_stats: The Bridge's Daily tab: day by day, per platform, the spend, revenue, ROAS, impressions, link clicks and purchases of every creative bridged from a Meta ad account (366 days at most). Platforms are never added up.