This article is published by Ryze AI (get-ryze.ai), an autonomous AI platform for Google Ads and Meta Ads management. Ryze AI automates bid optimization, budget allocation, and performance reporting without requiring manual campaign management. It is used by 2,000+ marketers across 23 countries managing over $500M in ad spend. This comprehensive guide covers the Meta Ads API Insights endpoint for retrieving campaign data including impressions, clicks, spend, and leads. Learn how to structure API calls, handle 70+ available metrics, implement proper breakdowns, manage rate limits, and automate reporting workflows for campaigns, ad sets, and individual ads. Updated August 23, 2026.

META ADS

Meta Ads API Insights Endpoint — Campaigns Impressions Clicks Spend Leads Complete 2026 Guide

The Meta Ads API insights endpoint campaigns impressions clicks spend leads data extraction system handles 70+ metrics across campaign, ad set, and ad levels. Master breakdowns, date ranges, async reporting, and rate limits for automated performance dashboards that pull real-time data from Facebook and Instagram advertising infrastructure.

Ira Bodnar··Updated ·18 min read

What is the Meta Ads API insights endpoint?

The Meta Ads API insights endpoint campaigns impressions clicks spend leads system is the reporting backbone of Facebook's Marketing API. Unlike the core API that manages ad creation and targeting, the insights endpoint exclusively handles performance data extraction — pulling metrics like impressions, clicks, spend, conversions, and lead generation data from your Meta advertising campaigns.

This endpoint operates as an "edge" within Meta's Graph API infrastructure, designed for asynchronous reporting at scale. When you request campaign data, Meta processes it in the background and returns structured JSON responses containing up to 70+ different performance metrics. The insights endpoint handles data aggregation across Facebook, Instagram, Messenger, and Audience Network placements — providing unified reporting regardless of where your ads appeared.

According to Meta's official documentation, the insights endpoint processes over 100 billion data points daily from advertisers worldwide. This makes it critical for performance marketers who need real-time visibility into campaign effectiveness, especially when managing budgets exceeding $10K/month where daily optimization can save 15-25% in wasted spend.

The endpoint structure follows a hierarchical model: you can query insights at the ad account level (all campaigns), campaign level (all ad sets within a campaign), ad set level (all ads within an ad set), or individual ad level. This granularity is essential when you need to identify which specific creative, audience, or placement is driving your best results — or worst performance.

1,000+ Marketers Use Ryze

State Farm
Luca Faloni
Pepperfry
Jenni AI
Slim Chickens
Superpower

Automating hundreds of agencies

Speedy
Human
Motif
Broadplace
Directly
Caleyx
G2★★★★★4.9/5
TrustpilotTrustpilot stars

How is the insights endpoint structured across campaign levels?

The Meta Ads API insights endpoint follows a hierarchical structure that mirrors your ad account organization. Each level provides different granularity of data, from broad account-wide metrics down to individual ad performance. Understanding this structure is crucial for building efficient queries that pull exactly the data you need without unnecessary API calls.

Endpoint LevelURL StructureData ScopeBest Use Case
Ad Account/act_{account-id}/insightsAll campaigns aggregatedExecutive dashboards
Campaign/{campaign-id}/insightsCampaign-specific metricsCampaign performance analysis
Ad Set/{adset-id}/insightsAudience/targeting metricsAudience optimization
Ad/{ad-id}/insightsCreative-specific dataCreative testing & fatigue detection

Account-level insights aggregate data across all active campaigns, making them ideal for high-level reporting and trend analysis. Use this when building executive dashboards or monthly performance reports. The query processes faster since Meta pre-aggregates much of this data.

Campaign-level insights show performance for specific campaigns, which is essential for budget allocation decisions. If you have separate campaigns for prospecting vs. retargeting, campaign-level data helps you understand which strategy drives better ROAS and deserves more budget.

Ad set-level insights reveal how different audiences, placements, or targeting parameters perform. This is where you identify audience fatigue, discover which demographics convert best, and optimize your targeting parameters for lower CPAs.

