calendar Last updated: 21 September 2026
meta ads to claude
Data integration
Data Pipelines
Facebook Ads
How to's

How to Connect Meta Ads (Facebook) to Claude: 2 Ways, No Code

Try It Free

Connect your data in 1 min. Free forever plan

Got insights from this post? Give it a boost by sharing with others!

🚀 There are two ways to connect Meta Ads to Claude: Meta’s official Meta Ads AI connector, which you add in Claude as a custom connector, or the Windsor.ai connector, installed in one click from Claude’s directory. For the Windsor.ai route, link your Meta account at https://onboard.windsor.ai/app/facebook, then search “Windsor” under Connectors in Claude and click Add. Get started for free.

With both routes, the connector is what makes this possible: Claude can turn raw performance data into clear answers, but only once it has access to your ad metrics. Without one, spend, ROAS, conversions and the other KPIs stay inside Meta Ads Manager.

Meta launched its official Meta Ads AI connector in April 2026. It is a remote MCP server (mcp.facebook.com/ads) that you add in Claude as a custom connector by pasting the URL and signing in with your Facebook login. It covers Meta Ads only, and on the free Claude plan it uses the single custom connector slot you get.

Windsor.ai takes a different route. It is listed in Claude’s directory, so you install it in one click with no server URL to configure, and it does not use your custom connector slot. It links Meta Ads to Claude through the Meta Marketing API, giving Claude live access to 560+ metrics and 150+ dimensions without a manual export, and the same connector brings Google Ads, GA4, Shopify and 350+ other sources into the same chat.

Ready to build Meta Ads performance reports like this, powered by Windsor.ai’s direct connector for Claude?

meta ads report in claude

This guide covers the Windsor.ai setup first, then Meta’s official connector and the manual CSV route, so you can choose.

Which route should you use

Meta’s official connector is the right choice if Meta Ads is the only data you need in Claude and one custom connector per Facebook login suits you. Choose Windsor.ai when any of these apply:

  • You want Meta Ads next to other channels in one answer. Among the teams that pull Meta Ads through Windsor.ai, Google Ads and GA4 are the sources most often pulled alongside it in the same week, with Shopify and TikTok Ads behind them. One connector covers all of them.
  • You want the same data outside Claude too. The connection that feeds Claude also feeds Data Studio, Power BI, BigQuery, Snowflake and 25+ other destinations.
  • You are on the free Claude plan. It allows one custom connector. Windsor.ai installs from the directory and leaves that slot free.
  • You manage several client accounts. In Windsor.ai you choose which ad accounts to connect, so Claude sees only those, instead of everything your Facebook login can reach.

Both routes give Claude read and write access to your ad accounts, and both run through Meta’s official Marketing API.

Send Meta Ads data to Claude in 2 steps

The connection between your Meta Ads account and Claude happens in two quick moves: link your Meta Ads account to Windsor.ai and add the Windsor.ai connector in Claude. You’re ready to start querying your data!

📖 Follow our quick step-by-step guide to automatically integrate your data into Claude.

Youtube video

What you’ll need

  • A Windsor.ai account (free or paid plan)
  • Facebook/Meta Ads account with view or admin access
  • Claude account

Step 1: Connect your Meta Ads account(s) to Windsor.ai

To link your data, first, you have to authenticate your Meta Ads Manager through the Windsor.ai onboarding portal.

Facebook Ads data source

Windsor pulls data directly from the Meta Ads API, normalizing it in the background so Claude gets clean, structured datasets instead of raw export files.

Once connected, Windsor maintains a live pipeline from your ad account to Claude. The data stays current without any manual refresh.

Step 2: Add the Windsor.ai connector in Claude

With your data flowing into Windsor, the next step is to send Meta Ads data to Claude by adding the Windsor.ai connector for Claude.

windsor.ai connector claude

  • You will be prompted to authorize the connection. Select “Always allow” to avoid repeated permission prompts.

how to use windsor.ai claude connector

To open the connector in Claude Desktop, paste the following link into your browser:

claude://claude.ai/directory/connectors/360c0c31-4bb6-42ca-8e50-5da0a100a68e

Windsor MCP now appears in your active connectors. Open a new Claude chat to start querying your Facebook Ads data, or to take action on it directly.

Query and act on your Meta Ads data in Claude

With the connection live, you can ask Claude about your ad performance using plain language. Instead of building dashboards or navigating Ads Manager to make changes, you tell Claude what you want to know, review its recommendations, and execute directly on your Meta Ads data.

Try these sample prompts:

  • “Show ROAS by campaign for the last 30 days and highlight campaigns below 2.0.”
  • “Compare spend, conversions, and CPA this month vs. last month and suggest budget reallocation.”
  • “Which of my active campaigns have had a CPA above target for the last 7 days? Pause the worst performer.”

💡 Pro tip: Mastering attribution in Claude

When querying your data, always specify your attribution window (e.g., “Show me 7-day click vs. 1-day view conversions”).

Because Windsor.ai pulls raw Meta Marketing API data, Claude can help you identify “hidden” conversion value that the standard Ads Manager UI often over-simplifies. This allows you to see exactly how many users saw an ad and converted later, even if they didn’t click immediately.

What you can do once it’s connected

Once Meta Ads is connected, Claude can do three broad things with your data:

  • Ask questions and build reports: multi-account client summaries, budget reallocation recommendations, and live dashboards that auto-refresh. See ‘Claude prompts for Meta Ads reporting and analysis‘ for the full prompt library.
  • Create and manage live campaigns: create campaigns and ad sets, pause or enable them, adjust budgets, edit an ad’s creative, or boost an organic post, all with your explicit approval before anything runs. Meta Ads automation carries real ban risk if handled carelessly, so this comes with a 5-rule safety protocol. See ‘How to manage Meta Ads campaigns from Claude‘ for the full list of supported actions, sample prompts, and the safety rules.
  • Blend Meta Ads with your other data: combine campaign performance with Shopify or e-commerce revenue, CRM opportunities from HubSpot or Salesforce, GA4 conversions, or any of Windsor’s 350+ connected sources, all in the same Claude conversation, no manual joins or spreadsheet work required.
