Skip to content

Meta Ads: campaigns, ad sets and changes ​

Creating a campaign and an ad set, targeting, switching on and off, budgets, editing, copying and bulk changes. 13 tools. This page is generated from the server's own tool list, version 0.1.0, and is not edited by hand. The descriptions are the ones your AI client reads, so they are written for it. All tools lists every page.

meta_ads_search_targeting ​

Kind: read. It is marked as changing nothing.

Find the ids and keys that meta_ads_create_adset's targeting takes: interests, behaviours, job titles, employers, schools, industries, places and languages.

Each result says where it goes: a detailed-targeting option carries kind and id (pass {kind, id, name}), a place carries key and use_in (countries, regions or cities), a language carries key for locales.

ArgumentTypeRequiredDefaultDescription
querytextno""What to look for, e.g. "accounting software" or "Kuwait". For behavior, demographic, industry, life_event, family_status and income, Meta has a fixed list: the query filters it, and an empty query returns the start of it.
typetextno"interest"interest, behavior, demographic, industry, life_event, family_status, income, work_position, work_employer, school, major, location or locale.
location_typeslist of textnononeFor location: any of country, region, city (all three by default).
country_codetextnononeFor location: only places in this country.
limitwhole numberno25How many results (1-50).

meta_ads_list_budget_schedules ​

Kind: read. It is marked as changing nothing.

List the budget schedules of a Meta campaign or ad set: the periods in which its daily budget is raised, with when each starts and ends. One call to Meta.

ArgumentTypeRequiredDefaultDescription
ad_account_idtextyesFrom meta_ads_list_accounts.
leveltextyes"campaign" or "adset" - what object_id is.
object_idtextyesFrom meta_ads_list.

meta_ads_set_status ​

Kind: write. It only previews the change unless dry_run is false. Removing needs confirm_remove to be true as well. Not offered while the server is in read-only mode.

Switch a Meta campaign, ad set or ad on or off, archive it or delete it. This is the only tool that can start spending: nothing else activates anything.

ACTIVE is checked against this installation's spending limits before it is sent, and this installation may require every ad that would run to have been previewed with meta_ads_preview in the last 24 hours. The dry run lists the budgets that would start spending, the most they could spend, the ads that would run, and what the ad account's active daily budgets would total. Show the user that and activate only after they confirm; never activate as a side effect of another request. PAUSED stops it and can be undone. ARCHIVED cannot be undone (an archived object can only be deleted) but keeps its results. DELETED cannot be undone and needs confirm_remove=true: prefer PAUSED or ARCHIVED unless the user asked for it to be deleted.

ArgumentTypeRequiredDefaultDescription
ad_account_idtextyesFrom meta_ads_list_accounts.
leveltextyes"campaign", "adset" or "ad" - what object_id is.
object_idtextyesFrom meta_ads_list.
statustextyes"ACTIVE", "PAUSED", "ARCHIVED" or "DELETED".
confirm_removetrue or falsenofalseMust be true to delete, and only when the user asked for a delete.
dry_runtrue or falsenotruetrue = Meta checks the change without making it (default). false = make it, only after the user confirms.

meta_ads_update_budget ​

Kind: write. It only previews the change unless dry_run is false. Not offered while the server is in read-only mode.

Change the budget, bid or end time of a Meta campaign or ad set. Amounts are in the ad account's currency units (25.50, not 2550).

The budget is changed where it already is: a campaign that holds the budget, or an ad set that holds its own, and a daily budget stays daily and a lifetime one lifetime. Subject to this installation's limits for the account's currency: the highest daily and lifetime budget, the largest increase in one call, the total of the account's active daily budgets, and the longest an ad set may run. A call over a limit is refused, not trimmed. Meta itself allows an ad set's budget to change only four times in an hour.

ArgumentTypeRequiredDefaultDescription
ad_account_idtextyesFrom meta_ads_list_accounts.
leveltextyes"campaign" or "adset" - what object_id is.
object_idtextyesFrom meta_ads_list.
daily_budgetnumbernononeNew average daily budget. Meta may spend up to 75% more on one day.
lifetime_budgetnumbernononeNew lifetime budget.
bid_amountnumbernononeAd set only: the bid cap or cost target.
bid_strategytextnononeLOWEST_COST_WITHOUT_CAP, LOWEST_COST_WITH_BID_CAP, COST_CAP or LOWEST_COST_WITH_MIN_ROAS.
end_timetextnononeAd set only: when it stops, ISO 8601 with an offset, e.g. 2026-11-30T23:59:00+03:00. Without an offset it is read as UTC.
dry_runtrue or falsenotruetrue = Meta checks the change without making it (default). false = make it, only after the user confirms.