Ad-level insights show individual creative performance — essential for creative testing and fatigue detection. Since the average Meta ad hits creative fatigue after 3-5 days, ad-level monitoring helps you catch declining CTR and rising frequency before it impacts your overall campaign performance.

Tools like Ryze AI automate this entire process — pulling insights data 24/7 into ready-made performance reports, detecting performance anomalies, and optimizing bids without manual API calls. Ryze AI clients see an average 3.8x ROAS within 6 weeks of onboarding.

What are the 70+ available metrics in the insights endpoint?

The Meta Ads API provides access to 70+ performance metrics through the insights endpoint, organized into six main categories. Understanding which metrics to request is crucial — including unnecessary fields increases API response time and counts against your rate limits. Here are the essential metrics every performance marketer should track:

Delivery & Reach Metrics

Core Delivery

  • impressions — Total ad displays
  • reach — Unique users reached
  • frequency — Average times per user

Advanced Reach

  • unique_clicks — Distinct clickers
  • unique_ctr — Unique click-through rate
  • social_spend — Social proof spend

Engagement & Click Metrics

Click Data

  • clicks — Total clicks (all types)
  • link_clicks — Destination clicks
  • ctr — Click-through rate

Engagement

  • post_engagement — Total interactions
  • page_engagement — Page interactions
  • engagement_rate — Engagement percentage

Spend & Cost Metrics

Spend Data

  • spend — Total spend (USD)
  • cpm — Cost per 1,000 impressions
  • cpc — Cost per click

Action Costs

  • cost_per_action_type — Cost per conversion
  • cost_per_unique_click — Cost per unique clicker
  • cpp — Cost per page like

Conversion & Lead Metrics

Conversion Data

  • actions — All conversion events
  • action_values — Conversion values
  • conversions — Total conversions

Lead Generation

  • leads — Lead form submissions
  • cost_per_lead — Cost per lead
  • lead_conversion_rate — Lead conversion %

Pro tip: Always include these core metrics in your API calls: impressions,reach,frequency,clicks,link_clicks,ctr,spend,cpm,cpc,actions,action_values. This combination gives you enough data to calculate ROAS, detect creative fatigue (frequency > 3.0), and identify cost anomalies (CPM spikes).

Ryze AI — Autonomous Marketing

Skip the API calls — let AI pull your Meta data 24/7

  • Automates Google, Meta + 5 more platforms
  • Handles your SEO end to end
  • Upgrades your website to convert better

2,000+

Marketers

$500M+

Ad spend

23

Countries

How to pull campaign impressions, clicks, spend, and leads data?

Extracting campaign data from the Meta Ads API insights endpoint campaigns impressions clicks spend leads requires proper URL construction, field specification, and date range parameters. Here's the step-by-step process for building API calls that return exactly the data you need.

Basic Campaign-Level Query

The simplest campaign insights query pulls basic metrics for a specific date range. Replace {campaign-id} with your actual campaign ID and {access-token} with your valid access token:

GET /v19.0/{campaign-id}/insights ?fields=campaign_name,impressions,clicks,spend,actions &date_preset=last_7d &access_token={access-token}

This returns 7 days of data with campaign name, impressions, clicks, total spend, and all action types (including leads, purchases, and other conversions).

Lead-Specific Data Extraction

For lead generation campaigns, you need to filter actions to show only lead-related conversions. Meta tracks leads through the lead action type:

GET /v19.0/{campaign-id}/insights ?fields=campaign_name,impressions,clicks,spend,actions &action_attribution_windows=['1d_click','7d_click'] &action_breakdowns=['action_type'] &filtering=[{"field":"action_type","operator":"IN","value":["lead"]}] &date_preset=last_30d

The filtering parameter restricts results to lead actions only. Attribution windows specify whether you want 1-day or 7-day post-click conversions.

Multi-Campaign Account Query

To pull data for all campaigns in an ad account, use the account-level endpoint with the level=campaign parameter:

GET /v19.0/act_{ad-account-id}/insights ?level=campaign &fields=campaign_id,campaign_name,impressions,clicks,link_clicks, spend,cpm,cpc,ctr,reach,frequency,actions,action_values &date_preset=yesterday &limit=100