Youtube video

Prompts by task, from what teams ask most

These are the questions teams ask most once Meta Ads is connected to Claude through Windsor.ai. The fields requested most are spend, campaign, impressions, clicks and date, with reach, CTR, frequency, ad name and the purchase and lead actions close behind, so the prompts below are built on those. Each one runs on fields the connector returns; paste it as it is and change the dates.

Weekly performance table

“Show spend, impressions, clicks and CTR by campaign for the last 7 days next to the 7 days before, and flag every campaign where CPC rose by more than 20%.”

Revenue and ROAS

“Give me purchases, purchase value and purchase ROAS by campaign for the last 30 days, ranked by ROAS, with spend next to each.”

Leads and landing pages

“Cost per lead by ad set this month, with landing page views, and list the ad sets that record leads but few landing page views.”

Creative fatigue

“For every ad with frequency above 3 in the last 14 days, show reach, CTR and CPM week by week and tell me which creatives to rotate.”

Placements and audiences

“Break down spend and purchase ROAS by publisher platform and placement for the last 30 days, then by age and gender, and point out where the spend is not earning its share.”

Account structure audit

“List every active campaign with its objective and, for each ad set, the optimisation goal, daily budget and targeting. Flag objectives and optimisation goals that do not match.” The four checks behind this prompt are in the Meta Ads structure audit.

Meta Ads next to Google Ads

“Put Meta Ads and Google Ads spend, purchases and purchase value side by side by week for this quarter and show blended ROAS.” This one needs both connectors in Windsor.ai; Meta’s official connector cannot see Google Ads.

Risks and safeguards: what goes wrong in practice

The question behind most “should I let Claude touch my ads” threads is reliability. We can answer it from the write actions teams run through Windsor.ai rather than from opinion.

  • Turning things on and off is safe. Pausing or enabling a campaign, ad set or ad succeeds on close to every attempt.
  • Budgets and campaign creation succeed most of the time. Setting a budget, creating a campaign and updating an ad set go through the large majority of the time. When they fail, a required parameter is usually missing.
  • Creating an ad set fails about half the time, and so does boosting a post. The cause is almost always Meta’s own rules: a bid strategy without a bid amount, no explicit Advantage+ audience choice, or several creations fired in a row and throttled. Give Claude the full spec, ask it to show the configuration before creating anything, and confirm. The breakdown and a safer order of operations are in what happens when an AI assistant creates Meta ad sets.

On the reading side, the errors we see most are a field name Meta does not recognise, fields that Meta does not allow in the same query, a date range beyond Meta’s 37-month history limit, an invalid date preset, and Meta’s own request limit on busy accounts. The first three have exact fixes in the Meta Ads troubleshooting guide.

Three things hold whichever route you use:

  • Nothing goes live without you. Through Meta’s connector, campaigns, ad sets and ads that Claude creates land paused until you activate them. Through Windsor.ai, Claude shows what it is about to change and waits for your confirmation on every write.
  • Access follows the login. Meta’s connector inherits everything your Facebook user can see, including client accounts in your business portfolio. In Windsor.ai you pick the ad accounts to connect, and Claude sees only those.
  • Meta looks at behaviour. Meta caps budget changes at 4 per ad set per hour and 10 spend-cap changes per account per day. Rapid automated changes, and anything that drives the Ads Manager interface instead of the API, are what draw account restrictions. Both routes on this page use the official Marketing API. The 5-rule safety protocol covers the rest.

Meta Ads data available in Claude via Windsor MCP

Windsor MCP gives Claude access to a comprehensive Facebook Ads (Meta Ads) schema covering 560+ metrics and 150+ dimensions across all reporting levels.

The data comes directly from the Meta Marketing API, so you can analyze performance at any level of detail.

Core reporting levels

These fields define the structure of your data and are used to group your performance metrics.

Level Supported fields
Account level account_id, account_name, currency, account_status
Campaign level campaign_name, campaign_id, campaign_objective, campaign_status
Ad set level adset_name, adset_id, optimization_goal, billing_event, targeting parameters
Ad & Creative level ad_id, ad_name, creative_id, creative_name

Performance metrics

Category Metrics
Base metrics spend, impressions, clicks, link_clicks
Efficiency ratios CTR (Click-Through Rate), CPC (Cost Per Click), CPM (Cost Per Mille)
Conversion events conversions, purchases, leads, add_to_cart, landing_page_views
Value & ROI purchase_value, ROAS (Return on Ad Spend), cost_per_conversion

Audience breakdowns

Use these fields to segment your data and understand specifically who is interacting with your ads.

Category Breakdown fields
Demographics age, gender, country
Placement & Tech device, placement

💡 Good to know: Unlike standard ETL tools that send data to a static sheet, the Windsor MCP creates a live conversational bridge. This means Claude understands the schema of your Facebook Ads, so you don’t have to explain what ‘Spend’ or ‘ROAS’ means every time you start a new chat.

About Windsor.ai: Native Meta Ads connector for Claude (no code)

Windsor.ai is the data integration layer between Meta Ads and Claude. This Facebook Ads connector for Claude automates the data prep you’d otherwise have to handle manually.

Instead of exporting, cleaning, and uploading reports yourself, the Windsor.ai connector manages the entire pipeline so Claude always has access to fresh, structured, analysis-ready data.

