Docs menu

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.

Prepares Scope: launch Pro and Scale plans Credits: Free*

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

  • source object required

    Where the ads come from: one of ad_ids, adset_ids, campaign_ids

    Fields (5)
    • platform string required

      One of meta, tiktok, snapchat

    • ad_account_id string required

      The ad account (list_ad_accounts): Meta act_…, a TikTok advertiser id, a Snapchat ad account id

      Matches ^(act_\d{1,32}|[A-Za-z0-9][A-Za-z0-9-]{0,63})$

    • ad_ids array of strings optional

      The ads to transfer (cross-platform: 50 max per run)

      1 to 100 items

      Matches ^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$

    • adset_ids array of strings optional

      Meta: ad sets (cross-platform: their ads; Meta → Meta: the ad sets themselves, 20 max)

      1 to 20 items

      Matches ^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$

    • campaign_ids array of strings optional

      Meta: campaigns (cross-platform: their ads; Meta → Meta: the campaigns themselves, 5 max)

      1 to 5 items

      Matches ^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$

  • destination object required
    Fields (5)
    • platform string required

      One of meta, tiktok, snapchat

    • ad_account_id string required

      The ad account (list_ad_accounts): Meta act_…, a TikTok advertiser id, a Snapchat ad account id

      Matches ^(act_\d{1,32}|[A-Za-z0-9][A-Za-z0-9-]{0,63})$

    • campaign_id string optional

      Required, except for a Meta → Meta copy of campaigns

      Matches ^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$

    • adset_id string optional

      An existing destination ad set / TikTok ad group / Snapchat ad squad (list_adsets)

      Matches ^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$

    • new_adset object optional

      Cross-platform: a new ad set copied from a template, instead of adset_id

      Fields (3)
      • template_adset_id string required

        An ad set / ad group / ad squad of the destination campaign whose settings the new one copies

        Matches ^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$

      • name string required

        1 to 255 characters

      • daily_budget number optional

        Account currency; not for a TikTok CBO campaign

        > 0

  • launch_status string optional

    Cross-platform. Default CREATED_PAUSED; SCHEDULED_* only with new_adset (+ schedule)

    One of CREATED_PAUSED, LIVE_NOW, SCHEDULED_PAUSED, SCHEDULED_LIVE

  • schedule object optional

    A new ad set's schedule, in the destination account's time zone

    Fields (4)
    • date string required

      Matches ^\d{4}-\d{2}-\d{2}$

    • time string required

      Matches ^\d{2}:\d{2}$

    • end_date string optional

      Matches ^\d{4}-\d{2}-\d{2}$

    • end_time string optional

      Matches ^\d{2}:\d{2}$

  • extra_fields object optional

    What the plan asked for (recap.missing): the destination's identity / profile / page, URL, CTA, headline

    Fields (8)
    • identity_id string optional

      TikTok: the identity the ads run under

      Matches ^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$

    • identity_type string optional

      TikTok: 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)

      One of TT_USER, BC_AUTH_TT

    • identity_bc_id string optional

      TikTok BC_AUTH_TT: the Business Center

      Matches ^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$

    • profile_id string optional

      Snapchat: the public profile

      Matches ^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$

    • page_id string optional

      Meta: the Facebook page

      Matches ^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$

    • website_url string optional

      up to 2,048 characters

    • call_to_action string optional

      up to 40 characters

    • headline string optional

      Snapchat: 34 characters

      up to 255 characters

  • meta_texts map optional

    Destination Meta: each source ad's texts (by source ad id), instead of the ones the plan suggested (recap.meta_texts)

    Keys match ^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$

    Each value: object

    Fields (3)
    • primary_text string optional

      up to 2,200 characters

    • headline string optional

      up to 255 characters

    • description string optional

      up to 255 characters

  • options object optional

    Meta → Meta copy only

    Fields (3)
    • keep_social_proof boolean optional

      Default true: reuse the source post (likes, comments) when Meta allows it

    • status string optional

      After the copy: PAUSED (default), ACTIVE, or INHERIT (on only what is on in the source)

      One of PAUSED, ACTIVE, INHERIT

    • name_suffix string optional

      up to 100 characters

  • mapping map optional

    Meta → Meta copy: values for the plan's fields (recap.fields: pixel, page, audience, budget…), by key

    Each value: string

Example

Your assistant calls it for you when you ask in your own words. What it sends (MCP tools/call, JSON-RPC 2.0):

tools/call
{
  "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
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

PlansPro and Scale.
Scopelaunch: a connection or an API key without it does not see this tool (scopes).
EffectStores a plan or an action and says what it will do. Nothing changes on the ad account until it is confirmed.
CreditsFree 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 limit600 MCP requests per 15 minutes on Pro, 1,200 on Scale (rate limits).
Daily capCounts 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:

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.

Last updated on . The parameters, limits, credits and error codes of these pages are generated from the code of the Apogee API (contract 2026-10-06).

A question, something missing? Write to hello@apogee.ad.

Book a demo

Pick the time that suits you.

Open in a new tab

Loading the calendar…

Talk to Founder