Ads
Space MCP tools in the Ads scope (ads). Reach these with a wks_live_ key over space-mcp or space-api.
Tools in the ads scope, callable over space-mcp (tools/call) or space-api (REST) with a wks_live_* key that grants ads.
add_people_to_ad_audience
Scope: ads:write
Add people to a custom audience: the space's contacts (by id or by tag) and/or emails and phones you pass. The platform hashes them.
| Parameter | Type | Required | Description |
|---|---|---|---|
audience_id | string | yes | The ad audience (list_ad_audiences). |
contact_ids | string[] | ||
tag | string | Everyone in the space's contacts with this tag. | |
people | object[] |
archive_ad_lead_form
Scope: ads:write
Archive a lead form so no new ad can use it (its leads stay).
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
form_id | string | yes |
boost_social_post
Scope: ads:write
BOOST an existing social post into a paid ad (spends money, subject to the space's ad policy). Provide post_id or platform_post_id plus budget and optional targeting/schedule.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | |
name | string | yes | |
goal | string | yes | |
budget_amount | number | yes | |
budget_type | daily | lifetime | ||
post_id | string | ||
platform_post_id | string | ||
schedule_start | string | ||
schedule_end | string | ||
targeting | object | ||
bid_amount | number | ||
bid_strategy | string | ||
optimization_goal | string | ||
spark_auth_code | string | TikTok Spark Ads auth code. |
change_ad_bidding
Scope: ads:write
Bidding and timing: Google portfolio bid strategies, a campaign's bidding and ad schedule (dayparting), Meta value rule sets, Meta budget increases for high-demand periods. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- create_bid_strategy [google]: Create portfolio bid strategy — params: name*, type*, targetCpa, targetRoas
- update_bid_strategy [google]: Update portfolio bid strategy — params: strategyId*, name, type, targetCpa, targetRoas
- set_ad_schedule [google]: Replace a campaign's ad schedule (dayparting) — params: campaignId*, schedule*
- create_value_rule_set [meta]: Create a value rule set — params: name*, rules*
- replace_value_rule_set [meta]: Replace a value rule set — params: valueRuleSetId*, name*, rules*
- delete_value_rule_set [meta]: Delete a value rule set — params: valueRuleSetId*
- schedule_budget_increase [meta]: Schedule a budget increase (spends money — the space's ad policy applies) — params: campaignId, adSetId, budgetValue*, budgetValueType*, timeStart*, timeEnd*, recurrenceType, currency For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | create_bid_strategy | update_bid_strategy | set_ad_schedule | create_value_rule_set | replace_value_rule_set | delete_value_rule_set | schedule_budget_increase | yes | |
params | object | The op's fields, by Zernio's names. |
change_ad_catalog_feeds
Scope: ads:write
A catalog's product feeds (a file Meta fetches on a schedule) and their uploads. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- create_feed [meta]: Create a product feed — params: catalogId*, name*, schedule
- fetch_feed_now [meta]: Fetch a feed file now — params: catalogId*, feedId*, url* For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | create_feed | fetch_feed_now | yes | |
params | object | The op's fields, by Zernio's names. |
change_ad_creative_library
Scope: ads:write
Meta's creative library: saved creatives, images and videos stored on the ad account, reusable across ads. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- create_creative [meta]: Create a standalone creative — params: headline*, body*, description, callToAction, linkUrl*, imageUrl, imageHash, carouselCards, urlTags, promotion, creativeFeatures, multiAdvertiser, aiDisclosure
- rename_creative [meta]: Rename a creative — params: creativeId*, name*
- delete_creative [meta]: Delete a creative — params: creativeId*
- upload_image [meta]: Upload an ad image from base64 — params: imageBase64*, filename
- upload_video [meta]: Upload an ad video — params: videoUrl, videoBase64, filename
- delete_video [meta]: Delete an ad video — params: videoId* For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | create_creative | rename_creative | delete_creative | upload_image | upload_video | delete_video | yes | |
params | object | The op's fields, by Zernio's names. |
change_ad_forecasts
Scope: ads:write
Forecasting before spending: Meta reach & frequency predictions (and reserving them), LinkedIn bid pricing and delivery forecasts. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- cancel_reach_frequency [meta]: Cancel reach-frequency booking — params: predictionId*
- reserve_reach_frequency [meta]: Reserve reach-frequency inventory (spends money — the space's ad policy applies) — params: predictionId* For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | cancel_reach_frequency | reserve_reach_frequency | yes | |
params | object | The op's fields, by Zernio's names. |
change_ad_identities
Scope: ads:write
Who an ad runs as and what it can promote: TikTok identities and pixels, Instagram accounts and posts to boost, partnership (creator) content and permissions, apps, businesses. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- set_partnership_permission [meta]: Set partnership permission — params: creatorUsername*, revoke For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | set_partnership_permission | yes | |
params | object | The op's fields, by Zernio's names. |
change_ad_labels_and_accounts
Scope: ads:write
Google Ads labels (tag campaigns, ad groups, ads, keywords) and the manager-account hierarchy and links. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- create_label [google]: Create a Google Ads label — params: name*, backgroundColor, description
- update_label [google]: Update a Google Ads label — params: labelId*, name, backgroundColor, description
- delete_label [google]: Remove a Google Ads label — params: labelId*
- attach_label [google]: Attach a Google Ads label — params: labelId*, campaignIds, adSetIds, adIds, keywordIds
- detach_label [google]: Detach a Google Ads label — params: labelId*, campaignIds, adSetIds, adIds, keywordIds
- invite_client_account [google]: Invite a client account to a manager — params: managerCustomerId*, clientCustomerId*, validateOnly
- update_manager_link [google]: Accept, decline, cancel or end a manager link — params: managerCustomerId*, clientCustomerId*, managerLinkId*, action*, validateOnly For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | create_label | update_label | delete_label | attach_label | detach_label | invite_client_account | update_manager_link | yes | |
params | object | The op's fields, by Zernio's names. |
change_google_ads_conversion_setup
Scope: ads:write
Google Ads conversion setup: conversion actions, account and campaign conversion goals, custom goals. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- create_action [google]: Create website conversion action — params: name*, type*, defaultValue, alwaysUseDefaultValue
- set_action_primary [google]: Set a conversion action primary or secondary — params: actionId*, primaryForGoal*
- set_goals [google]: Update account conversion goals — params: goals*
- create_custom_goal [google]: Create a custom conversion goal — params: name*, conversionActionIds*
- update_custom_goal [google]: Update a custom conversion goal — params: goalId*, name, conversionActionIds
- delete_custom_goal [google]: Remove a custom conversion goal — params: goalId*
- set_campaign_goals [google]: Update campaign conversion goals — params: campaignId*, goals, goalConfigLevel, customConversionGoalId For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | create_action | set_action_primary | set_goals | create_custom_goal | update_custom_goal | delete_custom_goal | set_campaign_goals | yes | |
params | object | The op's fields, by Zernio's names. |
change_google_ads_extensions
Scope: ads:write
Google Ads extensions (assets): sitelinks, callouts and structured snippets on the account, a campaign or an ad group. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- add_sitelinks [google]: Add account sitelinks — params: sitelinks*
- update_sitelinks [google]: Update account sitelinks — params: updates*
- remove_sitelink [google]: Remove account sitelink — params: assetId*
- add_callouts [google]: Add account callouts — params: callouts*
- update_callouts [google]: Update account callouts — params: updates*
- remove_callout [google]: Remove account callout — params: assetId*
- add_snippets [google]: Add account snippets — params: structuredSnippets*
- update_snippets [google]: Update account snippets — params: updates*
- remove_snippet [google]: Remove account snippet — params: assetId*
- add_campaign_assets [google]: Attach campaign assets — params: campaignId*, sitelinks, callouts, structuredSnippets
- update_campaign_assets [google]: Update campaign assets — params: campaignId*, updates*
- remove_campaign_assets [google]: Remove campaign assets — params: campaignId*, assetResourceNames*, campaignAssetResourceNames*
- add_ad_set_assets [google]: Attach ad-group assets — params: adSetId*, sitelinks, callouts, structuredSnippets
- update_ad_set_assets [google]: Update ad-group assets — params: adSetId*, updates*
- remove_ad_set_assets [google]: Remove ad-group assets — params: adSetId*, assetResourceNames*, adGroupAssetResourceNames* For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | add_sitelinks | update_sitelinks | remove_sitelink | add_callouts | update_callouts | remove_callout | add_snippets | update_snippets | remove_snippet | add_campaign_assets | update_campaign_assets | remove_campaign_assets | add_ad_set_assets | update_ad_set_assets | remove_ad_set_assets | yes | |
params | object | The op's fields, by Zernio's names. |
change_google_ads_keywords
Scope: ads:write
Google Ads Search keywords. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- add [google]: Add Search ad-group keywords — params: adSetId*, keywords*, negative
- set_status [google]: Pause or enable a Search keyword — params: keywordId*, status*
- remove [google]: Remove a Search keyword — params: keywordId* For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | add | set_status | remove | yes | |
params | object | The op's fields, by Zernio's names. |
change_google_ads_negative_keywords
Scope: ads:write
Google Ads negative keywords — on a campaign and in shared lists. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- set_campaign_negatives [google]: Replace campaign-level negative keywords — params: campaignId*, platform, keywords*
- create_list [google]: Create a negative keyword list — params: platform, name*, keywords
- rename_list [google]: Rename a negative keyword list — params: listId*, platform, name*
- delete_list [google]: Delete a negative keyword list — params: listId*, platform
- set_list_keywords [google]: Replace negative list keywords — params: listId*, platform, keywords*
- set_campaign_lists [google]: Replace campaign negative lists — params: campaignId*, platform, listIds* For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | set_campaign_negatives | create_list | rename_list | delete_list | set_list_keywords | set_campaign_lists | yes | |
params | object | The op's fields, by Zernio's names. |
change_google_pmax_asset_groups
Scope: ads:write
Google Performance Max asset groups (their texts, images, final URLs and listing-group filters). Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- create_asset_group [google]: Create a Performance Max asset group — params: campaignId*, name*, finalUrls*, finalMobileUrls, path1, path2, status, assets, listingGroupFilter, validateOnly
- update_asset_group [google]: Update a Performance Max asset group — params: campaignId*, assetGroupId*, name, status, finalUrls, finalMobileUrls, path1, path2, validateOnly
- remove_asset_group [google]: Remove a Performance Max asset group — params: campaignId*, assetGroupId*, validateOnly
- link_assets [google]: Link or unlink asset group assets — params: campaignId*, assetGroupId*, link, unlink, validateOnly
- set_listing_groups [google]: Replace an asset group's listing-group tree — params: campaignId*, assetGroupId*, tree*, validateOnly For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | create_asset_group | update_asset_group | remove_asset_group | link_assets | set_listing_groups | yes | |
params | object | The op's fields, by Zernio's names. |
create_ad_audience
Scope: ads:write
Make an ad audience on the platform: custom (a list you fill with add_people_to_ad_audience, or website visitors via config), lookalike (config: sourceAudienceId, country, ratio 0.01–0.2)…
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
name | string | yes | |
type | string | yes | custom | lookalike | website | engagement (what the platform supports). |
config | object | Platform settings for the type (source, retention, lookalike country/ratio…). |
create_ad_audience_from_customers
Scope: ads:write
An audience of the people who bought from the shop run from this space (their emails, hashed by the platform), optionally with a lookalike of them.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
name | string | yes | |
days_back | number | Buyers from the last N days (default 90). | |
only_paid | boolean | Only paid/completed orders (default true). | |
also_create_lookalike | boolean | ||
lookalike_country | string | Country code, default US. | |
lookalike_ratio | number | 0.01 = the closest 1%. |
create_ad_campaign_draft
Scope: ads:write
Write an AD RECIPE: a full ad campaign (the ad and its settings) that appears in Ads Manager → Ad recipes with a native ad preview — even when NO ad account is connected. This is the preferred way to set up a campaign for a human to review and launch (no spend until launched; a recipe can be launched many times, each launch a campaign). Provide objective, budget, schedule, targeting, and one or more creatives (each with headline/body/CTA and an image or video URL). Either ad_account_id OR platform is required.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | Campaign name. |
platform | metaads | googleads | tiktokads | linkedinads | pinterestads | xads | openaiads | Ad platform. Required when ad_account_id is omitted. | |
ad_account_id | string | Optional. When given it must be reachable from this space and pins the platform. Omit to design before an account is connected. | |
goal | engagement | traffic | awareness | video_views | lead_generation | conversions | app_promotion | catalog_sales | yes | |
objective | string | Optional platform-native objective value. | |
budget_amount | number | yes | Budget in account currency (USD). |
budget_type | daily | lifetime | ||
schedule_start | string | ISO date/datetime. | |
schedule_end | string | ISO date/datetime. | |
audience_id | string | Saved audience id (list_ad_audiences), or omit for broad. | |
pixel_id | string | Conversion goals: the platform pixel id (list_ad_pixels → platform_pixel_id). | |
event_name | string | Conversion goals: the event, e.g. Purchase, Lead. | |
lead_form_id | string | Lead goals on Meta: the Instant Form (list_ad_lead_forms). | |
product_set_id | string | catalog_sales: the product set the ad shows (list_ad_catalog_product_sets). | |
bid_strategy | string | ||
bid_amount | number | ||
special_ad_categories | string[] | HOUSING, EMPLOYMENT, CREDIT… when the ad is about one. | |
targeting | object | ||
inspired_by | object | The library ad this recipe is based on (from search_ad_library / get_ad_project): the editor links to it. Their words are a starting point, never their picture. | |
creatives | object[] | One or more ad variations (up to 6 are shown in the ad recipe editor). |
create_ad_catalog
Scope: ads:write
Make a new product catalog in the ad account owner's Meta business (it stays theirs). Fill it with send_shop_to_ad_catalog.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
name | string | yes |
create_ad_conversion_destination
Scope: ads:write
Make a conversion destination on an ad account (e.g. a Google conversion action for purchases).
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
name | string | yes | |
type | string | yes | PURCHASE, LEAD, SIGNUP… (what the platform supports). |
attribution_type | string | ||
post_click_window | string | ||
view_through_window | string |
create_ad_lead_form
Scope: ads:write
Make a Meta lead form. questions: [{ type: EMAIL|FULL_NAME|PHONE|CITY|… }] or custom ones ({ type: CUSTOM, key, label }). A privacy policy URL is required.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
name | string | yes | |
questions | object[] | yes | |
privacy_policy_url | string | yes | |
privacy_policy_link_text | string | ||
follow_up_action_url | string | ||
locale | string | ||
thank_you_title | string | ||
thank_you_body | string | ||
thank_you_button_text | string | ||
thank_you_button_type | string | ||
thank_you_website_url | string | ||
is_optimized_for_quality | boolean | Adds a review step so fewer, better leads come in. |
create_ad_pixel
Scope: ads:write
Make a new pixel on an ad account; returns the code to put on the website.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
name | string | yes |
create_ad_project
Scope: ads:write
Start a research project (free). Then add searches to it with search_ad_library { project }. Asking for a name that exists opens that one.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | e.g. "Bikes". |
create_click_to_call_ad
Scope: ads:write
Click-to-Call ads on Meta (spend money). Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- create [meta]: Create Click-to-Call ad (spends money — the space's ad policy applies) — params: creativeFeatures, tracking, name*, campaignName, adSetName, platformPostId, existingPostId, objectStoryId, pageId, whatsappPhoneNumber, headline, body, imageUrl, video, welcomeMessage, creatives, adSetId, budgetAmount, budgetType, currency, endDate, countries, cities, regions, zips, metros, countryGroups, customLocations, ageMin, ageMax, interests, audienceId, placements, advantageAudience, objective, status, campaignStatus, bidStrategy, bidAmount, roasAverageFloor, dsaBeneficiary, dsaPayor, regionalRegulatedCategories, regionalRegulationIdentities, phoneNumber*, linkUrl* For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | create | yes | |
params | object | The op's fields, by Zernio's names. |
create_messaging_ad
Scope: ads:write
Create a click-to-message ad that opens WhatsApp, Messenger, or Instagram Direct when tapped (Meta; spends money). Attribution flows back onto the resulting conversations automatically.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | |
name | string | yes | |
headline | string | yes | |
body | string | yes | |
image_url | string | yes | |
budget_amount | number | yes | |
budget_type | daily | lifetime | ||
destination | whatsapp | messenger | instagram_direct | ||
countries | string[] | ||
currency | string |
delete_ad_audience
Scope: ads:write
Delete an ad audience here and on the platform. Campaigns targeting it lose that targeting.
| Parameter | Type | Required | Description |
|---|---|---|---|
audience_id | string | yes | The ad audience (list_ad_audiences). |
delete_ad_board
Scope: ads:write
Delete a board and the ads saved in it.
| Parameter | Type | Required | Description |
|---|---|---|---|
board_id | string | yes |
delete_ad_campaign
Scope: ads:write
Delete a campaign from the ad platform (stops all its spend permanently). Destructive — prefer pausing unless the campaign is truly dead.
| Parameter | Type | Required | Description |
|---|---|---|---|
campaign_id | string | yes |
delete_ad_campaign_draft
Scope: ads:write
Delete an ad recipe. Campaigns already launched from it keep running; nothing on the ad platform changes.
| Parameter | Type | Required | Description |
|---|---|---|---|
draft_id | string | yes | The ad recipe (list_ad_campaign_drafts → id). |
delete_ad_catalog
Scope: ads:write
Delete a product catalog and every product in it on Meta. Catalog ads and shops using it lose it — destructive.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
catalog_id | string | yes | The catalog (list_ad_catalogs). |
delete_ad_catalog_product_set
Scope: ads:write
Delete a product set (ads showing it stop having products to show).
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
catalog_id | string | yes | The catalog (list_ad_catalogs). |
product_set_id | string | yes |
delete_ad_comment
Scope: ads:write
Delete a comment on an ad for good — prefer hiding unless it is spam or abuse.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
ad_id | string | yes | The ad (list_live_ads — its id or platform ad id). |
comment_id | string | yes | |
placement | facebook | instagram | Meta only: which side of the ad. |
delete_ad_conversion_destination
Scope: ads:write
Delete a conversion destination on the platform.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
destination_id | string | yes | The conversion destination (list_ad_conversion_destinations). |
delete_ad_project
Scope: ads:write
Delete a research project AND its searches (the ads they found go with them). Ads saved to boards stay saved.
| Parameter | Type | Required | Description |
|---|---|---|---|
project | string | yes | The research project: its project_id or its name (list_ad_projects). |
delete_ad_search
Scope: ads:write
Delete a kept search and the ads it found. In a project, ads another search also found stay. Saved ads stay saved.
| Parameter | Type | Required | Description |
|---|---|---|---|
search_id | string | yes |
describe_ads_op
Scope: ads:read
The full field reference of one ads op from the get_/change_ ads tools (Google keywords, extensions, PMax, bidding, conversion setup, creative library, forecasts, identities, research, labels, feeds…): what it does, each field's type, allowed values and meaning, nested shapes.
| Parameter | Type | Required | Description |
|---|---|---|---|
op | string | yes | e.g. add, or google_keywords.add |
duplicate_ad_campaign_draft
Scope: ads:write
Make a copy of an ad recipe (every field, never launched) — to try a variation without touching the original. Default name "<name> (copy)".
| Parameter | Type | Required | Description |
|---|---|---|---|
draft_id | string | yes | The ad recipe (list_ad_campaign_drafts → id). |
name | string |
duplicate_ads_entity
Scope: ads:write
Duplicate a campaign, ad set, or single ad (Meta for ad_set/ad). Copies start PAUSED by default (status_option ACTIVE|PAUSED|INHERITED_FROM_SOURCE). The winning-ad → new-audience play.
| Parameter | Type | Required | Description |
|---|---|---|---|
level | campaign | ad_set | ad | yes | |
campaign_id | string | Source (level=campaign) or destination (level=ad_set). | |
ad_set_id | string | Source ad set (level=ad_set) or destination (level=ad). | |
ad_id | string | Source ad (level=ad). | |
ad_account_id | string | ||
status_option | ACTIVE | PAUSED | INHERITED_FROM_SOURCE | ||
deep_copy | boolean | ||
rename_strategy | DEEP_RENAME | ONLY_TOP_LEVEL_RENAME | NO_RENAME | ||
rename_prefix | string | ||
rename_suffix | string |
estimate_ad_reach
Scope: ads:read
How many people a targeting would reach on this ad account, before spending anything.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
targeting | object | yes | The platform targeting spec (ages, geo, interests…). |
follow_advertiser
Scope: ads:write
Follow the business behind an ad: once a day Wakato looks at its ads and tells whoever follows it when it starts new ones (each look costs about as much as a search).
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_id | string | yes |
get_ad_account_finance
Scope: ads:read
Ad account balance, amount spent, spend cap and funding source. First stop when ads unexpectedly stop delivering (declined card, cap hit).
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes |
get_ad_bidding
Scope: ads:read
Bidding and timing: Google portfolio bid strategies, a campaign's bidding and ad schedule (dayparting), Meta value rule sets, Meta budget increases for high-demand periods. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- bid_strategies [google]: List portfolio bid strategies — params: fromDate, toDate
- campaign_bidding [google]: Read a campaign's current bidding — params: campaignId*, platform*
- ad_schedule [google]: Read a campaign's ad schedule (dayparting) — params: campaignId*, platform, includePerformance, windowDays, fromDate, toDate
- value_rule_sets [meta]: List value rule sets — params: limit, after
- value_rule_set [meta]: Read a value rule set — params: valueRuleSetId*
- high_demand_periods [meta]: List high-demand periods — params: campaignId, adSetId, limit, after For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | bid_strategies | campaign_bidding | ad_schedule | value_rule_sets | value_rule_set | high_demand_periods | yes | |
params | object | The op's fields, by Zernio's names. |
get_ad_campaign_analytics
Scope: ads:read
Performance summary for one of the space's campaigns (campaign_id from list_ad_campaigns): impressions, clicks, spend, conversions, funnel and engagement breakdowns.
| Parameter | Type | Required | Description |
|---|---|---|---|
campaign_id | string | yes | |
from_date | string | ||
to_date | string |
get_ad_campaign_draft
Scope: ads:read
One ad recipe in full: every field of its form (targeting, creatives, pixel, lead form…) and what it still needs before launching.
| Parameter | Type | Required | Description |
|---|---|---|---|
draft_id | string | yes | The ad recipe (list_ad_campaign_drafts → id). |
get_ad_campaign_tree
Scope: ads:read
An ad account's campaigns → ad sets → ads as one tree, live from the platform (including ones made outside Wakato), each with its numbers for the dates given.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
status | string | ||
from_date | string | YYYY-MM-DD | |
to_date | string | ||
only_ours | boolean | Only campaigns made through Wakato. | |
page | number | ||
limit | number |
get_ad_catalog_feeds
Scope: ads:read
A catalog's product feeds (a file Meta fetches on a schedule) and their uploads. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- feeds [meta]: List a catalog's product feeds — params: catalogId*
- feed_uploads [meta]: List a feed's uploads — params: catalogId*, feedId* For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | feeds | feed_uploads | yes | |
params | object | The op's fields, by Zernio's names. |
get_ad_conversion_quality
Scope: ads:read
How well the platform can match the events sent to real people (Meta's event match quality) and what would raise it.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
destination_id | string | yes | The conversion destination (list_ad_conversion_destinations). |
get_ad_creative_library
Scope: ads:read
Meta's creative library: saved creatives, images and videos stored on the ad account, reusable across ads. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- creatives [meta]: Creative library — params: fields, limit, after
- creative [meta]: Creative details — params: creativeId*, fields
- images [meta]: Ad image library — params: fields, limit, after
- videos [meta]: Ad video library — params: fields, limit, after For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | creatives | creative | images | videos | yes | |
params | object | The op's fields, by Zernio's names. |
get_ad_forecasts
Scope: ads:read
Forecasting before spending: Meta reach & frequency predictions (and reserving them), LinkedIn bid pricing and delivery forecasts. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- reach_frequency_prediction [meta]: Create reach-frequency prediction — params: budgetAmount, reach, startDate*, endDate*, frequencyCap, targeting, placements
- reach_frequency [meta]: Get reach-frequency prediction — params: predictionId*
- bid_pricing [linkedin]: Suggested bid and budget bounds — params: spec*, campaignType, bidType, matchType, currency, objectiveType, optimizationTargetType, dailyBudget
- supply_forecast [linkedin]: Forecast ad delivery — params: spec*, campaignType, timeRangeStart*, timeRangeEnd*, objectiveType, optimizationTarget, dailyBudget, totalBudget, currency, competingBid, enableAudienceNetwork, enableAudienceExpansion, connectedTelevisionOnly For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | reach_frequency_prediction | reach_frequency | bid_pricing | supply_forecast | yes | |
params | object | The op's fields, by Zernio's names. |
get_ad_identities
Scope: ads:read
Who an ad runs as and what it can promote: TikTok identities and pixels, Instagram accounts and posts to boost, partnership (creator) content and permissions, apps, businesses. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- tiktok_identities [tiktok]: List TikTok ad identities
- instagram_accounts [meta]: List Instagram ad identities
- instagram_posts [meta]: List Instagram posts to boost — params: igUserId, limit, after
- partnership_content [meta]: List partnership ad content — params: creatorUsername, postUrl, onlyAllowlisted
- partnership_permissions [meta]: List partnership permissions — params: creatorUsername
- apps [meta]: List advertisable apps
- businesses [meta]: Businesses list — params: limit, after
- tiktok_pixels [tiktok]: List TikTok ad pixels — params: code For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | tiktok_identities | instagram_accounts | instagram_posts | partnership_content | partnership_permissions | apps | businesses | tiktok_pixels | yes | |
params | object | The op's fields, by Zernio's names. |
get_ad_insights
Scope: ads:read
Flexible live ads insights. Meta: pass object_id (campaign/ad-set/ad platform id) plus optional level/breakdowns/action_breakdowns/date_preset or from_date+to_date. Google: pass a GAQL SELECT via query (int64 counters return as strings, money in micros). Use for deep performance questions the campaign summary can't answer.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | |
object_id | string | Meta object to query. | |
level | string | Meta: account|campaign|adset|ad. | |
breakdowns | string | Comma-separated Meta breakdowns (e.g. age,gender). | |
action_breakdowns | string | ||
date_preset | string | e.g. last_7d, last_30d. | |
from_date | string | ||
to_date | string | ||
time_increment | string | ||
query | string | Google: raw GAQL SELECT. | |
limit | number | ||
after | string | Meta paging cursor. | |
page_token | string | Google paging token. |
get_ad_labels_and_accounts
Scope: ads:read
Google Ads labels (tag campaigns, ad groups, ads, keywords) and the manager-account hierarchy and links. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- labels [meta/google]: List ad labels — params: limit, after
- account_hierarchy [google]: Get manager account hierarchy For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | labels | account_hierarchy | yes | |
params | object | The op's fields, by Zernio's names. |
get_ad_lead_form
Scope: ads:read
One lead form in full: its questions, privacy link, thank-you screen.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
form_id | string | yes |
get_ad_pixel_stats
Scope: ads:read
What a pixel has seen: events by type over time — the first check when conversions look wrong.
| Parameter | Type | Required | Description |
|---|---|---|---|
pixel_id | string | yes | The pixel (list_ad_pixels → pixel_id). |
aggregation | string | event | day | hour… | |
start_time | string | ||
end_time | string |
get_ad_project
Scope: ads:read
Read a research project's ads — every ad its searches found, ONCE each, with found_by (which searches found it). Free (no new search). Narrow with search_id (one search's ads), platform, active_only, min_days, new_only (marked New by the last refresh).
| Parameter | Type | Required | Description |
|---|---|---|---|
project | string | yes | The research project: its project_id or its name (list_ad_projects). |
search_id | string | ||
platform | meta | tiktok | google | linkedin | ||
active_only | boolean | ||
min_days | number | ||
new_only | boolean | ||
limit | number | Default 40, max 200. |
get_ad_research
Scope: ads:read
Research: the public Ad Library, A/B tests and lift studies, TikTok Smart+ creative results, iOS 14 limits, EU DSA defaults, Google Local Services leads. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- ad_library [meta/linkedin]: Search the public Ad Library — params: platform, q, pageIds, advertiser, countries, adType, status, platforms, mediaType, languages, since, until, searchType, fields, limit, after
- studies [meta]: A/B tests and lift studies — params: fields, limit, after
- smart_plus_materials [tiktok]: Per-creative performance inside TikTok Smart+ ads — params: startDate*, endDate*, level, smartPlusAdIds, adGroupIds, page, pageSize
- ios14_limits [meta]: Get iOS 14 campaign limits — params: applicationId*
- dsa_defaults [meta]: Get ad account DSA defaults
- dsa_recommendations [meta]: Get DSA recommendations
- local_services_leads [google]: Google Local Services Ads leads — params: fromDate, toDate, leadType, leadStatus, chargedOnly, pageToken
- local_services_conversations [google]: List lead conversations — params: leadId*, pageToken For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | ad_library | studies | smart_plus_materials | ios14_limits | dsa_defaults | dsa_recommendations | local_services_leads | local_services_conversations | yes | |
params | object | The op's fields, by Zernio's names. |
get_ad_search
Scope: ads:read
Read the ads a kept search found — free, no new provider call. Narrow with platform, active_only, min_days (ran at least that many days).
| Parameter | Type | Required | Description |
|---|---|---|---|
search_id | string | yes | |
platform | meta | tiktok | google | linkedin | ||
active_only | boolean | ||
min_days | number | ||
limit | number |
get_ad_set_details
Scope: ads:read
Live Meta ad-set read including learning_stage_info (LEARNING/SUCCESS/FAIL/WAIVING), delivery settings, budget, schedule and targeting. ALWAYS check the learning phase before recommending edits — editing a LEARNING ad set resets its progress.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | |
ad_set_id | string | yes | Platform ad set id. |
fields | string | Optional raw Graph fields override. |
get_ads_activity
Scope: ads:read
Ad account change/audit log: budget edits, status flips, review rejections — who changed what and when.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | |
since | string | ISO date lower bound. | |
until | string | ||
object_id | string | Restrict to one campaign/ad-set/ad. | |
limit | number |
get_ads_timeline
Scope: ads:read
The Analytics tab: an ad account's spend, impressions, clicks and results day by day, on any platform.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
from_date | string | YYYY-MM-DD | |
to_date | string |
get_google_ads_conversion_setup
Scope: ads:read
Google Ads conversion setup: conversion actions, account and campaign conversion goals, custom goals. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- actions [google]: List conversion actions — params: type
- goals [google]: List account conversion goals
- custom_goals [google]: List custom conversion goals
- campaign_goals [google]: Get campaign conversion goals — params: campaignId* For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | actions | goals | custom_goals | campaign_goals | yes | |
params | object | The op's fields, by Zernio's names. |
get_google_ads_extensions
Scope: ads:read
Google Ads extensions (assets): sitelinks, callouts and structured snippets on the account, a campaign or an ad group. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- sitelinks [google]: List account sitelinks
- callouts [google]: List account callouts
- snippets [google]: List account snippets
- campaign_assets [google]: List campaign assets — params: campaignId*
- ad_set_assets [google]: List ad-group assets — params: adSetId* For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | sitelinks | callouts | snippets | campaign_assets | ad_set_assets | yes | |
params | object | The op's fields, by Zernio's names. |
get_google_ads_keywords
Scope: ads:read
Google Ads Search keywords. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- list [google]: List Search keywords — params: page, limit, campaignId, adSetId, status, matchType, negative, search
- ideas [google]: Generate keyword ideas — params: seedKeywords, seedUrl, countries, languageConstantId, network, includeAdultKeywords, pageSize, pageToken
- historical_metrics [google]: Get historical keyword metrics — params: keywords*, countries, languageConstantId, network, includeAdultKeywords, includeAverageCpc
- search_terms [google]: Google Ads search terms report — params: fromDate, toDate, campaignId, adSetId, adGroupId, pageToken For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | list | ideas | historical_metrics | search_terms | yes | |
params | object | The op's fields, by Zernio's names. |
get_google_ads_negative_keywords
Scope: ads:read
Google Ads negative keywords — on a campaign and in shared lists. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- campaign_negatives [google]: List campaign-level negative keywords — params: campaignId*, platform
- lists [google]: List negative keyword lists — params: platform
- list [google]: Get a negative keyword list — params: listId*, platform
- campaign_lists [google]: List campaign negative lists — params: campaignId*, platform For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | campaign_negatives | lists | list | campaign_lists | yes | |
params | object | The op's fields, by Zernio's names. |
get_google_pmax_asset_groups
Scope: ads:read
Google Performance Max asset groups (their texts, images, final URLs and listing-group filters). Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- asset_groups [google]: List Performance Max asset groups — params: campaignId*
- asset_group [google]: Get a Performance Max asset group — params: campaignId*, assetGroupId* For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | asset_groups | asset_group | yes | |
params | object | The op's fields, by Zernio's names. |
hide_ad_comment
Scope: ads:write
Hide a comment on an ad from everyone but its writer and their friends (hidden: false shows it again). Softer than deleting.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
ad_id | string | yes | The ad (list_live_ads — its id or platform ad id). |
comment_id | string | yes | |
hidden | boolean | ||
placement | facebook | instagram | Meta only: which side of the ad. |
launch_ad_campaign
Scope: ads:write
LAUNCH a real ad campaign (spends money, subject to the space's ad policy — if the policy requires approval the campaign is queued for a human instead of launching). Same shape as validate_ad_campaign; run that first to catch platform rejections. Supports multi-creative, targeting, lead forms, pixels, schedules, Google Performance Max / Demand Gen (campaign_type), Meta reach & frequency (buying_type RESERVED), Meta website-lead and Page-like goals. Catalog ads (Meta): goal catalog_sales + promoted_object { productSetId, pixelId, customEventType } and ONE creative whose words may carry {{product.name}} / {{product.price}}.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | |
name | string | yes | |
goal | engagement | traffic | awareness | video_views | lead_generation | lead_conversion | conversions | app_promotion | catalog_sales | page_likes | yes | Meta also: lead_conversion (website leads — pixel + a leads event like LEAD in promoted_object) and page_likes. |
budget_amount | number | yes | WHOLE currency units (50 = $50). |
budget_type | daily | lifetime | ||
duration_days | number | ||
schedule_start | string | ||
schedule_end | string | ||
targeting | object | ||
creative | object | ||
creatives | object[] | ||
promoted_object | object | ||
lead_gen_form_id | string | ||
bid_strategy | string | ||
bid_amount | number | ||
special_ad_categories | string[] | ||
currency | string | ||
optimization_goal | string | ||
audience_id | string | ||
idempotency_key | string | Stable key so retries can't double-launch. | |
campaign_type | search | display | pmax | demand_gen | Google only. pmax needs asset_group, demand_gen needs demand_gen; both start PAUSED (resume with set_ads_delivery). | |
asset_group | object | Google Performance Max assets: finalUrl, headlines (3-15, ≤30 chars), longHeadline (≤90), descriptions (2-5, one ≤60), businessName (≤25), images { landscape[], square[], logo[] } (public URLs). | |
demand_gen | object | Google Demand Gen: finalUrl, businessName, headlines (≤40), descriptions (≤90), images { logo[], landscape[] or square[] }, optional callToAction, youtubeVideoIds, carouselCards. | |
buying_type | AUCTION | RESERVED | Meta only. RESERVED = a reach & frequency campaign on a reserved prediction (change_ad_forecasts reserve_reach_frequency) — budget and schedule come from the reservation; one creative. | |
rf_prediction_id | string | RESERVED only: the id the reserve step returned. |
launch_ad_campaign_draft
Scope: ads:write
LAUNCH an ad recipe exactly as the Launch button does (spends money; the space's ad policy may hold it for a person to approve). It becomes a new campaign on the recipe's account, the one you pass, or the space's only account on that platform. The recipe STAYS, so it can be launched again (each launch is its own campaign). Refused with the missing pieces when it isn't ready.
| Parameter | Type | Required | Description |
|---|---|---|---|
draft_id | string | yes | The ad recipe (list_ad_campaign_drafts → id). |
ad_account_id | string | The ad account (list_ad_accounts). | |
campaign_name | string | The launched campaign's name. Default: the recipe's name (the page suggests "<recipe> · <date>" so launches tell apart). |
link_ad_conversion_campaigns
Scope: ads:write
Which campaigns a conversion destination counts for: pass campaign_ids to link them (unlink: true to take them off); pass none to see the current ones.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
destination_id | string | yes | The conversion destination (list_ad_conversion_destinations). |
campaign_ids | string[] | Platform campaign ids. | |
unlink | boolean |
list_ad_accounts
Scope: ads:read
List ad accounts connected to the space.
list_ad_audiences
Scope: ads:read
The saved ad audiences (custom, lookalike, customer lists) on the space's ad accounts, with their size and status.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | The ad account (list_ad_accounts). |
list_ad_boards
Scope: ads:read
The space's boards of saved ads (Inspiration → Saved), each with its ads. Use them as reference when writing ad recipes ("three ads like my Before/after board").
list_ad_campaign_drafts
Scope: ads:read
The space's AD RECIPES (Ads Manager → Ad recipes): ads with their settings, written down once and launched as many times as wanted. Each has name, platform, goal, budget, how many ad variations, how many times it was launched, and before_launch — what the Launch button would say is still missing (empty = it can launch). (The tool names still say "draft".)
| Parameter | Type | Required | Description |
|---|---|---|---|
platform | string | ||
limit | number |
list_ad_campaigns
Scope: ads:read
List the space's launched ad campaigns (running, paused, held for a person's approval, rejected — with rejected_reason). Each says the AD RECIPE it was launched from (recipe); pass recipe_id to list the campaigns one recipe launched. Ads not launched yet are ad recipes: list_ad_campaign_drafts.
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | ||
recipe_id | string | Only the campaigns launched from this ad recipe. | |
limit | number |
list_ad_catalog_product_sets
Scope: ads:read
A catalog's product sets — the slices a catalog ad can show.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
catalog_id | string | yes | The catalog (list_ad_catalogs). |
list_ad_catalog_products
Scope: ads:read
The products in a catalog as Meta holds them (price as Meta formats it). retailer_id = a listing id finds one of the shop's.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
catalog_id | string | yes | The catalog (list_ad_catalogs). |
retailer_id | string | ||
limit | number | ||
after | string |
list_ad_catalogs
Scope: ads:read
The product catalogs (Meta Commerce) the ad account's business holds, and shop_sync: which of them this space's shop sends its products to, when it last did, and what Meta refused.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
list_ad_comments
Scope: ads:read
The comments people left on an ad (Meta or TikTok) — a Meta ad running on Facebook and Instagram has two threads: placement picks one (Instagram by default when it has one). Each comment says who wrote it and whether you can reply or hide it.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
ad_id | string | yes | The ad (list_live_ads — its id or platform ad id). |
placement | facebook | instagram | Meta only: which side of the ad. | |
limit | number | ||
cursor | string |
list_ad_conversion_destinations
Scope: ads:read
Where server-side conversions go on an ad account (pixels/datasets on Meta, conversion actions on Google, …).
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
list_ad_conversion_events
Scope: ads:read
The conversion events sent to the ad platforms from this space (the Conversions tab log): which went through and which failed, and why.
| Parameter | Type | Required | Description |
|---|---|---|---|
status | sent | failed | queued | ||
limit | number |
list_ad_lead_forms
Scope: ads:read
The Instant Forms (Meta lead forms) on an ad account — a Leads campaign needs one.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
limit | number | ||
cursor | string |
list_ad_leads
Scope: ads:read
The leads people submitted through the account's lead ads — all of them, or one form's — newest first.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
form_id | string | ||
since | string | ISO date. | |
limit | number | ||
cursor | string |
list_ad_pixel_shares
Scope: ads:read
Which ad accounts a pixel is shared with.
| Parameter | Type | Required | Description |
|---|---|---|---|
pixel_id | string | yes | The pixel (list_ad_pixels → pixel_id). |
list_ad_pixels
Scope: ads:read
The pixels (tracking tags) on an ad account: install code (for a site Wakato does not serve), whether Wakato puts it on this space's pages itself, automatic matching, whether the shop's paid orders fire Purchase through it and the last sale it reported, which accounts it is shared with.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
list_ad_projects
Scope: ads:read
The space's research projects (Ads Manager → Inspiration): one topic ("Bikes") researched with many searches ("electric bike", "kids bike", "trek.com"). Each lists its searches, how many DIFFERENT ads they found together (an ad two searches found counts once), and whether it refreshes weekly.
list_ad_searches
Scope: ads:read
The ad-library searches this space kept (Ads Manager → Inspiration): words, country, how many ads, when, whether it refreshes weekly, and project_id (the research project it belongs to; null = on its own).
list_followed_advertisers
Scope: ads:read
The advertisers this space follows: how many ads each runs now and how many are new this week.
list_live_ad_campaigns
Scope: ads:read
List campaigns straight from the ad platform (via Zernio), including ones created outside Wakato that list_ad_campaigns (local DB) can't see. include_empty=true also returns Meta campaigns with zero ads.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | |
platform | string | ||
status | string | ||
include_empty | boolean | ||
page | number | ||
limit | number | ||
from_date | string | ||
to_date | string |
list_live_ads
Scope: ads:read
List LIVE ads from the ad platform (via Zernio) with delivery status and metrics — includes ads created outside Wakato. Filter by campaign_id (local UUID or platform id), status, platform. Each ad carries creative info, reviewStatus (in_review/approved/rejected/with_issues) and metrics incl. the conversion funnel.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | From list_ad_accounts. |
campaign_id | string | ||
status | string | ||
platform | string | ||
limit | number | ||
from_date | string | YYYY-MM-DD metrics range start. | |
to_date | string |
load_more_ads
Scope: ads:read
Load the NEXT page of a kept search (Inspiration → Load more). Each platform answers one page per search (Meta and LinkedIn up to ~50, TikTok 20, Google ~16 per business); a search's per_platform notes carry more on each platform that has another page. One paid lookup per platform asked (Google by words: one per business it read). Adds the new ads to the search — nothing already kept changes — and says which platforms still have more.
| Parameter | Type | Required | Description |
|---|---|---|---|
search_id | string | yes | From search_ad_library / list_ad_searches. |
platforms | string[] | Only these platforms (default: every one that has more). | |
limit | number | How many of the added ads to return (default 25, max 100); all are kept in the search. |
move_ad_search
Scope: ads:write
Put a kept search into a research project (free — its ads join the project, each ad once), or take it out (project: "" → a search on its own).
| Parameter | Type | Required | Description |
|---|---|---|---|
search_id | string | yes | |
project | string | yes | Project name or id; an empty string takes it out. |
open_library_ad
Scope: ads:read
Open one ad from a search in full (Inspiration): for a Meta ad also who it reached in the EU/UK (reach, age · gender · country, the places targeted, who paid) and every version of it; for a TikTok ad how it ranks in its industry for click rate and which seconds of the video pull the clicks; for a Google ad its YouTube video (a video ad), words, link and where it ran. About 1–3 cents the first time, then kept 7 days (free). LinkedIn has nothing more than the search gave.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_id | string | yes | From search_ad_library / get_ad_search. |
refresh | boolean |
pause_ads_delivery
Scope: ads:write
PAUSE delivery at any level — campaign (campaign_id from list_ad_campaigns), ad_set (ad_set_id + campaign_id or ad_account_id), or single ad (ad_id + ad_account_id). Pausing only ever STOPS spend, so it's always safe to do autonomously when an ad underperforms or misbehaves. To resume, use set_ads_delivery.
| Parameter | Type | Required | Description |
|---|---|---|---|
level | campaign | ad_set | ad | yes | |
campaign_id | string | ||
ad_set_id | string | ||
ad_id | string | ||
ad_account_id | string |
preview_ad
Scope: ads:read
Render Meta ad previews as embeddable HTML iframes. Pass ad_id for an existing ad, or creative_spec / existing_creative_id to preview BEFORE creating. Optional formats array of Meta ad_format values (default DESKTOP_FEED_STANDARD).
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | |
ad_id | string | ||
existing_creative_id | string | ||
creative_spec | object | Raw Meta creative spec. | |
formats | string[] |
refresh_ad_audience_size
Scope: ads:read
Ask the platform how big an ad audience is now.
| Parameter | Type | Required | Description |
|---|---|---|---|
audience_id | string | yes | The ad audience (list_ad_audiences). |
refresh_ad_campaign_metrics
Scope: ads:read
Pull a campaign's latest numbers from the ad platform now (the drawer's Refresh). Then read them with get_ad_campaign_analytics.
| Parameter | Type | Required | Description |
|---|---|---|---|
campaign_id | string | yes | list_ad_campaigns → id. |
refresh_ad_project
Scope: ads:read
Look again now with every search of a project (each charged like the search, about 2 cents a platform). Says how many new ads each search found.
| Parameter | Type | Required | Description |
|---|---|---|---|
project | string | yes | The research project: its project_id or its name (list_ad_projects). |
rename_ad_board
Scope: ads:write
Rename a board of saved ads.
| Parameter | Type | Required | Description |
|---|---|---|---|
board_id | string | yes | |
name | string | yes |
rename_ad_project
Scope: ads:write
Rename a research project.
| Parameter | Type | Required | Description |
|---|---|---|---|
project | string | yes | The research project: its project_id or its name (list_ad_projects). |
name | string | yes |
reply_to_ad_comment
Scope: ads:write
Answer a comment on an ad, publicly under it, as the Page / Instagram / TikTok account the ad runs as.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
ad_id | string | yes | The ad (list_live_ads — its id or platform ad id). |
comment_id | string | yes | |
text | string | yes | |
placement | facebook | instagram | Meta only: which side of the ad. |
save_ad_catalog_product_set
Scope: ads:write
Make a product set (no product_set_id) or change one: a slice of the catalog a catalog ad shows. Name the shop's listings with listing_ids, or pass Meta's filter, e.g. { "price": { "lt": 5000 } }.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
catalog_id | string | yes | The catalog (list_ad_catalogs). |
product_set_id | string | Change this one; omit to make a new one. | |
name | string | ||
listing_ids | string[] | The shop's listings to include. | |
filter | object | Meta's product set filter, instead of listing_ids. |
save_library_ad
Scope: ads:write
Keep an ad from a search in one of the space's boards (Inspiration → Saved), with a copy of its picture so it survives the advertiser stopping it. Name a board (made if new) or pass board_id.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_id | string | yes | From search_ad_library / get_ad_search. |
board_id | string | ||
board_name | string | e.g. "Before/after hooks" — made if it doesn't exist. | |
note | string | Why it's worth keeping. |
search_ad_library
Scope: ads:read
Research the ads OTHER businesses are running (Ads Manager → Inspiration): searches the Meta Ad Library, TikTok's top ads, Google's ads and the LinkedIn Ad Library at once. by: "words" (a service, e.g. "roof cleaning") or by: "business" (a business name or its website — Google can ONLY be searched this way). Each ad says how long it has run (Meta, Google), how many versions the advertiser tests (Meta), likes / click rate / spend level (TikTok), its button and where it sends people. Ads that run for months are usually the ones making money. Costs about 2 cents a platform from the space's budget; the same search again the same day is free (refresh:true asks again). The search is kept for the space.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | yes | Words ("roof cleaning") or a business / website ("cleanroofco.com"). |
by | words | business | Default words. | |
country | string | 2-letter country code, or ALL (default). | |
platforms | string[] | Default: all four. | |
refresh | boolean | Ask the platforms again even if this ran today. | |
limit | number | How many ads to return (default 25, max 100); the rest stay readable with get_ad_search. | |
project | string | Put this search in a research project (its name or project_id; a new name makes the project). The answer says how many ads were NEW to the project — the rest were already found by its other searches and show once. | |
advertiser_ref | string | by business: a known advertiser id (Meta page id, Google AR id or a domain — list_followed_advertisers gives it). A Meta business is found by its page id, not its name. |
search_ad_targeting
Scope: ads:read
Find the platform's ids for a place, an interest, a behavior or an income band before targeting it ("Irvine", "home improvement"). Put what you pick into a draft's targeting.locations / interests / behaviors.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
query | string | yes | |
kind | location | interest | behavior | income | ||
location_type | country | region | city | zip | metro | ||
country_code | string |
send_ad_conversion_event
Scope: ads:write
Send conversion events to the platform server-side (a sale, a lead that happened off the site). events: [{ event_name, event_time, event_id, value, currency, user: { email, phone } }]. Pass test_code to send them as test events.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
destination_id | string | yes | The conversion destination (list_ad_conversion_destinations). |
events | object[] | yes | |
test_code | string |
send_shop_to_ad_catalog
Scope: ads:write
Send the live products of the shop run from this space into a Meta catalog — an existing one (catalog_id) or a new one (new_catalog_name) — and keep them current: price, stock, pictures and listings taken down follow every 15 minutes. Called again for a catalog it already feeds, it sends what changed right now. Needs a Meta ad account whose login may manage catalogs.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
catalog_id | string | The catalog (list_ad_catalogs). | |
new_catalog_name | string |
send_test_ad_lead
Scope: ads:write
Submit a test lead through a form, to check that leads arrive (and reach the space's contacts).
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
form_id | string | yes | |
answers | object[] | yes | e.g. [{ "name": "email", "values": ["test@example.com"] }] |
set_ad_audience_companies
Scope: ads:write
LinkedIn company-list audiences. Pass op and its params (Zernio's field names, * = required); the ad account's own ids are filled in for you.
- set_companies [linkedin]: Replace audience companies — params: audienceId*, companies* For an op's nested fields (shapes, enums), ask describe_ads_op.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
op | set_companies | yes | |
params | object | The op's fields, by Zernio's names. |
set_ad_project_weekly
Scope: ads:write
Look again with every search of a project each week (each look costs as much as the search). New ads come marked New.
| Parameter | Type | Required | Description |
|---|---|---|---|
project | string | yes | The research project: its project_id or its name (list_ad_projects). |
weekly | boolean | yes |
set_ad_search_weekly
Scope: ads:write
Look again with a search on its own each week (a search in a project follows its project's switch: set_ad_project_weekly).
| Parameter | Type | Required | Description |
|---|---|---|---|
search_id | string | yes | |
weekly | boolean | yes |
set_ads_delivery
Scope: ads:write
Pause OR RESUME delivery at campaign, ad_set, or ad level. Resuming restarts spend on a previously-launched campaign. (pause_ads_delivery still exists for pause-only callers.)
| Parameter | Type | Required | Description |
|---|---|---|---|
level | campaign | ad_set | ad | yes | |
status | active | paused | yes | |
campaign_id | string | ||
ad_set_id | string | ||
ad_id | string | ||
ad_account_id | string |
set_advertiser_alerts
Scope: ads:write
Switch whether the space is told (a notification) when a followed advertiser starts new ads. The daily look and the automation trigger keep running either way.
| Parameter | Type | Required | Description |
|---|---|---|---|
follow_id | string | yes | |
notify | boolean | yes |
set_tiktok_brand_identity
Scope: ads:write
The name and picture a TikTok ad account's ads appear under (ads-only accounts need one).
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
display_name | string | yes | |
image_url | string | yes |
share_ad_pixel
Scope: ads:write
Let another ad account of the same owner use a pixel (or stop it with stop: true).
| Parameter | Type | Required | Description |
|---|---|---|---|
pixel_id | string | yes | The pixel (list_ad_pixels → pixel_id). |
with_ad_account_id | string | yes | The ad account (list_ad_accounts). |
stop | boolean |
show_ads
Scope: ads:read
Show ads from this space's Ads Manager as CARDS in the chat — the ad as people see it (picture or video, headline, text, button), its status (running, paused, in review, rejected) and its numbers for the period: spent, results (purchases, leads or link clicks — what the ad is for), cost each, CTR. Use it whenever someone asks to see, show, find or check particular ads or how they did ("show me my newest ads", "how is the Halloween ad doing", "which ad spent the most this week"), instead of listing numbers in text. Narrow with search (words in the ad, campaign or ad set name or text), campaign, ad_ids, status, sort and the period (days, or from_date/to_date). Up to 6 cards. Only people who may see this space's Ads Manager see the cards; others in the chat see one line. After it, write one or two sentences on what stands out — never repeat the numbers on the cards. Changes nothing.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | Which ad account (list_ad_accounts). Needed only when the space has more than one. | |
search | string | Words in the ad, its campaign or ad set name, or its text — e.g. 'halloween', 'shorts'. | |
campaign | string | A campaign's name (words) or platform campaign id. | |
ad_ids | string[] | Platform ad ids, when you already know which ads. | |
status | running | paused | in_review | rejected | ended | Only ads in this state. | |
sort | newest | spend | results | newest (default), most spent, or most results in the period. | |
days | number | The last N days, today included (default 30). | |
from_date | string | Start day YYYY-MM-DD (instead of days). | |
to_date | string | End day YYYY-MM-DD (default today). | |
limit | number | How many cards, 1–6 (default 3). | |
note | string | Optional line above the cards. |
stop_following_advertiser
Scope: ads:write
Stop following an advertiser (list_followed_advertisers gives follow_id).
| Parameter | Type | Required | Description |
|---|---|---|---|
follow_id | string | yes |
stop_shop_ad_catalog
Scope: ads:write
Stop sending the shop's products to a catalog. remove_products: true also takes them out of it.
| Parameter | Type | Required | Description |
|---|---|---|---|
catalog_id | string | yes | The catalog (list_ad_catalogs). |
remove_products | boolean |
unsave_library_ad
Scope: ads:write
Take a saved ad out of its board (list_ad_boards gives saved_id).
| Parameter | Type | Required | Description |
|---|---|---|---|
saved_id | string | yes |
update_ad_campaign
Scope: ads:write
Edit a live campaign as the Edit dialog does: name, goal, budget, bid strategy/amount, special ad categories (Meta + Google). target_ad_set puts a budget/bid change on its ad set instead. Unsupported fields are rejected by the platform with a 400.
| Parameter | Type | Required | Description |
|---|---|---|---|
campaign_id | string | yes | |
name | string | ||
goal | engagement | traffic | awareness | video_views | lead_generation | conversions | app_promotion | catalog_sales | ||
special_ad_categories | string[] | ||
target_ad_set | boolean | ||
budget_amount | number | ||
budget_type | daily | lifetime | ||
bid_strategy | string | ||
bid_amount | number | ||
roas_average_floor | number |
update_ad_campaign_draft
Scope: ads:write
Change an ad recipe — only the fields you pass change. Pass creatives to replace its ad variations. Nothing is spent, and campaigns already launched from it keep running as they were.
| Parameter | Type | Required | Description |
|---|---|---|---|
draft_id | string | yes | The ad recipe (list_ad_campaign_drafts → id). |
name | string | ||
platform | metaads | googleads | tiktokads | linkedinads | pinterestads | xads | openaiads | The ad platform. On update: moves the recipe to another platform (only while no account pins it). | |
inspired_by | object | The library ad this recipe is based on (from search_ad_library / get_ad_project): the editor links to it. Their words are a starting point, never their picture. | |
ad_account_id | string | Pin the account it launches on (same platform). Empty string clears it. | |
goal | engagement | traffic | awareness | video_views | lead_generation | conversions | app_promotion | catalog_sales | catalog_sales = Meta catalog ads (each person sees products from a product set): needs product_set_id, pixel_id and event_name. | |
objective | string | Platform-native objective, optional. | |
budget_amount | number | Whole currency units (50 = $50). | |
budget_type | daily | lifetime | ||
schedule_start | string | ISO date/datetime. | |
schedule_end | string | ISO date/datetime. A lifetime budget needs one. | |
audience_id | string | A saved ad audience (list_ad_audiences), or "none" for broad. | |
pixel_id | string | Conversion goals: the platform pixel id (list_ad_pixels → platform_pixel_id). | |
event_name | string | Conversion goals: the event, e.g. Purchase, Lead. | |
lead_form_id | string | Lead goals on Meta: the Instant Form (list_ad_lead_forms). | |
product_set_id | string | catalog_sales: the product set the ad shows (list_ad_catalog_product_sets). | |
bid_strategy | string | ||
bid_amount | number | ||
special_ad_categories | string[] | HOUSING, EMPLOYMENT, CREDIT… when the ad is about one. | |
targeting | object | ||
creatives | object[] | Replaces the draft's ad variations (up to 6). |
update_ad_conversion_destination
Scope: ads:write
Change a conversion destination: name, on/off, attribution windows, its value.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | The ad account (list_ad_accounts). |
destination_id | string | yes | The conversion destination (list_ad_conversion_destinations). |
name | string | ||
enabled | boolean | ||
attribution_type | string | ||
post_click_window | string | ||
view_through_window | string | ||
value_type | string | ||
value | number |
update_ad_creative
Scope: ads:write
Change what a live ad says or shows — headline, body, image/video, link, button — and optionally its targeting. Changes the campaign's first ad unless ad_id names another. The platform reviews the ad again.
| Parameter | Type | Required | Description |
|---|---|---|---|
campaign_id | string | yes | |
ad_id | string | A specific ad of the campaign (list_live_ads). | |
creative | object | yes | |
targeting | object |
update_ad_pixel
Scope: ads:write
Change a pixel: rename it, switch automatic matching, put it on every published page of this space or take it off (on_this_space_pages — Wakato adds the code itself, nothing to paste), or switch whether the shop's paid orders fire a Purchase event through it (auto_fire_purchases, optionally to a conversion destination).
| Parameter | Type | Required | Description |
|---|---|---|---|
pixel_id | string | yes | The pixel (list_ad_pixels → pixel_id). |
name | string | ||
automatic_matching | boolean | ||
auto_fire_purchases | boolean | ||
auto_fire_destination_id | string | ||
on_this_space_pages | boolean | true = Wakato puts this pixel on every published page of this space (its own pages and its site's domain); false = takes it off. |
update_ad_set
Scope: ads:write
Edit a live ad set: budget, status, name, bid strategy, Meta value rules. CHECK get_ad_set_details first — editing an ad set in the LEARNING phase resets its progress. On a CBO campaign, budget edits belong on update_ad_campaign instead (409 BUDGET_LEVEL_MISMATCH).
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | |
ad_set_id | string | yes | |
budget_amount | number | ||
budget_type | daily | lifetime | ||
status | active | paused | ||
name | string | ||
bid_strategy | string | ||
bid_amount | number | ||
roas_average_floor | number | ||
value_rule_set_id | string | ||
value_rules_applied | boolean | ||
platform | string |
validate_ad_campaign
Scope: ads:read
DRY-RUN a full campaign spec against the ad platform (Meta validateOnly) — same arguments as a real create (name, goal, budget_amount, creative(s), targeting...) but nothing is created and nothing is spent. Run this on a draft before asking a human to launch, so rejections surface as fixable errors instead of failed launches.
| Parameter | Type | Required | Description |
|---|---|---|---|
ad_account_id | string | yes | |
name | string | yes | |
goal | engagement | traffic | awareness | video_views | lead_generation | lead_conversion | conversions | app_promotion | catalog_sales | page_likes | yes | |
budget_amount | number | yes | |
budget_type | daily | lifetime | ||
schedule_start | string | ||
schedule_end | string | ||
targeting | object | ||
creative | object | ||
creatives | object[] | ||
promoted_object | object | ||
lead_gen_form_id | string | ||
bid_strategy | string | ||
bid_amount | number | ||
special_ad_categories | string[] | ||
campaign_type | search | display | pmax | demand_gen | Google only. pmax needs asset_group, demand_gen needs demand_gen; both start PAUSED. | |
asset_group | object | Google Performance Max assets: finalUrl, headlines (3-15, ≤30 chars), longHeadline (≤90), descriptions (2-5, one ≤60), businessName (≤25), images { landscape[], square[], logo[] }. | |
demand_gen | object | Google Demand Gen: finalUrl, businessName, headlines (≤40), descriptions (≤90), images { logo[], landscape[] or square[] }. | |
buying_type | AUCTION | RESERVED | Meta only. RESERVED = reach & frequency on a reserved prediction. | |
rf_prediction_id | string | RESERVED only: the id the reserve step returned. |