Here is how it works:

  • Pulls data directly from the Meta Ads API, so you’re working with live numbers, not yesterday’s snapshot.
  • Normalizes and cleans the data in the background, removing inconsistencies and formatting issues that make raw ad data hard to work with.
  • Streams the data into Claude, ready for analysis the moment you need it.

Think of it as the Facebook Ads LLM connector that bridges the gap between Meta’s API and Claude’s analytical power, making automatic Facebook Ads reporting in Claude a reality without writing code.

Key features of Windsor.ai’s Meta Ads connector for Claude

Once you sync Meta Ads with Claude through Windsor, you get:

  • 710+ supported data fields covering every angle of campaign performance
  • Data across account, campaign, ad set, ad, and creative levels
  • Multi-account support, so agencies can connect multiple client ad accounts in one setup
  • Write actions on Meta Ads allow you to create campaigns and ad sets, turn them off/on, and set a budget from Claude

And it doesn’t stop at Facebook Ads. Windsor connects 350+ data sources, GA4, Google Ads, Shopify, Instagram, HubSpot, all flowing into Claude through the same MCP connector. That means you can run cross-channel analysis without leaving Claude or stitching data together manually.

Alternative methods: Official Meta Ads MCP vs manual CSV export vs third-party MCP tools

You can also bring Meta Ads data into Claude through Meta’s official Meta Ads AI connector, through other third-party MCP connectors, or by exporting data manually as a CSV.

Each of these approaches does its job (connects your Meta Ads data to Claude), but all come with meaningful trade-offs compared to a purpose-built, native integration via Windsor.ai.

Connecting Meta Ads to Claude via the official Meta Ads AI connector

Meta launched Meta Ads AI Connectors on 29 April 2026, in open beta. The Claude side is a remote MCP server with 29 tools. They pull performance at account, campaign, ad set or ad level with breakdowns, summarise your account for context, flag trends and anomalies, compare your ad sets with industry and auction benchmarks, sweep for delivery-blocking errors, check pixel and dataset health, browse and diagnose product catalogs, and create or update campaigns, ad sets and ads. Here is how you add it:

  1. In Claude, open Customize (or Settings), then Connectors, click + and choose Add custom connector.
  2. Name it, for example “Meta Ads”, and paste https://mcp.facebook.com/ads as the server URL.
  3. Sign in with your Facebook login and choose the ad accounts to allow.
  4. Start a new chat, switch the connector on, and ask about your campaigns. Anything Claude creates through it lands paused, and you activate it yourself.

Where the official Meta Ads connector stops

For Meta-only work it is a solid option, and it costs nothing on Meta’s side. What it does not do:

  • Meta Ads only. It connects one platform. Google Ads, GA4, TikTok, Shopify or your CRM need their own connectors, and Claude cannot blend them with Meta data in one answer.
  • Uses your custom connector slot. Custom connectors work on every Claude plan, but the free plan allows one. If Meta Ads takes it, nothing else can be added that way.
  • Manual setup and upkeep. You paste the URL, manage the Facebook permissions per ad account, and re-do it per client if you run an agency.
  • Claude only. The data goes to the chat and nowhere else. There is no path to a warehouse, a BI tool or a scheduled report.

⚙️ Windsor.ai is a connector in Claude’s official directory. One click to install, no server URL, and it does not use your custom connector slot. It connects through the Meta Marketing API and brings 350+ sources into the same conversation, with the same data also available in Data Studio, Power BI, BigQuery, Snowflake and 25+ other destinations.

Connecting Meta Ads to Claude manually via CSV export

This is often where marketers start when they want to analyze Facebook Ads metrics in Claude before they have an automated integration in place.

The typical integration steps include:

1) Log in to Meta Ads Manager.

2) Set your date range and select the metrics you want.

3) Export the data as a CSV file.

4) Upload the CSV directly into a Claude conversation.

5) Ask Claude to analyze the file.

Why manual Meta Ads to Claude integration falls short

Every marketer who has tried manual Facebook Ads Claude integration knows how quickly it breaks:

  • Stale data: The moment you upload a CSV, the data starts aging. It no longer reflects what your campaigns are doing.
  • Repetitive work: You repeat the entire export and upload process every time you need fresh insights.
  • No scalability: Analyzing multiple accounts or clients means multiplying the workload.
  • Cross-channel analysis is painful: You have to export and upload multiple CSVs separately to analyze performance across platforms.
  • Slower decisions: You’re always one step behind the data that matters, which costs time and budget.

According to Meta’s own support documentation, CSV exports from Ads Manager come with additional problems: they fail with large date ranges (max 37 months), hang at 0% for high-volume reports, and strip out certain columns like tags, specific images, and audience breakdowns. Meta also limits exports to the first 10 languages for Advantage+ Creative ads.

Windsor MCP closes these gaps with a direct, API-level integration, so Claude always works with current Meta Ads data without manual intervention or maintenance.

⚙️ Windsor MCP closes these gaps with a direct, API-level integration, so Claude always works based on your current Meta Ads data without any manual intervention or maintenance from your side.

Connecting Meta Ads to Claude via other third-party MCP tools

Several reporting connectors expose Meta Ads to Claude through their own MCP server URL, added the same way as Meta’s, as a custom connector.

Where they usually stop:

  • Not in Claude’s directory, so setup is a pasted URL and they take the free plan’s single custom connector slot.
  • Typically 20 to 50 data sources, against 350+ with Windsor.ai.
  • Priced per connected account, usually from about $15 a month for one account.
  • A handful of BI destinations, against 25+ with Windsor.ai.
  • Read-only: Claude can report on campaigns but cannot pause them or change a budget.