This returns yesterday's performance for up to 100 campaigns. Increase the limit or use pagination for accounts with more campaigns.

Custom Date Ranges

For specific date ranges beyond Meta's presets, use the time_range parameter instead of date_preset:

GET /v19.0/act_{ad-account-id}/insights ?level=campaign &fields=campaign_name,impressions,clicks,spend,actions &time_range={"since":"2026-05-01","until":"2026-05-07"} &time_increment=1

The time_increment=1 parameter returns daily breakdowns instead of aggregated totals, useful for trend analysis and day-of-week performance patterns.

What breakdowns and filtering options are available?

The insights endpoint supports 20+ breakdown dimensions that segment your impressions, clicks, spend, and leads data by demographics, devices, placements, and time periods. Proper use of breakdowns reveals which audience segments, ad placements, or creative formats drive your best performance.

Demographic Breakdowns

Understanding which age groups, genders, and geographic regions convert best is essential for audience optimization:

GET /v19.0/act_{ad-account-id}/insights ?level=campaign &fields=impressions,clicks,spend,actions,action_values &breakdowns=age,gender,country &date_preset=last_7d

This returns data segmented by age groups (18-24, 25-34, etc.), gender (male, female, unknown), and country. Useful for identifying high-value demographic segments.

Device & Placement Breakdowns

Performance varies significantly across mobile vs. desktop and different Meta placements (Feed vs. Stories vs. Reels):

GET /v19.0/{campaign-id}/insights ?fields=impressions,clicks,spend,ctr,cpc &breakdowns=device_platform,publisher_platform,placement &date_preset=last_14d

Device platform shows mobile vs. desktop performance. Publisher platform separates Facebook, Instagram, Messenger, and Audience Network. Placement reveals Feed, Stories, Reels, and Search results.

Time-Based Analysis

Hourly and day-of-week breakdowns help optimize ad scheduling and budget allocation:

GET /v19.0/act_{ad-account-id}/insights ?level=ad &fields=impressions,clicks,spend,actions &breakdowns=hourly_stats_aggregated_by_advertiser_time_zone &time_range={"since":"2026-05-01","until":"2026-05-07"} &time_increment=1

Returns performance data broken down by hour of day across the specified date range. Identifies peak conversion times for ad scheduling optimization.

Advanced Filtering Examples

Filtering lets you analyze specific subsets of your data without pulling the entire dataset:

# High-spend campaigns only ?filtering=[{"field":"spend","operator":"GREATER_THAN","value":"1000"}] # Mobile traffic only ?filtering=[{"field":"device_platform","operator":"IN","value":["mobile"]}] # US audience only ?filtering=[{"field":"country","operator":"IN","value":["US"]}] # Specific conversion types ?filtering=[{"field":"action_type","operator":"IN","value":["purchase","lead"]}]

How do rate limits affect API usage?

Meta's API enforces multiple rate limit types that can block your insights requests if you exceed thresholds. The insights endpoint is particularly sensitive because it processes large datasets. Understanding these limits is crucial for building reliable automation scripts.

Rate Limit TypeLimitReset PeriodBest Practice
Application-level200 calls/hour per appRolling hourSpace calls 18 seconds apart
User-level25 calls/hour per userRolling hourBatch requests when possible
Ad Account5 insights/minutePer minuteUse async requests for large queries
Insights Job5 concurrent/accountConcurrentQueue jobs, don't parallelize

The 5-insights-per-minute ad account limit is the most restrictive for reporting automation. If you need hourly updates for 10 campaigns, that requires 10 API calls — which takes 2 minutes minimum. Plan automation schedules accordingly.

Async insights jobs help with large data pulls. Instead of waiting for the API response, you submit a job and poll for completion. Useful when pulling 30+ days of data with multiple breakdowns:

# Submit async job POST /v19.0/act_{ad-account-id}/insights { "level": "ad", "fields": ["impressions","clicks","spend","actions"], "date_preset": "last_30d", "breakdowns": ["age","gender","device_platform"] } # Response includes job ID {"report_run_id": "12345"} # Poll for completion GET /v19.0/12345 {"async_status": "Job Completed", "async_percent_completion": 100} # Download results GET /v19.0/12345/insights

