Apple Search Ads tells you how paid App Store campaigns perform before and at install time: spend, impressions, taps, installs, CPA, CPT, and conversion rate.
RevenueCat tells you what those acquired users earn after install: purchases, subscriptions, renewals, and revenue.
The profitability endpoint joins both sides so you can see which campaigns, ad groups, and keywords are actually profitable.
GET /v1/connect/apple-ads/profitability
What This Answers
Use this endpoint when you want to know:
- Which paid keywords are profitable?
- Which campaigns have positive ROAS?
- Which ad groups spend money but do not earn it back?
- Which keywords should be scaled?
- Which rows should be paused, bid down, or moved to exact match?
This is private first-party analytics. It only works for Apple Search Ads accounts and RevenueCat projects you can access.
Apple Search Ads does not have a public competitor ad library like Meta Ad Library. You cannot use this endpoint to see another company’s Apple Ads spend, bids, revenue, or ROAS.
Data Sources
| Metric | Source |
|---|
| Campaigns, ad groups, keywords, status, budgets | Apple Search Ads Campaign Management API |
| Spend, impressions, taps, installs, CPA, CPT, conversion rate | Apple Search Ads reports |
| Revenue | RevenueCat Charts API, using Apple Search Ads attribution segments |
| Profit | Calculated by Appeeky: revenue - spend |
| ROAS | Calculated by Appeeky: revenue / spend |
| Insights | Calculated by Appeeky from spend, revenue, profit, ROAS, and installs |
Requirements
You need:
- An Appeeky API key.
- Apple Search Ads connected in Appeeky, or Apple Search Ads credentials passed per request.
- A RevenueCat secret API key.
- RevenueCat’s Apple Search Ads integration enabled for the project.
If RevenueCat does not have Apple Search Ads attribution enabled, Appeeky can still return Apple Ads spend and install metrics, but revenue, profit, and ROAS will be missing or incomplete.
Request
curl \
"https://api.appeeky.com/v1/connect/apple-ads/profitability?level=keyword&days=14¤cy=USD" \
-H "X-API-Key: YOUR_APPEEKY_KEY" \
-H "X-RC-Key: sk_YOUR_REVENUECAT_SECRET_KEY" \
-H "X-RC-Project: proj_YOUR_PROJECT_ID"
| Header | Required | Description |
|---|
X-API-Key | Yes | Your Appeeky API key |
X-RC-Key | Yes | RevenueCat secret API key |
X-RC-Project | No | RevenueCat project ID. Required only when the API key can access multiple projects. |
If Apple Search Ads is not saved in Appeeky, pass per-request Apple credentials:
| Header | Description |
|---|
X-ASA-Client-Id | Apple Search Ads client ID |
X-ASA-Team-Id | Apple Search Ads team ID |
X-ASA-Key-Id | Apple Search Ads key ID |
X-ASA-Org-Id | Apple Search Ads organization ID |
X-ASA-Private-Key | EC private key PEM |
X-ASA-Private-Key-B64 | Base64-encoded EC private key PEM |
Query Parameters
| Parameter | Default | Description |
|---|
level | keyword | Rollup level: keyword, campaign, adgroup, or search_term. |
campaignId | — | Optional single campaign ID. |
campaignIds | — | Optional comma-separated campaign IDs. Omit to scan campaigns in the connected account. |
from | — | Start date, YYYY-MM-DD. |
to | — | End date, YYYY-MM-DD. |
days | 14 | Trailing window when from and to are omitted. |
limit | 200 | Max Apple report rows per campaign. |
campaignLimit | 25 | Max campaigns to scan when campaignIds is omitted. |
currency | USD | RevenueCat currency. |
minSpend | 20 | Spend threshold used for insight buckets. |
insights | true | Set false to omit optimization insights. |
Response
{
"data": {
"level": "keyword",
"dateRange": {
"from": "2026-05-27",
"to": "2026-06-09"
},
"currency": "USD",
"rows": [
{
"id": "123456789",
"name": "screenshot search",
"level": "keyword",
"campaignId": "2143596801",
"campaignName": "Search",
"keywordId": "123456789",
"keyword": "screenshot search",
"matchType": "EXACT",
"spend": 82.4,
"revenue": 146.2,
"profit": 63.8,
"roas": 1.774,
"installs": 19,
"taps": 73,
"impressions": 1420,
"avgCpa": 4.34,
"avgCpt": 1.13,
"ttr": 0.0514,
"conversionRate": 0.2603,
"currency": "USD",
"revenueMatched": true,
"sourceRows": 1
}
],
"totals": {
"spend": 82.4,
"revenue": 146.2,
"profit": 63.8,
"roas": 1.774,
"installs": 19,
"taps": 73,
"impressions": 1420,
"avgCpa": 4.34,
"avgCpt": 1.13,
"ttr": 0.0514,
"conversionRate": 0.2603
},
"insights": [
{
"type": "scale",
"title": "Scale candidates",
"detail": "Rows with ROAS >= 1.5 and at least 20 spend."
}
],
"meta": {
"source": "live",
"appleReport": "keywords",
"revenueSource": "revenuecat_charts",
"revenueSegmentId": "apple_search_ads_keyword",
"revenueAttributionAvailable": true,
"warnings": []
}
}
}
Rollup Levels
| Level | Best for | Revenue support |
|---|
campaign | Portfolio-level budget decisions | Supported when RevenueCat exposes Apple Search Ads campaign segments |
adgroup | Comparing targeting groups | Supported when RevenueCat exposes Apple Search Ads ad group segments |
keyword | ROAS by paid keyword | Supported when RevenueCat exposes Apple Search Ads keyword segments |
search_term | Real user query analysis | Apple metrics only; RevenueCat does not expose stable search-term revenue attribution |
Search terms and keywords are not the same thing. A keyword is what you target in Apple Search Ads. A search term is what the user typed. RevenueCat attribution can map revenue to Apple Search Ads keyword/campaign/ad group dimensions, but not to arbitrary search terms.
Insight Types
| Type | Meaning |
|---|
scale | High ROAS rows with enough spend and installs to consider increasing budget or bids |
wasting_spend | Rows with meaningful spend but weak ROAS or zero installs |
profitable | Rows with the highest absolute profit |
no_revenue_attribution | Apple Ads metrics exist, but RevenueCat revenue did not match |
needs_more_data | No clear winner or loser crossed the current spend threshold |