Summary: Windsor.ai vs. other methods for integrating Meta Ads with Claude

Feature Windsor.ai Official Meta Ads AI connector Other third-party MCP tools Manual CSV
Setup ✅ In Claude’s directory, one click ⚠️ Custom connector, paste the URL ⚠️ Custom connector, paste the URL ⚠️ Export and upload each time
Uses the free plan’s custom connector slot ✅ No ⚠️ Yes ⚠️ Yes ✅ No
Data sources ✅ 350+ ❌ Meta Ads only ⚠️ Typically 20 to 50 ❌ One platform per file
Real-time data ✅ Yes, live API ✅ Yes, live API ✅ Yes, live API ❌ No, snapshot only
Cross-channel analysis ✅ Yes, all 350+ sources in one conversation ❌ No, only Meta Ads ⚠️ Within the tool’s own sources ❌ Manual blending, separate files
Read & write access ✅ Yes (create campaigns and ad sets, pause/enable, adjust budgets), each action confirmed by you ✅ Yes (created items land paused) ⚠️ Usually read-only ⚠️ Read-only
BI & warehouse destinations ✅ 25+ (AI tools, Data Studio, Power BI, BigQuery, Snowflake, etc.) ❌ None ⚠️ A handful ❌ None
Starting price ✅ Free forever plan; paid from $19/month ✅ Free (Meta side) ⚠️ From about $15/month per account ✅ Free
Best for Marketing and data teams that want Meta Ads next to every other channel Advertisers who only need Meta Ads in Claude Small teams with basic reporting needs One-off or exploratory analysis

⚙️ Windsor.ai is a connector in Claude’s official directory: one click to install, no server URL, no custom connector slot used. It connects 350+ marketing and business data sources to Claude with read and write access, every write confirmed by you first, and supports cross-channel analysis in a single conversation.

Conclusion

Manual exports create static snapshots that age out before your next meeting. Windsor MCP creates a live connection from Meta Ads to Claude that’s up and running in under a minute.

Once connected, the possibilities grow:

  • Automate reporting without touching Ads Manager
  • Analyze performance using plain language prompts
  • Extract cross-channel insights across all your data sources
  • Report on every client account you manage from a single interface
  • Take action without leaving Claude, from creating new campaigns to setting budgets

If you’re tired of exporting CSVs and ready to work with live data, this is how you connect Meta Ads to Claude the right way.

🚀 See what your Meta Ads data can tell you in Claude. Try it free: https://onboard.windsor.ai/app/facebook.


Available actions


Create Ad Set Create a new ad set in an existing Meta Ads campaign (Facebook or Instagram). Created paused by default so it does not spend until enabled. Budget amounts are in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Provide at most one of daily_budget or lifetime_budget; omit both only when the campaign uses campaign budget optimization. lifetime_budget requires end_time. Some optimization goals require promoted_object, a Meta spec naming what is optimized (e.g. {"pixel_id": "<id>", "custom_event_type": "PURCHASE"} for conversions, or {"page_id": "<id>"} for page likes). destination_type sets where the ad sends people; for boosting an existing post (boost_post) use ON_POST with optimization_goal POST_ENGAGEMENT to keep engagement on the post (no call to action needed). A website or undefined destination instead makes Meta require a website URL and call to action in the creative. bid_strategy defaults to the campaign setting; use LOWEST_COST_WITHOUT_CAP for an uncapped ad set, and pass bid_amount with a capped strategy (LOWEST_COST_WITH_BID_CAP or COST_CAP). Ads delivered to the EU require dsa_beneficiary and dsa_payor, naming who benefits from and who pays for the ad. Ads delivered to Taiwan, Singapore, Thailand, Brazil, Australia or India require regional_regulated_categories (e.g. SINGAPORE_UNIVERSAL) together with regional_regulation_identities holding the matching beneficiary and payer ids (e.g. {"singapore_universal_beneficiary": "<id>", "singapore_universal_payer": "<id>"}; Thailand and Brazil use "universal_beneficiary" and "universal_payer"). These are verified identity ids from Meta Business settings > Verified identities; ad account defaults are not inherited by ad sets created through the API. extra_params passes further Meta ad set fields straight to the Graph API for anything this action does not model yet, e.g. {"attribution_spec": [{"event_type": "CLICK_THROUGH", "window_days": 7}]}. Prefer the named parameters where they exist: a key that repeats one already set is rejected, since only one of the two values could win.

Create a new ad set in an existing Meta Ads campaign (Facebook or Instagram). Created paused by default so it does not spend until enabled. Budget amounts are in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Provide at most one of daily_budget or lifetime_budget; omit both only when the campaign uses campaign budget optimization. lifetime_budget requires end_time. Some optimization goals require promoted_object, a Meta spec naming what is optimized (e.g. {"pixel_id": "<id>", "custom_event_type": "PURCHASE"} for conversions, or {"page_id": "<id>"} for page likes). destination_type sets where the ad sends people; for boosting an existing post (boost_post) use ON_POST with optimization_goal POST_ENGAGEMENT to keep engagement on the post (no call to action needed). A website or undefined destination instead makes Meta require a website URL and call to action in the creative. bid_strategy defaults to the campaign setting; use LOWEST_COST_WITHOUT_CAP for an uncapped ad set, and pass bid_amount with a capped strategy (LOWEST_COST_WITH_BID_CAP or COST_CAP). Ads delivered to the EU require dsa_beneficiary and dsa_payor, naming who benefits from and who pays for the ad. Ads delivered to Taiwan, Singapore, Thailand, Brazil, Australia or India require regional_regulated_categories (e.g. SINGAPORE_UNIVERSAL) together with regional_regulation_identities holding the matching beneficiary and payer ids (e.g. {"singapore_universal_beneficiary": "<id>", "singapore_universal_payer": "<id>"}; Thailand and Brazil use "universal_beneficiary" and "universal_payer"). These are verified identity ids from Meta Business settings > Verified identities; ad account defaults are not inherited by ad sets created through the API. extra_params passes further Meta ad set fields straight to the Graph API for anything this action does not model yet, e.g. {"attribution_spec": [{"event_type": "CLICK_THROUGH", "window_days": 7}]}. Prefer the named parameters where they exist: a key that repeats one already set is rejected, since only one of the two values could win.