meta_ads_create_campaign ​

Kind: write. It only previews the change unless dry_run is false. Not offered while the server is in read-only mode.

Create a Meta campaign. It is always created PAUSED, and it has no dates: its ad sets carry the schedule. Amounts are in the ad account's currency units.

Give a budget here to have the campaign hold it and share it between its ad sets, or give none and let each ad set hold its own. Budgets are subject to this installation's limits for the account's currency; a call over one is refused, not trimmed.

ArgumentTypeRequiredDefaultDescription
ad_account_idtextyesFrom meta_ads_list_accounts.
nametextyesThe campaign's name.
objectivetextyesOUTCOME_AWARENESS, OUTCOME_TRAFFIC, OUTCOME_ENGAGEMENT, OUTCOME_LEADS, OUTCOME_APP_PROMOTION or OUTCOME_SALES.
special_ad_categorieslist of textnononeRequired by Meta's policy when the ads are about EMPLOYMENT, HOUSING, CREDIT, FINANCIAL_PRODUCTS_SERVICES, ISSUES_ELECTIONS_POLITICS or ONLINE_GAMBLING_AND_GAMING. Ask the user rather than assuming none applies; declaring one limits the targeting Meta allows.
special_ad_category_countrylist of textnononeWith a category: the countries it is declared for.
daily_budgetnumbernononeCampaign-level average daily budget.
lifetime_budgetnumbernononeCampaign-level lifetime budget.
bid_strategytextnononeWith a campaign budget: LOWEST_COST_WITHOUT_CAP (default), LOWEST_COST_WITH_BID_CAP, COST_CAP or LOWEST_COST_WITH_MIN_ROAS.
spend_capnumbernononeThe most the campaign may ever spend; it stops for good when reached.
dry_runtrue or falsenotruetrue = Meta checks it without creating anything (default). false = create it, only after the user confirms.

meta_ads_create_adset ​

Kind: write. It only previews the change unless dry_run is false. Not offered while the server is in read-only mode.

Create an ad set in a Meta campaign: who sees the ads, where, when, what Meta optimises for and (unless the campaign holds it) the budget. Always created PAUSED.

The dry run is checked by Meta and its preview carries the targeting as it will be sent, Meta's estimate of the audience size (with a warning when it is very small) and the most the budget could spend. Show the user that before dry_run=false.

What goes with which campaign objective:

  • OUTCOME_LEADS with a lead form: destination_type ON_AD, optimization_goal LEAD_GENERATION or QUALITY_LEAD, promoted_object.page_id.
  • OUTCOME_LEADS or OUTCOME_SALES on a website: no destination_type, OFFSITE_CONVERSIONS, promoted_object.pixel_id and custom_event_type.
  • OUTCOME_TRAFFIC: no destination_type, LINK_CLICKS or LANDING_PAGE_VIEWS.
  • OUTCOME_AWARENESS: REACH, IMPRESSIONS, AD_RECALL_LIFT or THRUPLAY, promoted_object.page_id.
  • OUTCOME_ENGAGEMENT: destination_type ON_POST with POST_ENGAGEMENT, ON_PAGE with PAGE_LIKES (page_id), ON_VIDEO with THRUPLAY.
  • Ads that open a chat: destination_type WHATSAPP, MESSENGER or INSTAGRAM_DIRECT, optimization_goal CONVERSATIONS, promoted_object.page_id, under OUTCOME_ENGAGEMENT, OUTCOME_TRAFFIC or OUTCOME_SALES (WhatsApp also under OUTCOME_LEADS). The creative then needs the same message_destination.

A combination Meta does not allow is refused with the ones it does.

