REST API · Insights
Get insights
Performance of one ad account: by level, or broken down by day, placement, age and gender, or device
GEThttps://api.apogee.ad/api/v1/ad-accounts/{acc}/insights
What it does
Meta (default): the numbers of Apogee's Autopilot (spend, impressions, clicks, CTR, CPC, CPM, purchases, revenue, ROAS, CPA, add to cart…), in the account currency. level=account answers one row; the other levels and the breakdowns answer at most 200 rows in all (the pages stop there). Filters: level campaign takes status; level adset and breakdown daily campaign_id; level ad and the other breakdowns campaign_id and adset_id; level account none (any other filter is refused). Dates: Meta's presets.
TikTok and Snapchat: platform=tiktok or snapchat with that platform's ad account id (GET /ad-accounts?platform=…), an account the key's user connected. level account / campaign / adset (TikTok ad groups, Snapchat ad squads) / ad, or breakdown=daily (every day, zeros included; the account or one campaign_id / adset_id / ad_id; 92 days at most). Dates: the same presets, or since + until (YYYY-MM-DD, both included, 366 days at most), in the ad account's time zone. Levels take campaign_id, adset_id, status (active / paused), min_spend and sort (a metric: cpa, cpc, cpm the lowest first, the others the highest first; default spend), 200 rows at most. Rows carry platform, since, until and currency; the campaign / ad set rows their status and daily_budget. Purchases are TikTok's Complete Payment (website) / Snapchat's conversion_purchases (7-day swipe, no view), revenue their value; clicks = TikTok clicks / Snapchat swipes. These reads spend the user's TikTok / Snapchat budget, never Meta's.
Request
GET /ad-accounts/{acc}/insights on https://api.apogee.ad/api/v1.
Path parameters
-
accstring path requiredAd account id: Meta act_…, a TikTok advertiser id or a Snapchat ad account id (GET /ad-accounts?platform=…)
Query parameters
-
limitinteger query optionalPage size
-
cursorstring query optionalnext_cursor of the previous page
-
platformstring query optionalmeta (default), tiktok or snapchat
-
levelstring query optionalDefault account
-
date_presetstring query optionalDefault last_7d
-
sincestring query optionalTikTok / Snapchat: YYYY-MM-DD, with until (both included), instead of date_preset
-
untilstring query optionalTikTok / Snapchat: YYYY-MM-DD, with since
-
breakdownstring query optionalTikTok / Snapchat: daily only
-
campaign_idstring query optional -
adset_idstring query optional -
ad_idstring query optionalTikTok / Snapchat, breakdown daily: one ad
-
statusstring query optionalMeta: level campaign only; TikTok / Snapchat: any level
-
sortstring query optionalTikTok / Snapchat levels: the metric the rows are sorted by
-
min_spendstring query optionalTikTok / Snapchat levels: only rows that spent at least this much
Headers
-
Authorizationstring header requiredBearer apk_…: an API key with the scope of this route.
Response
200. A page of results: pass next_cursor as cursor for the next one, limit from 1 to 200 (default 50).
-
dataarray of objectsFields of each item (18)
-
levelstring -
metricsobjectFields (14)
-
spendnumber or null -
impressionsnumber or null -
clicksnumber or null -
ctrnumber or null -
cpcnumber or null -
cpmnumber or null -
reachnumber or null -
frequencynumber or null -
purchasesnumber or null -
revenuenumber or null -
roasnumber or null -
cpanumber or null -
add_to_cartnumber or null -
cost_per_atcnumber or null
-
-
date_presetstring or null -
sincestring or null -
untilstring or null -
currencystring or null -
campaign_idstring or null -
adset_idstring or null -
daily_budgetnumber or null -
idstring or null -
namestring or null -
statusstring or null -
datestring or null -
platformstring or null -
positionstring or null -
agestring or null -
genderstring or null -
devicestring or null
-
-
has_moreboolean -
next_cursorstring or null
Every answer carries X-Request-Id (give it to support), Apogee-Version: 2026-10-06, and the RateLimit and RateLimit-Policy headers.
Errors
Errors are application/problem+json with a stable code to switch on (all the codes).
| Status | Possible codes |
|---|---|
| 400 Bad request | idempotency_key_required, not_supported, request_refused, validation_failed |
| 401 Unauthorized | invalid_api_key |
| 403 Forbidden | account_not_connected, forbidden, insufficient_scope, meta_permission_denied, platform_permission_denied, upgrade_required |
| 404 Not found | not_found |
| 412 Precondition failed | drive_not_connected, meta_not_connected, platform_not_connected |
| 429 Too many requests | daily_read_cap, meta_rate_limited, platform_rate_limited, quota_exceeded, rate_limited |
| 500 Internal server error | internal_error |
| 502 Bad gateway | drive_error, launch_failed, meta_error, platform_error, upstream_error |
Example
With your key in APOGEE_API_KEY (create one):
curl 'https://api.apogee.ad/api/v1/ad-accounts/act_1234567890/insights' \
-H "Authorization: Bearer $APOGEE_API_KEY" {
"data": [
{
"level": "account",
"date_preset": "last_7d",
"since": "2026-10-01",
"until": "2026-10-21",
"currency": "EUR",
"campaign_id": "120200000000000001",
"adset_id": "120200000000000002",
"daily_budget": 50,
"id": "120200000000000001",
"name": "Nordlicht | Spring launch",
"status": "ACTIVE",
"date": "2026-10-21",
"platform": "meta",
"position": "120200000000000001",
"age": "120200000000000001",
"gender": "120200000000000001",
"device": "120200000000000001",
"metrics": {
"spend": 125.4,
"impressions": 18250,
"clicks": 412,
"ctr": 2.26,
"cpc": 0.3,
"cpm": 6.87,
"reach": 15100,
"frequency": 1.21,
"purchases": 9,
"revenue": 612.5,
"roas": 4.88,
"cpa": 13.93,
"add_to_cart": 31,
"cost_per_atc": 4.05
}
}
],
"has_more": false,
"next_cursor": null
} Access and cost
| Plans | Pro and Scale. |
|---|---|
| Scope | read (scopes). |
| Credits | Free up to the daily free reads (5,000 a day on Pro, 10,000 on Scale), then 1 credit per read. A request that fails costs nothing, a replayed one neither (credits). |
| Rate limit | Read: 600 per 15 minutes on Pro, 1,200 on Scale (rate limits). |
| Meta budget | Reads Meta: spends 1 unit of the account's Meta budget (1,800 per 15 minutes, 900 per ad account); with a TikTok or Snapchat platform, that platform's own budget instead. |
| Daily cap | Counts 1 unit toward the 2,000 units one API key can use in 24 hours. |
In the MCP
An AI assistant does the same with these tools of the MCP server:
get_account_overview: Spend, impressions, clicks, CTR, CPC, ROAS and conversions of the ad account for a period.get_campaigns: The campaigns with their budget, spend and results.get_adsets: The ad sets with their targeting, budget and metrics.get_ads: The ads with their creative and metrics.get_daily_breakdown: Spend, ROAS, CPA and add to carts day by day.get_ad_performance_by_placement: Results by placement (Feed, Stories, Reels…).get_ad_performance_by_age_gender: Results by age and gender.get_ad_performance_by_device: Results by device.get_platform_overview: One TikTok or Snapchat ad account's totals over a period: spend, impressions, clicks, CTR, CPC, CPM, reach, purchases, revenue, ROAS, CPA, add to carts. For Meta:get_account_overview.get_platform_performance: One row per campaign, ad set (TikTok ad group, Snapchat ad squad) or ad, with its status, daily budget and metrics, sorted by spend by default. TikTok's Smart+ ads included.get_platform_daily_breakdown: Day by day (92 days at most, every day listed) for the ad account or one campaign, ad set or ad, with the period's totals. For Meta:get_daily_breakdown.