Parameters
campaign_idstringRequirednamestringRequiredoptimization_goalstringRequiredbilling_eventstringRequiredtargetingobjectRequireddaily_budgetstringlifetime_budgetstringbid_amountstringbid_strategystringdsa_beneficiarystringdsa_payorstringregional_regulated_categoriesstringregional_regulation_identitiesstringend_timestringpromoted_objectstringdestination_typestringstatusstringextra_paramsstring
Create Campaign Create a new Meta Ads campaign (Facebook or Instagram). Created paused by default so it does not spend until enabled. objective is a Meta campaign objective (e.g. OUTCOME_TRAFFIC, OUTCOME_LEADS, OUTCOME_SALES). special_ad_categories must list any regulated categories the ads fall under (e.g. HOUSING, EMPLOYMENT, CREDIT) or be empty. Setting a campaign budget enables campaign budget optimization; amounts are in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Provide at most one of daily_budget or lifetime_budget. When no campaign budget is set, some accounts require is_adset_budget_sharing_enabled to be specified.

Create a new Meta Ads campaign (Facebook or Instagram). Created paused by default so it does not spend until enabled. objective is a Meta campaign objective (e.g. OUTCOME_TRAFFIC, OUTCOME_LEADS, OUTCOME_SALES). special_ad_categories must list any regulated categories the ads fall under (e.g. HOUSING, EMPLOYMENT, CREDIT) or be empty. Setting a campaign budget enables campaign budget optimization; amounts are in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Provide at most one of daily_budget or lifetime_budget. When no campaign budget is set, some accounts require is_adset_budget_sharing_enabled to be specified.

Parameters
namestringRequiredobjectivestringRequiredspecial_ad_categoriesarraydaily_budgetstringlifetime_budgetstringbid_strategystringis_adset_budget_sharing_enabledstringstatusstring
Create Ad Create a new ad in an existing Meta Ads ad set (Facebook or Instagram). Created paused by default so it does not spend until enabled. The simplest way is to provide page_id and link plus optional text (message, headline, description), image_url or image_hash (from create_ad_image) and call_to_action_type; these build a single-image link ad creative automatically. For a Click-to-Message ad, set messaging_destination (MESSENGER or INSTAGRAM_DIRECT) instead of link; the message opens a conversation with the page. For a video ad, upload the video first with create_ad_video and pass its video_id here with page_id and a required thumbnail image_url or image_hash; message becomes the primary text, headline the title, description the caption, and call_to_action_type (with link) adds a button. For advanced cases, pass a full Meta creative spec via creative instead (e.g. {"creative_id": "<id>"} to reuse an existing creative, or {"object_story_spec": {...}}). Provide either the individual creative fields or creative, not both.

Create a new ad in an existing Meta Ads ad set (Facebook or Instagram). Created paused by default so it does not spend until enabled. The simplest way is to provide page_id and link plus optional text (message, headline, description), image_url or image_hash (from create_ad_image) and call_to_action_type; these build a single-image link ad creative automatically. For a Click-to-Message ad, set messaging_destination (MESSENGER or INSTAGRAM_DIRECT) instead of link; the message opens a conversation with the page. For a video ad, upload the video first with create_ad_video and pass its video_id here with page_id and a required thumbnail image_url or image_hash; message becomes the primary text, headline the title, description the caption, and call_to_action_type (with link) adds a button. For advanced cases, pass a full Meta creative spec via creative instead (e.g. {"creative_id": "<id>"} to reuse an existing creative, or {"object_story_spec": {...}}). Provide either the individual creative fields or creative, not both.

Parameters
adset_idstringRequirednamestringRequiredpage_idstringlinkstringmessagestringheadlinestringdescriptionstringimage_urlstringimage_hashstringcall_to_action_typeenumvideo_idstringmessaging_destinationstringcreativestringstatusstring
Update Campaign Update editable attributes of a Meta Ads campaign (Facebook or Instagram). Provide only the fields to change; at least one is required. spend_cap is a lifetime spend limit in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. special_ad_categories lists the regulated categories the ads fall under (e.g. HOUSING, EMPLOYMENT, CREDIT) or is empty. Use pause_campaign/enable_campaign to change status and set_campaign_budget to change the budget. objective is fixed at creation and cannot be updated.

Update editable attributes of a Meta Ads campaign (Facebook or Instagram). Provide only the fields to change; at least one is required. spend_cap is a lifetime spend limit in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. special_ad_categories lists the regulated categories the ads fall under (e.g. HOUSING, EMPLOYMENT, CREDIT) or is empty. Use pause_campaign/enable_campaign to change status and set_campaign_budget to change the budget. objective is fixed at creation and cannot be updated.

