Ad results
https://api.norreach.app/v1/ads/insightsSpend, impressions, clicks, results, cost per result (CPA), conversion value and ROAS from the hourly syncs — the numbers the Ads › Performance page shows — by day, campaign or network, over from–to (default the last 30 days, at most 366). Money is integer minor units, one row per currency (amounts in different currencies are never added). Missing numbers are null, never 0; the last day or two may still change.
curl -X GET "https://api.norreach.app/v1/ads/insights" \
-H "Authorization: Bearer $NORREACH_API_KEY"{
"object": "ad_insights",
"from": "2026-10-07",
"to": "2026-11-05",
"group_by": "network",
"data": [
{
"object": "ad_insight",
"date": null,
"network": "meta",
"campaign": null,
"currency": "SEK",
"spend": {
"amount_minor": 1254000,
"currency": "SEK"
},
"impressions": 182340,
"clicks": 2911,
"results": 64,
"result_type": "Leads",
"cost_per_result": {
"amount_minor": 19594,
"currency": "SEK"
},
"conversion_value": null,
"roas": null,
"ctr": 1.5965
}
],
"totals": [
{
"currency": "SEK",
"spend": {
"amount_minor": 1254000,
"currency": "SEK"
},
"results": 64,
"cost_per_result": {
"amount_minor": 19594,
"currency": "SEK"
},
"conversion_value": null,
"roas": null
}
],
"truncated": false
}Authorizations
Bearer authentication: send Authorization: Bearer <key>, with an API key or an OAuth access token. The key needs the scope ads:read. API keys and scopes
Query parameters
First day (YYYY-MM-DD, default 29 days before to).
Last day (YYYY-MM-DD, default today).
daycampaignnetworkmeta, tiktok, reddit or chatgpt.
metatiktokredditchatgptAn id (UUID).
Response
200application/json— Ad results
daycampaignnetworkShow child attributesHide child attributes
YYYY-MM-DD (group_by=day).
group_by=network or campaign.
group_by=campaign. id is null for a campaign no longer in the ad account.
Every amount on the row is in this currency. Rows never add different currencies together.
The goal conversions the network counted.
What a result is (Leads, Purchases …).
CPA: spend ÷ results.
Return on ad spend: conversion value ÷ spend.
Click-through rate in percent.
One total per currency.
Show child attributesHide child attributes
More rows than one answer reads — narrow the range.
Errors
Errors are application/problem+json with a stable code.
| Status | Code | Meaning |
|---|---|---|
| 400 | bad_request | The request couldn't be read. |
| 400 | unknown_field | The request has a field this operation doesn't know. |
| 401 | unauthorized | A valid API key is required. |
| 403 | insufficient_scope | This API key doesn't have the scope this operation needs. |
| 403 | feature_not_enabled | The API isn't switched on for this workspace. |
| 404 | not_found | That doesn't exist. |
| 422 | validation_failed | The request has invalid fields. |
| 429 | rate_limited | Too many requests. Slow down and try again. |
| 500 | server_error | Something went wrong on our side. |
| 503 | unavailable | The API isn't available right now. Try again shortly. |