ArgumentTypeRequiredDefaultDescription
ad_account_idtextyesFrom meta_ads_list_accounts.
campaign_idtextyesThe campaign it goes in, from meta_ads_list or meta_ads_create_campaign.
nametextyesThe ad set's name.
targetingTargetingyesCountries (or regions, cities), ages, gender, languages, detailed targeting, custom audiences, placements. Ids and keys come from meta_ads_search_targeting. Countries may be limited by this installation.
optimization_goaltextyesWhat Meta optimises delivery for; see above.
billing_eventtextno"IMPRESSIONS"What is paid for: IMPRESSIONS (default, and the only choice for most goals), LINK_CLICKS, THRUPLAY.
destination_typetextnononeWhere the result happens; see above.
promoted_objectPromotedObjectnononeThe Page, pixel and event, or app the goal is about.
daily_budgetnumbernononeAverage daily budget. Meta may spend up to 75% more on one day.
lifetime_budgetnumbernononeBudget for the whole run; needs end_time.
start_timetextnononeISO 8601 with an offset, e.g. 2026-11-01T09:00:00+03:00. Now if left out.
end_timetextnononeWhen it stops. This installation may require one.
bid_amountnumbernononeThe bid cap or cost target, with a bid_strategy that takes one.
bid_strategytextnononeLOWEST_COST_WITHOUT_CAP, LOWEST_COST_WITH_BID_CAP, COST_CAP or LOWEST_COST_WITH_MIN_ROAS.
attribution_speclist of AttributionWindownononee.g. [{"event_type": "CLICK_THROUGH", "window_days": 7}].
frequency_capslist of FrequencyCapnononee.g. [{"interval_days": 7, "max_frequency": 3}] - at most 3 impressions per person in 7 days. For REACH and awareness goals.
schedulelist of ScheduleSlotnononeHours of the day and days of the week to run; lifetime budgets only.
dsa_payortextnononeNeeded when an EU country is targeted: who pays for the ads.
dsa_beneficiarytextnononeNeeded when an EU country is targeted: who the ads are for.
dry_runtrue or falsenotruetrue = Meta checks it without creating anything (default). false = create it, only after the user confirms.

meta_ads_update_campaign ​

Kind: write. It only previews the change unless dry_run is false. Not offered while the server is in read-only mode.

Rename a Meta campaign, or change the special ad categories it declares.

Its budget and bid strategy are changed with meta_ads_update_budget and its status with meta_ads_set_status. Its objective cannot be changed: make a new campaign with meta_ads_create_campaign and copy the ad sets into it with meta_ads_duplicate.

ArgumentTypeRequiredDefaultDescription
ad_account_idtextyesFrom meta_ads_list_accounts.
campaign_idtextyesFrom meta_ads_list.
nametextnononeThe new name.
special_ad_categorieslist of textnononeThe whole new list: EMPLOYMENT, HOUSING, CREDIT, FINANCIAL_PRODUCTS_SERVICES, ISSUES_ELECTIONS_POLITICS, ONLINE_GAMBLING_AND_GAMING. [] declares none. Ask the user; do not assume.
special_ad_category_countrylist of textnononeWith a category: the countries it is declared for.
dry_runtrue or falsenotruetrue = Meta checks the change without making it (default). false = make it, only after the user confirms.

meta_ads_update_adset ​

Kind: write. It only previews the change unless dry_run is false. Not offered while the server is in read-only mode.

Change a Meta ad set: its name, who sees the ads, when it starts, its attribution windows, its frequency cap or the hours it runs. Give only what changes.

targeting replaces the whole targeting, so give all of it, not only the part that changes; it is checked as at creation, and the dry run carries Meta's estimate of the new audience. On an ad set that is running, a change of targeting restarts Meta's learning. The budget, bid and end time are changed with meta_ads_update_budget. What it optimises for, where the result happens and what it promotes are fixed when it is made: copy it with meta_ads_duplicate or make a new one.

ArgumentTypeRequiredDefaultDescription
ad_account_idtextyesFrom meta_ads_list_accounts.
adset_idtextyesFrom meta_ads_list.
nametextnononeThe new name.
targetingTargetingnononeThe whole new targeting, as for meta_ads_create_adset.
start_timetextnononeISO 8601 with an offset. Only for an ad set that has not started.
attribution_speclist of AttributionWindownononee.g. [{"event_type": "CLICK_THROUGH", "window_days": 7}].
frequency_capslist of FrequencyCapnononee.g. [{"interval_days": 7, "max_frequency": 3}].
schedulelist of ScheduleSlotnononeHours of the day and days of the week to run; lifetime budgets only.
dsa_payortextnononeNeeded when an EU country is targeted: who pays for the ads.
dsa_beneficiarytextnononeNeeded when an EU country is targeted: who the ads are for.
dry_runtrue or falsenotruetrue = Meta checks the change without making it (default). false = make it, only after the user confirms.

meta_ads_update_ad ​

Kind: write. It only previews the change unless dry_run is false. Not offered while the server is in read-only mode.

Change a Meta ad: its name, the creative it shows, or the pixel that tracks it.