Parameters
campaign_idstringRequirednamestringbid_strategystringspecial_ad_categoriesstringspend_capstring
Update Ad Set Update editable attributes of a Meta Ads ad set (Facebook or Instagram). Provide only the fields to change; at least one is required. bid_amount is in the account currency minor unit (e.g. cents: 500 means 5.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Switching bid_strategy to a capped strategy (LOWEST_COST_WITH_BID_CAP or COST_CAP) requires bid_amount in the same call. end_time is an ISO 8601 timestamp less than one year ahead (e.g. 2027-01-01T00:00:00-0800). Use pause_adset/enable_adset to change status and set_adset_budget to change the budget. Ads delivered to the EU require dsa_beneficiary and dsa_payor, naming who benefits from and who pays for the ad. Ads delivered to Taiwan, Singapore, Thailand, Brazil, Australia or India require regional_regulated_categories (e.g. SINGAPORE_UNIVERSAL) together with regional_regulation_identities holding the matching beneficiary and payer ids (e.g. {"singapore_universal_beneficiary": "<id>", "singapore_universal_payer": "<id>"}; Thailand and Brazil use "universal_beneficiary" and "universal_payer"). These are verified identity ids from Meta Business settings > Verified identities; ad account defaults are not inherited by ad sets created through the API. extra_params passes further Meta ad set fields straight to the Graph API for anything this action does not model yet, e.g. {"attribution_spec": [{"event_type": "CLICK_THROUGH", "window_days": 7}]}. Prefer the named parameters where they exist: a key that repeats one already set is rejected, since only one of the two values could win.

Update editable attributes of a Meta Ads ad set (Facebook or Instagram). Provide only the fields to change; at least one is required. bid_amount is in the account currency minor unit (e.g. cents: 500 means 5.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Switching bid_strategy to a capped strategy (LOWEST_COST_WITH_BID_CAP or COST_CAP) requires bid_amount in the same call. end_time is an ISO 8601 timestamp less than one year ahead (e.g. 2027-01-01T00:00:00-0800). Use pause_adset/enable_adset to change status and set_adset_budget to change the budget. Ads delivered to the EU require dsa_beneficiary and dsa_payor, naming who benefits from and who pays for the ad. Ads delivered to Taiwan, Singapore, Thailand, Brazil, Australia or India require regional_regulated_categories (e.g. SINGAPORE_UNIVERSAL) together with regional_regulation_identities holding the matching beneficiary and payer ids (e.g. {"singapore_universal_beneficiary": "<id>", "singapore_universal_payer": "<id>"}; Thailand and Brazil use "universal_beneficiary" and "universal_payer"). These are verified identity ids from Meta Business settings > Verified identities; ad account defaults are not inherited by ad sets created through the API. extra_params passes further Meta ad set fields straight to the Graph API for anything this action does not model yet, e.g. {"attribution_spec": [{"event_type": "CLICK_THROUGH", "window_days": 7}]}. Prefer the named parameters where they exist: a key that repeats one already set is rejected, since only one of the two values could win.

Parameters
adset_idstringRequirednamestringtargetingstringoptimization_goalstringbid_amountstringbid_strategystringdestination_typestringdsa_beneficiarystringdsa_payorstringregional_regulated_categoriesstringregional_regulation_identitiesstringend_timestringextra_paramsstring
Pause Campaign Pause an active Meta Ads campaign (Facebook or Instagram). Reversible via enable_campaign.

Pause an active Meta Ads campaign (Facebook or Instagram). Reversible via enable_campaign.

Parameters
campaign_idstringRequired
Set Campaign Budget Set the daily or lifetime budget of a Meta Ads campaign (Facebook or Instagram). The amount is in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Only one budget type applies at a time; setting one replaces the other. Meta rejects frequent budget changes on the same campaign; space out repeated changes instead of adjusting in rapid succession.

Set the daily or lifetime budget of a Meta Ads campaign (Facebook or Instagram). The amount is in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Only one budget type applies at a time; setting one replaces the other. Meta rejects frequent budget changes on the same campaign; space out repeated changes instead of adjusting in rapid succession.

Parameters
campaign_idstringRequiredbudget_typestringRequiredamountintegerRequired
Enable Campaign Activate a paused Meta Ads campaign (Facebook or Instagram). Reversible via pause_campaign.

Activate a paused Meta Ads campaign (Facebook or Instagram). Reversible via pause_campaign.

Parameters
campaign_idstringRequired
Enable Ad Activate a paused Meta Ads ad (Facebook or Instagram). Reversible via pause_ad.

Activate a paused Meta Ads ad (Facebook or Instagram). Reversible via pause_ad.

Parameters
ad_idstringRequired
Enable Ad Set Activate a paused Meta Ads ad set (Facebook or Instagram). Reversible via pause_adset.

Activate a paused Meta Ads ad set (Facebook or Instagram). Reversible via pause_adset.

Parameters
adset_idstringRequired
Pause Ad Pause an active Meta Ads ad (Facebook or Instagram). Reversible via enable_ad.

Pause an active Meta Ads ad (Facebook or Instagram). Reversible via enable_ad.

Parameters
ad_idstringRequired
Update Ad Creative Edit the creative of an existing Meta Ads ad (Facebook or Instagram): ad copy (message), headline, description, destination link, image, call-to-action button, URL tracking tags and Advantage+ enhancement settings. Meta treats ad creatives as immutable, so this copies the ad's current creative (keeping its name, url_tags and degrees_of_freedom_spec), applies the changes, creates the result as a new creative and re-points the ad at it; the ad keeps its id, but the returned creative id is new. Provide ad_id plus at least one field to change. Editable content fields depend on the creative's media type: link ads support all of them; video ads support message, headline, description, image_url (thumbnail), link and call_to_action_type (the link lives on the button, so adding a link to a video ad without a button also requires call_to_action_type); photo ads only message (the caption) and image_url; text ads only message. For carousel ads (link ads with cards), message edits the text above the cards; headline, description, link, image_url and call_to_action_type live on the cards, so also pass card_index (0-based) to edit one specific card. url_tags (e.g. 'utm_source=x&utm_medium=y') and degrees_of_freedom_spec (a raw Meta spec) can be edited on any creative, including ads that promote an existing organic post (e.g. boosted posts) — but content fields on those ads cannot be edited; edit the post itself instead. Dynamic/catalog creatives cannot be edited at all. Omitted fields keep their current values; to clear url_tags pass an empty string, and to reset degrees_of_freedom_spec to Meta's default enhancement behavior pass an empty object. To swap the ad to a different existing creative, use update_ad instead.

Edit the creative of an existing Meta Ads ad (Facebook or Instagram): ad copy (message), headline, description, destination link, image, call-to-action button, URL tracking tags and Advantage+ enhancement settings. Meta treats ad creatives as immutable, so this copies the ad's current creative (keeping its name, url_tags and degrees_of_freedom_spec), applies the changes, creates the result as a new creative and re-points the ad at it; the ad keeps its id, but the returned creative id is new. Provide ad_id plus at least one field to change. Editable content fields depend on the creative's media type: link ads support all of them; video ads support message, headline, description, image_url (thumbnail), link and call_to_action_type (the link lives on the button, so adding a link to a video ad without a button also requires call_to_action_type); photo ads only message (the caption) and image_url; text ads only message. For carousel ads (link ads with cards), message edits the text above the cards; headline, description, link, image_url and call_to_action_type live on the cards, so also pass card_index (0-based) to edit one specific card. url_tags (e.g. 'utm_source=x&utm_medium=y') and degrees_of_freedom_spec (a raw Meta spec) can be edited on any creative, including ads that promote an existing organic post (e.g. boosted posts) — but content fields on those ads cannot be edited; edit the post itself instead. Dynamic/catalog creatives cannot be edited at all. Omitted fields keep their current values; to clear url_tags pass an empty string, and to reset degrees_of_freedom_spec to Meta's default enhancement behavior pass an empty object. To swap the ad to a different existing creative, use update_ad instead.

Parameters
ad_idstringRequiredmessagestringheadlinestringdescriptionstringlinkstringimage_urlstringcall_to_action_typeenumurl_tagsstringdegrees_of_freedom_specstringcard_indexstring
Pause Ad Set Pause an active Meta Ads ad set (Facebook or Instagram). Reversible via enable_adset.

Pause an active Meta Ads ad set (Facebook or Instagram). Reversible via enable_adset.

Parameters
adset_idstringRequired
Set Ad Set Budget Set the daily or lifetime budget of a Meta Ads ad set (Facebook or Instagram). The amount is in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Only one budget type applies at a time; setting one replaces the other. Meta allows at most 4 budget changes per ad set per hour; further changes are rejected until the hour passes.

Set the daily or lifetime budget of a Meta Ads ad set (Facebook or Instagram). The amount is in the account currency minor unit (e.g. cents: 5000 means 50.00). Currencies without cents (CLP, COP, CRC, HUF, IDR, ISK, JPY, KRW, PYG, TWD, VND) use whole units: 300000 means 300000 COP. Only one budget type applies at a time; setting one replaces the other. Meta allows at most 4 budget changes per ad set per hour; further changes are rejected until the hour passes.

Parameters
adset_idstringRequiredbudget_typestringRequiredamountintegerRequired
Update Ad Update editable attributes of a Meta Ads ad (Facebook or Instagram). Provide only the fields to change; at least one is required. creative swaps the ad to a different creative and is a Meta creative reference (e.g. {"creative_id": "<id>"}). conversion_domain is the registrable domain the ad drives conversions to (e.g. example.com), used for conversion attribution. display_sequence orders the ad within a sequenced campaign. Use pause_ad/enable_ad to change status.

Update editable attributes of a Meta Ads ad (Facebook or Instagram). Provide only the fields to change; at least one is required. creative swaps the ad to a different creative and is a Meta creative reference (e.g. {"creative_id": "<id>"}). conversion_domain is the registrable domain the ad drives conversions to (e.g. example.com), used for conversion attribution. display_sequence orders the ad within a sequenced campaign. Use pause_ad/enable_ad to change status.

Parameters
ad_idstringRequirednamestringcreativestringconversion_domainstringdisplay_sequencestring
Boost Post Boost (promote) an existing organic Facebook or Instagram post by creating a paid ad for it in an existing Meta Ads ad set. Provide the full post id (in '{page_id}_{post_id}' form, as it appears in the connector data) and the ad set to place the ad in. The ad reuses the published post as its creative via object_story_id, so no new copy or media is created. The target ad set MUST belong to an engagement campaign (objective OUTCOME_ENGAGEMENT) and name the post's page in its promoted_object; build it with create_campaign and create_adset first if needed. Two ad set shapes work: an ON_POST destination with optimization_goal POST_ENGAGEMENT (engagement on the post itself, no call-to-action needed), or a FACEBOOK_PAGE destination with optimization_goal PROFILE_AND_PAGE_ENGAGEMENT, which additionally requires a call-to-action button on the ad — pass call_to_action_type (e.g. VISIT_PROFILE) for that case, otherwise Meta rejects the ad with a 'call-to-action required' error. The page promoted by the ad set and the post's page must match, and the access token must have ads permission on that page. Created paused by default so it does not spend until enabled; use enable_ad to activate it.

Boost (promote) an existing organic Facebook or Instagram post by creating a paid ad for it in an existing Meta Ads ad set. Provide the full post id (in '{page_id}_{post_id}' form, as it appears in the connector data) and the ad set to place the ad in. The ad reuses the published post as its creative via object_story_id, so no new copy or media is created. The target ad set MUST belong to an engagement campaign (objective OUTCOME_ENGAGEMENT) and name the post's page in its promoted_object; build it with create_campaign and create_adset first if needed. Two ad set shapes work: an ON_POST destination with optimization_goal POST_ENGAGEMENT (engagement on the post itself, no call-to-action needed), or a FACEBOOK_PAGE destination with optimization_goal PROFILE_AND_PAGE_ENGAGEMENT, which additionally requires a call-to-action button on the ad — pass call_to_action_type (e.g. VISIT_PROFILE) for that case, otherwise Meta rejects the ad with a 'call-to-action required' error. The page promoted by the ad set and the post's page must match, and the access token must have ads permission on that page. Created paused by default so it does not spend until enabled; use enable_ad to activate it.

Parameters
adset_idstringRequiredpost_idstringRequirednamestringRequiredcall_to_action_typestringstatusstring
Set Page Welcome Message Set or update the automated welcome message (greeting / ice breaker) shown when a user opens the conversation from a Meta Ads Click-to-Message ad (Messenger or Instagram, OUTCOME_ENGAGEMENT / CONVERSATIONS). The welcome message lives on the ad creative, which Meta treats as immutable, so this builds a new creative that copies the ad's existing creative and only swaps the welcome message, then re-points the ad at it. Provide ad_id plus either welcome_message (plain greeting text, the common case) or welcome_message_spec (a full page_welcome_message structure for ice breakers / quick replies), not both. The change is verified by reading the new creative back; the action fails if Meta did not persist the value.

Set or update the automated welcome message (greeting / ice breaker) shown when a user opens the conversation from a Meta Ads Click-to-Message ad (Messenger or Instagram, OUTCOME_ENGAGEMENT / CONVERSATIONS). The welcome message lives on the ad creative, which Meta treats as immutable, so this builds a new creative that copies the ad's existing creative and only swaps the welcome message, then re-points the ad at it. Provide ad_id plus either welcome_message (plain greeting text, the common case) or welcome_message_spec (a full page_welcome_message structure for ice breakers / quick replies), not both. The change is verified by reading the new creative back; the action fails if Meta did not persist the value.

Parameters
ad_idstringRequiredwelcome_messagestringwelcome_message_specstring
Create Ad Video Upload a video to a Meta Ads ad account from a public URL so it can be used in a video ad. Meta fetches the file from video_url and transcodes it; the action waits until the video is ready and returns its video_id. Pass that video_id to create_ad together with page_id and a thumbnail image_url to build the video ad. The upload cannot be undone via an action.

Upload a video to a Meta Ads ad account from a public URL so it can be used in a video ad. Meta fetches the file from video_url and transcodes it; the action waits until the video is ready and returns its video_id. Pass that video_id to create_ad together with page_id and a thumbnail image_url to build the video ad. The upload cannot be undone via an action.

Parameters
video_urlstringRequirednamestringRequired
Duplicate Ad Set Duplicate an existing Meta Ads ad set (Facebook or Instagram). The copy keeps the source targeting, budget and schedule. Copied paused by default so it does not spend until enabled. Set status_option to active to launch it, or inherited to keep the source status. Set campaign_id to move the copy to another campaign, or omit it to keep the copy in the source campaign. Set deep_copy to also duplicate the ads in the ad set; a synchronous copy is limited to 3 ads. There is no delete action, so pausing the copy does not remove it.

Duplicate an existing Meta Ads ad set (Facebook or Instagram). The copy keeps the source targeting, budget and schedule. Copied paused by default so it does not spend until enabled. Set status_option to active to launch it, or inherited to keep the source status. Set campaign_id to move the copy to another campaign, or omit it to keep the copy in the source campaign. Set deep_copy to also duplicate the ads in the ad set; a synchronous copy is limited to 3 ads. There is no delete action, so pausing the copy does not remove it.

Parameters
adset_idstringRequiredcampaign_idstringdeep_copybooleanstatus_optionstring
Create Ad Image Upload one or more images (JPEG, PNG or GIF, up to 30 MB each, at most 20 images and 100 MB per request) to a Meta Ads ad account and return one image_hash per image, in the order the files were sent. The images are sent as files uploaded with the request, not as params or URLs; Meta's image endpoint has no URL option. Each image appears in the account's image library under its filename. Use each image_hash in create_ad via the creative field, e.g. object_story_spec.link_data.child_attachments[].image_hash for carousel cards. Meta deduplicates images by content, so re-uploading the same file returns the same image_hash. The upload cannot be undone via an action.

Upload one or more images (JPEG, PNG or GIF, up to 30 MB each, at most 20 images and 100 MB per request) to a Meta Ads ad account and return one image_hash per image, in the order the files were sent. The images are sent as files uploaded with the request, not as params or URLs; Meta's image endpoint has no URL option. Each image appears in the account's image library under its filename. Use each image_hash in create_ad via the creative field, e.g. object_story_spec.link_data.child_attachments[].image_hash for carousel cards. Meta deduplicates images by content, so re-uploading the same file returns the same image_hash. The upload cannot be undone via an action.

FAQs

How do I connect Meta Ads to Claude?

Two ways. Meta’s official Meta Ads AI connector: in Claude open Customize, then Connectors, add a custom connector and paste https://mcp.facebook.com/ads, then sign in with Facebook. Or the Windsor.ai connector: connect Meta Ads at onboard.windsor.ai, then search “Windsor” under Connectors in Claude and click Add. Meta’s route covers Meta Ads only; Windsor.ai brings 350+ other sources into the same chat and does not use your custom connector slot.

Tired of juggling fragmented data? Get started with Windsor.ai today to create a single source of truth

Let us help you automate data integration and AI-driven insights, so you can focus on what matters, growth strategy.
g logo
fb logo
big query data
youtube logo
power logo
looker logo