Docs
Ads

Ad results

GEThttps://api.norreach.app/v1/ads/insights

Spend, 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.

ads:readOperation id: get_ad_insights
GET/ads/insights
curl -X GET "https://api.norreach.app/v1/ads/insights" \
  -H "Authorization: Bearer $NORREACH_API_KEY"
Ad results
{
  "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

Authorizationstringheaderrequired

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

fromstring (date)query

First day (YYYY-MM-DD, default 29 days before to).

tostring (date)query

Last day (YYYY-MM-DD, default today).

group_byenumquery
One of:daycampaignnetwork
networkenumquery

meta, tiktok, reddit or chatgpt.

One of:metatiktokredditchatgpt
ad_account_idstring (uuid)query

An id (UUID).

Response

200application/json— Ad results

object"ad_insights"required
fromstringrequired
tostringrequired
group_byenumrequired
One of:daycampaignnetwork
dataobject[]required
Show child attributes
data[].object"ad_insight"required
data[].datestring | nullrequired

YYYY-MM-DD (group_by=day).

data[].networkenum | nullrequired

group_by=network or campaign.

data[].campaignobject | nullrequired

group_by=campaign. id is null for a campaign no longer in the ad account.

data[].currencystring | nullrequired

Every amount on the row is in this currency. Rows never add different currencies together.

data[].spendobject | nullrequired
data[].impressionsnumber | nullrequired
data[].clicksnumber | nullrequired
data[].resultsnumber | nullrequired

The goal conversions the network counted.

data[].result_typestring | nullrequired

What a result is (Leads, Purchases …).

data[].cost_per_resultobject | nullrequired

CPA: spend ÷ results.

data[].conversion_valueobject | nullrequired
data[].roasnumber | nullrequired

Return on ad spend: conversion value ÷ spend.

data[].ctrnumber | nullrequired

Click-through rate in percent.

totalsobject[]required

One total per currency.

Show child attributes
totals[].currencystring | nullrequired
totals[].spendobject | nullrequired
totals[].resultsnumber | nullrequired
totals[].cost_per_resultobject | nullrequired
totals[].conversion_valueobject | nullrequired
totals[].roasnumber | nullrequired
truncatedbooleanrequired

More rows than one answer reads — narrow the range.

Errors

Errors are application/problem+json with a stable code.

StatusCodeMeaning
400bad_requestThe request couldn't be read.
400unknown_fieldThe request has a field this operation doesn't know.
401unauthorizedA valid API key is required.
403insufficient_scopeThis API key doesn't have the scope this operation needs.
403feature_not_enabledThe API isn't switched on for this workspace.
404not_foundThat doesn't exist.
422validation_failedThe request has invalid fields.
429rate_limitedToo many requests. Slow down and try again.
500server_errorSomething went wrong on our side.
503unavailableThe API isn't available right now. Try again shortly.