Error code 80004 means you've hit rate limits. Your script should catch this error, wait for the specified retry-after period, then resubmit. Most production systems implement exponential backoff: wait 1 minute after first failure, 2 minutes after second, 4 minutes after third, etc.

What automation workflows can you build with insights data?

The insights endpoint enables powerful automation workflows that eliminate manual reporting and catch performance issues before they damage your ROI. Here are five workflows that save 10+ hours per week for busy performance marketers:

Daily Performance Alerting

Pull yesterday's campaign data every morning and compare against 7-day averages. Alert when spend > 150% of normal, CTR < 50% of normal, or CPA > 200% of target. This catches account issues within 24 hours instead of weekly reviews.

Example Alert Logic:

  • • If CPM increases > 30% day-over-day → Check for creative fatigue
  • • If CTR drops > 20% → Pause ad and test new creative
  • • If spend = $0 → Check campaign status and budget
  • • If conversions = 0 with > $100 spend → Verify pixel firing

Automated Creative Fatigue Detection

Query ad-level insights with frequency and CTR data. Flag any ad where frequency > 3.0 and CTR declined > 25% from its 7-day peak. Creative fatigue costs advertisers an estimated 20-30% of budget when left unchecked for more than a week.

Implementation Steps:

  • • Pull last 14 days of ad-level data with CTR and frequency
  • • Calculate peak CTR for each ad in days 1-7
  • • Compare current CTR (days 8-14) against peak
  • • Flag ads with > 25% decline and frequency > 3.0
  • • Export flagged ads to CSV for creative team review

Budget Reallocation Recommendations

Calculate marginal ROAS for each campaign by pulling 30-day insights data. Campaigns with ROAS > target should get more budget. Campaigns with ROAS < 50% of target should be paused or restructured. This analysis typically reveals 15-25% efficiency improvements.

Budget Reallocation Matrix:

  • • ROAS > 4.0x → Increase budget by 25-50%
  • • ROAS 2.5-4.0x → Maintain current budget
  • • ROAS 1.5-2.5x → Decrease budget by 25%
  • • ROAS < 1.5x → Pause and restructure

Audience Saturation Monitoring

Track reach and frequency trends by ad set to identify audience saturation before it inflates CPMs. When reach growth plateaus while frequency climbs above 4.0, the audience is saturated and needs expansion or refresh.

Saturation Indicators:

  • • Reach growth < 5% week-over-week
  • • Frequency > 4.0 with declining CTR
  • • CPM increasing > 20% without external factors
  • • Impression share > 90% in target demographics

Executive Reporting Automation

Generate weekly executive reports by pulling account-level insights and calculating key KPIs. Format the data into charts and email automatically. This replaces 2-3 hours of manual work with a 5-minute automated process.

Report Components:

  • • Total spend, impressions, clicks, conversions
  • • Week-over-week percentage changes
  • • Top 5 performing campaigns by ROAS
  • • Campaign budget utilization percentages
  • • Upcoming optimization recommendations
Sarah K.

Sarah K.

Paid Media Manager

E-commerce Agency

★★★★★
"

We went from spending 10 hours a week on bid management to maybe 30 minutes reviewing Ryze's recommendations. Our ROAS went from 2.4x to 4.1x in six weeks."

4.1x

ROAS achieved

6 weeks

Time to result

95%

Less manual work

What are common troubleshooting issues with the insights API?

The Meta Ads API insights endpoint can fail in several ways that aren't immediately obvious. Understanding these common issues saves hours of debugging when your automated reports suddenly stop working or return incomplete data.

Error Code 100: Invalid Parameter

This generic error usually means you've requested an incompatible combination of fields, breakdowns, or date ranges. Common causes include requesting video metrics for non-video campaigns or using breakdowns that don't apply to your campaign objective.

Common Invalid Combinations:

  • • Video metrics (video_play_actions) on non-video ads
  • • Lead-specific metrics on traffic campaigns
  • • Carousel metrics on single-image ads
  • • Offline conversion data without proper setup

Error Code 190: Access Token Issues