A creative cannot be edited, so changing what an ad shows means making a new creative with meta_ads_create_creative and putting it on the ad here. That sends the ad back through Meta's review. On an ad that is switched on, this installation may require the new creative to have been previewed with meta_ads_preview in the last 24 hours. An ad cannot be moved to another ad set: copy it with meta_ads_duplicate.

ArgumentTypeRequiredDefaultDescription
ad_account_idtextyesFrom meta_ads_list_accounts.
ad_idtextyesFrom meta_ads_list.
nametextnononeThe new name.
creative_idtextnononeThe creative to show instead, from meta_ads_list_creatives.
pixel_idtextnononeThe pixel that records what people do after the ad.
conversion_domaintextnononeThe bare domain conversions happen on, like example.com.
dry_runtrue or falsenotruetrue = Meta checks the change without making it (default). false = make it, only after the user confirms.

meta_ads_duplicate ​

Kind: write. It only previews the change unless dry_run is false. Not offered while the server is in read-only mode.

Copy a Meta campaign, ad set or ad. The copy is always PAUSED and carries its source's settings, budget included; switch it on with meta_ads_set_status, which checks the spending limits.

The dry run is this server's preflight, not Meta's check. Meta copies at most 3 ads under a campaign or ad set in one call: for more, copy without deep_copy and then copy what is under it one at a time, giving the copy as to_parent_id.

ArgumentTypeRequiredDefaultDescription
ad_account_idtextyesFrom meta_ads_list_accounts.
leveltextyes"campaign", "adset" or "ad" - what object_id is.
object_idtextyesFrom meta_ads_list.
deep_copytrue or falsenofalseAlso copy the ad sets and ads under a campaign, or the ads under an ad set.
rename_suffixtextno"- Copy"Added to the copy's name (and, with deep_copy, to everything under it).
to_parent_idtextnononePut the copy of an ad set in this campaign, or the copy of an ad in this ad set, instead of beside its source.
dry_runtrue or falsenotruetrue = check only (default). false = make the copy, after the user confirms.

meta_ads_bulk_update ​

Kind: write. It only previews the change unless dry_run is false. Not offered while the server is in read-only mode.

Pause or archive several Meta campaigns, ad sets or ads, or change the budget, bid or end time of several campaigns or ad sets, in one call - up to 25, all of one level.

Each item is checked and changed by itself, exactly as meta_ads_set_status or meta_ads_update_budget would: the same limits, Meta's own check on a dry run, and its own row in the activity log. The answer lists every item with its result or the reason it was refused; one refusal does not stop the others. Switching on and deleting are not offered here: each of those is its own confirmed call to meta_ads_set_status. Each item costs two calls to Meta, so do not use this for a single object.

ArgumentTypeRequiredDefaultDescription
ad_account_idtextyesFrom meta_ads_list_accounts.
leveltextyes"campaign", "adset" or "ad" - what every object_id is.
itemslist of BulkItemyesOne per object: {"object_id": ..., "status": "PAUSED"} or {"object_id": ..., "daily_budget": 30} (or lifetime_budget, bid_amount, end_time). Amounts are in the ad account's currency units.
dry_runtrue or falsenotruetrue = check every item and change nothing (default). false = make the changes, only after the user confirms.

meta_ads_add_labels ​

Kind: write. It only previews the change unless dry_run is false. Not offered while the server is in read-only mode.

Put labels on a Meta campaign, ad set or ad, or take some off. Labels are the ad account's own tags for grouping things; meta_ads_list shows them. A label that does not exist yet is made. The dry run is this server's preflight.

ArgumentTypeRequiredDefaultDescription
ad_account_idtextyesFrom meta_ads_list_accounts.
leveltextyes"campaign", "adset" or "ad" - what object_id is.
object_idtextyesFrom meta_ads_list.
labelslist of textnononeNames to add to the labels it already has.
removelist of textnononeNames to take off it. The label itself stays in the ad account.
dry_runtrue or falsenotruetrue = check only (default). false = change the labels.

meta_ads_create_budget_schedule ​

Kind: write. It only previews the change unless dry_run is false. Not offered while the server is in read-only mode.

Raise the daily budget of a Meta campaign or ad set for a period - a sale, a launch, a weekend - after which it goes back by itself. Only where a daily budget is held.

The raised budget is subject to this installation's limits exactly as a raise made with meta_ads_update_budget: the highest daily budget, the largest increase in one call and the total of the account's daily budgets. The dry run is this server's preflight; show the user the budget during the period and the most it could spend. A schedule cannot be changed or removed from here once made.

