Docs menu

MCP tool · Actions

create_ad_from_post

A new ad on an existing Facebook or Instagram post, which keeps its likes and comments, with every Advantage+ enhancement explicit; paused by default.

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

What it does

Prepare a new ad on an EXISTING post, which keeps its likes, comments and shares (list_posts finds them): a Facebook post (object_story_id) or an Instagram post (instagram_media_id + instagram_user_id + page_id).

A Facebook post keeps its own text, link and call to action; an Instagram post may get a call to action and its link. url_parameters adds UTMs. advantage_plus.opt_in is required: every enhancement not listed is sent OFF.

Returns an action_id and what will be created; nothing happens until execute_action, after the user's explicit OK. New ads with new creatives go through prepare_launch instead.

Parameters

  • ad_account_id string required

    Meta ad account id (act_…), from list_ad_accounts

    Matches ^(act_)?\d{1,32}$

  • adset_id string required

    The ad set the new ad goes in (list_adsets)

    Matches ^\d{1,40}$

  • name string required

    The new ad's name

    1 to 255 characters

  • advantage_plus object required

    Required: the Advantage+ creative enhancements, all explicit

    Fields (1)
    • opt_in array of strings required

      Enhancements turned ON; every other one is sent OFF. [] = all off

      One of enhance_cta, inline_comment, reveal_details_over_time, show_destination_blurbs, show_summary, text_optimizations, product_tags, optimize_website_destination, shop, product_browsing, browser_addons, image_brightness_and_contrast, image_templates, image_touchups, video_auto_crop, video_filtering

  • object_story_id string optional

    A Facebook post: <pageId>_<postId> (list_posts)

    Matches ^\d{1,40}_\d{1,40}$

  • instagram_media_id string optional

    An Instagram post (list_posts source instagram or ads)

    Matches ^\d{1,40}$

  • instagram_user_id string optional

    Instagram post: the account that published it

    Matches ^\d{1,40}$

  • page_id string optional

    Instagram post: the Facebook page linked to that account

    Matches ^\d{1,40}$

  • call_to_action string optional

    Instagram post only: e.g. SHOP_NOW, LEARN_MORE

    up to 40 characters

  • website_url string optional

    Instagram post only, with call_to_action

    up to 2,048 characters

  • url_parameters string optional

    UTM parameters added to the post's link

    up to 1,000 characters

  • status string optional

    Default PAUSED

    One of PAUSED, ACTIVE

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": "create_ad_from_post",
    "arguments": {
      "ad_account_id": "act_1234567890",
      "adset_id": "120200000000000002",
      "name": "Nordlicht | Spring launch",
      "advantage_plus": {
        "opt_in": [
          "enhance_cta"
        ]
      }
    }
  }
}

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":"create_ad_from_post","arguments":{"ad_account_id":"act_1234567890","adset_id":"120200000000000002","name":"Nordlicht | Spring launch","advantage_plus":{"opt_in":["enhance_cta"]}}}}'

Access and cost

PlansPro and Scale.
Scopeactions: 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 2 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:

Actions: Each tool only prepares: it returns an action_id and what will change. Nothing changes until execute_action, after your explicit OK, within 24 hours. Created objects are paused unless you ask otherwise.

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