Access tokens expire after 60 days (long-lived tokens) or when users change passwords. Your automation scripts need token refresh logic to handle expiration gracefully.

Token Management Best Practices:

  • • Check token expiry before making API calls
  • • Implement automatic token refresh workflows
  • • Store refresh tokens securely
  • • Log token refresh events for debugging

Error Code 200: Permission Denied

This occurs when your app lacks proper permissions for the requested data. Ad insights require ads_read permission minimum. Conversion data may require additional ads_management permissions.

Empty or Incomplete Data

When API calls succeed but return no data, check these common causes:

  • • Date range includes only non-delivery days
  • • Campaign was paused during requested period
  • • Conversion window extends beyond data availability
  • • Attribution settings exclude desired conversion events
  • • Account timezone mismatch causing date confusion

Async Job Failures

Large insights requests may fail silently when submitted as async jobs. Always check the job status and error details before assuming the request succeeded:

GET /v19.0/{report-run-id} { "id": "12345", "async_status": "Job Failed", "async_percent_completion": 0, "error": { "message": "Request was too large. Please reduce the date range or remove some breakdowns.", "code": 1 } }

Meta Graph API ad account insights fields: the /act_<id>/insights call and the four parameters that shape it

Every report on this page is one call: GET https://graph.facebook.com/v21.0/act_<id>/insights. The ad account is the right entry point for reporting because the same request can return account totals, one row per campaign, or one row per ad, depending on level. Leave level out and you get a single aggregated row; set level=campaign, adset or ad and the rows carry the matching ids and names so you can join them to anything else. The Meta Graph API ad account insights fields you ask for go in fields as a comma list, and the list is the same at every level.

The parameters that do the work: date_preset (today, yesterday, last_7d, last_30d, this_month, last_month, maximum) or time_range with explicit since and until; time_increment, where 1 means one row per day, monthly means one per month, and all_days (the default) collapses the range; and breakdowns for age, gender, country, publisher_platform, platform_position and device_platform. Combining a fine time_increment with two breakdowns multiplies the row count fast, which is when the async report path from the rate-limits section above starts to matter.

A field list that covers most dashboards: campaign_name,adset_name,ad_name,impressions,reach,frequency,clicks,inline_link_clicks,ctr,cpc,cpm,spend,actions,action_values,cost_per_action_type,purchase_roas. Note that clicks counts every click on the unit and inline_link_clicks counts the ones that left for your destination, so CTR from the former looks better than it is.

Meta Ads API insights report in Python: a short requests script that pages through results and writes a CSV

You do not need the facebook-business SDK for a Meta Ads API insights report in Python. Plain requests handles it, and the only part people get wrong is pagination: the response carries a paging.next URL that already includes your fields, level, date preset and token, so the loop has to stop passing params after the first request or the query string gets doubled.

import csv, requests ACCOUNT = "act_1234567890" TOKEN = "EAAB..." FIELDS = ["campaign_name", "impressions", "clicks", "spend", "actions", "cost_per_action_type"] url = f"https://graph.facebook.com/v21.0/{ACCOUNT}/insights" params = { "fields": ",".join(FIELDS), "level": "campaign", "date_preset": "last_30d", "access_token": TOKEN, } rows = [] while url: r = requests.get(url, params=params, timeout=60) r.raise_for_status() data = r.json() rows.extend(data.get("data", [])) url = data.get("paging", {}).get("next") params = None # paging.next already carries the query string with open("meta_insights.csv", "w", newline="") as f: w = csv.DictWriter(f, fieldnames=FIELDS) w.writeheader() w.writerows({k: row.get(k, "") for k in FIELDS} for row in rows)

Two things to adjust before you run it on a real account. actions and cost_per_action_type come back as lists of objects, one per action_type, so the CSV cell will hold the raw list; flatten the ones you care about (for example lead and purchase) into their own columns before handing the file to anyone in a spreadsheet. And put the token in an environment variable rather than the file, because a long-lived system user token that leaks through a repo is a full read of every account it can see.

Facebook ad account insights and advanced read fields: ads_read versus ads_management, and what App Review actually gates