ArgumentTypeRequiredDefaultDescription
ad_account_idtextyesFrom meta_ads_list_accounts.
leveltextyes"campaign" or "adset" - whichever holds the daily budget.
object_idtextyesFrom meta_ads_list.
start_timetextyesWhen the raise starts, ISO 8601 with an offset, e.g. 2026-11-27T00:00:00+03:00. Without an offset it is read as UTC.
end_timetextyesWhen it ends.
increase_bynumberyesHow much to add to the daily budget during the period, in whole currency units of the ad account (20, not 20.50).
dry_runtrue or falsenotruetrue = check only (default). false = make the schedule, only after the user confirms.

Objects the arguments take ​

An argument whose type is a name takes an object with these fields.

Targeting ​

Who an ad set is shown to. Ids and keys come from meta_ads_search_targeting.

FieldTypeRequiredDefaultDescription
countrieslist of textnoTwo-letter country codes, e.g. ['KW', 'SA'].
regionslist of textnoRegion keys.
citieslist of Cityno
location_typeslist of one of home, recentnononePeople who live there (home), were recently there (recent), or both (default).
excluded_countrieslist of textno
excluded_regionslist of textno
excluded_citieslist of Cityno
age_minwhole numberno18
age_maxwhole numberno65
gendersone of all, male, femaleno"all"
localeslist of whole numbernoLanguage keys, e.g. Arabic and English.
detailedlist of list of OptionnoDetailed targeting. A person must match at least one option of EVERY inner list: [[a, b], [c]] is (a or b) and c.
excludelist of OptionnoOptions to leave out.
custom_audienceslist of textnoCustom or lookalike audience ids to include, from meta_ads_list_audiences.
excluded_custom_audienceslist of textno
placementsobjectnononeWhere the ads appear, by platform: {'facebook': ['feed', 'story'], 'instagram': []}. An empty list is every position of that platform. Left out: Meta chooses (Advantage+ placements).
deviceslist of one of mobile, desktopnonone
advantage_audiencetrue or falsenofalseLet Meta show the ads beyond this targeting when it expects better results. Age, gender and detailed targeting then become suggestions only.

PromotedObject ​

FieldTypeRequiredDefaultDescription
page_idtextnonone
pixel_idtextnonone
custom_event_typetextnononeWith a pixel: e.g. LEAD, PURCHASE, COMPLETE_REGISTRATION.
application_idtextnonone
object_store_urltextnonone
product_set_idtextnonone
whatsapp_phone_numbertextnononeWith destination_type WHATSAPP: which of the Page's WhatsApp numbers, digits with the country code. Left out, the number linked to the Page.

AttributionWindow ​

FieldTypeRequiredDefaultDescription
event_typeone of CLICK_THROUGH, VIEW_THROUGH, ENGAGED_VIDEO_VIEWyes
window_daysone of 1, 7yes

FrequencyCap ​

FieldTypeRequiredDefaultDescription
eventalways IMPRESSIONSno"IMPRESSIONS"
interval_dayswhole number (1 to 90)yes
max_frequencywhole number (1 to 90)yes

ScheduleSlot ​

When, within a day, the ads run.

FieldTypeRequiredDefaultDescription
start_minutewhole number (0 to 1439)yesMinutes after midnight, e.g. 540 for 09:00.
end_minutewhole number (1 to 1440)yes
dayslist of whole numberyes0 (Sunday) to 6 (Saturday).
timezone_typeone of USER, ADVERTISERno"USER"

BulkItem ​

One change to one object: a status, or a budget, bid or end time.

FieldTypeRequiredDefaultDescription
object_idtextyes
statustextnononePAUSED or ARCHIVED.
daily_budgetnumbernonone
lifetime_budgetnumbernonone
bid_amountnumbernononeAd sets only.
end_timetextnononeAd sets only, ISO 8601 with an offset.

City ​

FieldTypeRequiredDefaultDescription
keytextyesThe city's key from meta_ads_search_targeting(type='location').
radiusnumbernononeAround the city: 17-80 km or 10-50 miles.
distance_unitone of kilometer, mileno"kilometer"

Option ​

FieldTypeRequiredDefaultDescription
kindtextyesThe targeting field, as the search result's kind: interests, behaviors, work_positions, work_employers, education_schools, education_majors, industries, life_events, family_statuses or income.
idtextyes
nametextnonone