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.
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_idstring requiredMeta ad account id (act_…), from list_ad_accounts
-
adset_idstring requiredThe ad set the new ad goes in (list_adsets)
-
namestring requiredThe new ad's name
-
advantage_plusobject requiredRequired: the Advantage+ creative enhancements, all explicit
Fields (1)
-
opt_inarray of strings requiredEnhancements turned ON; every other one is sent OFF. [] = all off
-
-
object_story_idstring optionalA Facebook post: <pageId>_<postId> (list_posts)
-
instagram_media_idstring optionalAn Instagram post (list_posts source instagram or ads)
-
instagram_user_idstring optionalInstagram post: the account that published it
-
page_idstring optionalInstagram post: the Facebook page linked to that account
-
call_to_actionstring optionalInstagram post only: e.g. SHOP_NOW, LEARN_MORE
-
website_urlstring optionalInstagram post only, with call_to_action
-
url_parametersstring optionalUTM parameters added to the post's link
-
statusstring optionalDefault PAUSED
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": "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 -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
| Plans | Pro and Scale. |
|---|---|
| Scope | actions: 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 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:
- Create action:
POST /actions
Related tools
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.
pause_ad: Pauses ads.pause_adset: Pauses ad sets.activate_ad: Turns paused ads back on.activate_adset: Turns paused ad sets back on.update_budget: Sets new daily budgets for ad sets.scale_budget: Scales ad set budgets by a percentage (+100% at most per change).update_campaign_status: Pauses or turns on a whole campaign.update_adset_targeting: Changes an ad set's targeting.duplicate_ad: Copies an ad into other ad sets of the same ad account, keeping the same post (likes, comments, shares).duplicate_adset: Copies an ad set with its ads, each keeping its post; created paused.duplicate_campaign: Copies a campaign with its ad sets and ads; created paused.create_adset: A new ad set in an existing campaign, from scratch or copying another ad set's targeting and conversion; created paused.create_ad: A new ad on an existing post or creative; created paused.execute_action: Runs a prepared action (or a prepared campaign), once, after your explicit OK. Returns what was created.