The permission you need to read insights is ads_read. ads_management includes read access and adds writes (creating campaigns, changing budgets, pausing ads), so a reporting-only integration should ask for ads_read and nothing else; reviewers reject over-scoped apps, and a stolen token with ads_management can spend money. There is no separate list of Facebook ad account insights and advanced read fields. The fields are identical whichever permission you hold. What changes is whose accounts your token is allowed to read.

That is where “advanced access” comes in. An app in development mode, or one with only standard access to ads_read, can read the ad accounts of people who hold a role on the app (admin, developer, tester) and accounts owned by the app’s own business. That covers internal reporting completely: create a system user in Business Manager, assign it the ad accounts, generate a token with ads_read, and you never go through review. Advanced access for ads_read or ads_management is required the moment you read accounts belonging to people outside the app, which is every agency dashboard and every SaaS reporting product. That path means App Review plus business verification for the company that owns the app, and it can take weeks.

Meta Marketing API insights official documentation for spend, actions and cost_per_action_type, and how to read the arrays

spend is a plain string number in the ad account currency. actions and cost_per_action_type are arrays of objects, each with an action_type and a value; add action_attribution_windows to the request and every object also carries keys like 1d_click and 7d_click so you can see which window produced the number. Cost per lead is not a separate metric in the response: it is the object in cost_per_action_type whose action_type is lead. The v19 field names for ctr and cost_per_action_type are unchanged in later versions, so a Facebook Ads API v19 insights query for CTR and cost per lead runs as-is against v21 with the version number swapped.

The action_type keys that matter for most accounts, and the trap in them: lead is the combined total; onsite_conversion.lead_grouped is instant-form leads captured on Facebook and Instagram; offsite_conversion.fb_pixel_lead is the website Lead event from the pixel or Conversions API. Summing all three double counts. The same pattern applies to purchases (purchase and omni_purchase versus offsite_conversion.fb_pixel_purchase).

The Meta Marketing API insights official documentation is the place to confirm any of this before you build on it, since action types change between versions: the Insights API overview, the ad account insights reference for level, breakdowns and date handling, and the AdsActionStats reference for the full action_type list and the attribution keys.

Frequently asked questions

Q: How often can I pull insights data from Meta Ads API?

The insights endpoint has a limit of 5 requests per minute per ad account. For accounts with multiple campaigns, use account-level queries with level=campaign to get all data in one call. Large data requests should use async jobs.

Q: What's the difference between clicks and link_clicks in Meta insights?

'Clicks' includes all clicks on your ad (likes, comments, shares, profile clicks). 'Link_clicks' only counts clicks that send users to your website/landing page. For traffic campaigns, use link_clicks for accurate performance measurement.

Q: How far back can I retrieve historical insights data?

Meta stores insights data for 37 months. However, some metrics like detailed breakdowns may only be available for the last 12 months. Always pull and store important data locally for unlimited historical access.

Q: Why do insights numbers differ from Ads Manager?

Differences occur due to attribution windows, timezone settings, or data processing delays. API data uses advertiser timezone while Ads Manager may show user timezone. Ensure consistent attribution windows and timezone parameters.

Q: Can I get real-time insights data through the API?

Insights data typically has a 15-30 minute delay from actual ad delivery. For near real-time monitoring, query hourly or use yesterday's complete data for daily reports. Async jobs provide the most current available data.

Q: How do I track lead generation specifically through insights API?

Filter the 'actions' field for action_type='lead' or use the dedicated 'leads' field. Include action_values to get lead value data. For lead ads, also track 'cost_per_lead' and 'lead_conversion_rate' metrics.

Ryze AI — Autonomous Marketing

Skip the API complexity — get automated Meta insights

  • Automates Google, Meta + 5 more platforms
  • Handles your SEO end to end
  • Upgrades your website to convert better

2,000+

Marketers

$500M+

Ad spend

23

Countries

Live results across
2,000+ clients

Paid Ads

Avg. client
ROAS
0x
Revenue
driven
$0M

SEO

Organic
visits driven
0M
Keywords
on page 1
48k+

Websites

Conversion
rate lift
+0%
Time
on site
+0%
Last updated: Sep 8, 2026
All systems ok