Obtain a System User access token with ads_management permission scoped to the ad account.
POST to /v{API_VERSION}/act_AD_ACCOUNT_ID/campaigns with fields: name, objective (e.g. OUTCOME_TRAFFIC or OUTCOME_LEADS), status (PAUSED recommended), and special_ad_categories (empty array if none apply).
Capture the returned campaign id and create an ad set by POSTing to /act_AD_ACCOUNT_ID/adsets with the campaign_id, targeting spec, optimization_goal, billing_event, bid_amount or bid_strategy, and daily_budget or lifetime_budget.
Create an ad creative by POSTing to /act_AD_ACCOUNT_ID/adcreatives with object_story_spec or asset_feed_spec.
Create the ad by POSTing to /act_AD_ACCOUNT_ID/ads with the adset_id, creative (referencing the creative id), and status.
Use GET /act_AD_ACCOUNT_ID/campaigns?fields=id,name,status to verify the hierarchy was created correctly.
Known gotchas
Campaign objectives changed to OUTCOME_* naming in newer API versions; older objective names like LINK_CLICKS or CONVERSIONS may be rejected depending on the API version used.
special_ad_categories is required even when empty — omitting the field returns a validation error for certain objectives.
Ad accounts with outstanding balances or policy violations will receive an error on campaign creation regardless of correct API usage.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp