> ## Documentation Index
> Fetch the complete documentation index at: https://docs.thrad.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Revenue & Metrics

> Pull your impressions, revenue, and fill rate into your own dashboards and reports.

Your impressions, clicks, revenue, and fill rate are available over one read-only endpoint, [`GET /v1/publisher/insights`](https://docs.thrad.ai/insights/api-reference). Use it to feed your own dashboards, warehouse, or reports. Send your API key as `Authorization: Bearer <key>`, the same way you do on bid requests. (`thrad-api-key: <key>` also works.) Your staging and production keys both read the same data. Running several publishers? One [organization key](#use-one-key-for-all-your-publishers) reads them all.

## Get daily revenue

Ask for the metrics you want, bucketed by day:

```bash theme={null}
curl -G https://api.thrad.ai/v1/publisher/insights \
  -H "thrad-api-key: $THRAD_API_KEY" \
  --data-urlencode 'time_granularity=daily' \
  --data-urlencode 'fields[]=impressions' \
  --data-urlencode 'fields[]=revenue' \
  --data-urlencode 'fields[]=ecpm' \
  --data-urlencode 'time_ranges[]={"type":"date_range","since":"2026-04-01","until":"2026-04-08"}'
```

You get one row per day:

```json theme={null}
{
  "object": "list",
  "data": [
    {
      "readable_time": "2026-04-02",
      "impressions": 1000,
      "revenue": 5.0,
      "ecpm": 5.0
    }
  ],
  "has_more": false
}
```

Money is in **US dollars**: `5.0` is \$5.00. Rates are fractions: a `ctr` of `0.01` is 1%. Buckets can also be `hourly`, `monthly`, or `none` for a single total. Without `time_ranges[]`, you get the last 30 days. Long results come in pages: see [pagination](https://docs.thrad.ai/insights/api-reference.md#param-after).

## Break it down by country, intent, or device

Add one `segments[]` value to get one row per country, intent, or device for the whole range:

```bash theme={null}
curl -G https://api.thrad.ai/v1/publisher/insights \
  -H "thrad-api-key: $THRAD_API_KEY" \
  --data-urlencode 'segments[]=country' \
  --data-urlencode 'fields[]=impressions' \
  --data-urlencode 'fields[]=revenue' \
  --data-urlencode 'time_ranges[]={"type":"date_range","since":"2026-04-01","until":"2026-04-30"}'
```

A breakdown covers the whole range, so don't send `time_granularity` with it. On CPM accounts, `clicks`, `ctr`, and `cpc` are `null` in breakdowns.

## Check your fill rate

Fill rate is the share of your ad requests that ended in an ad on screen. Fill metrics are opt-in:

```bash theme={null}
curl -G https://api.thrad.ai/v1/publisher/insights \
  -H "thrad-api-key: $THRAD_API_KEY" \
  --data-urlencode 'time_granularity=none' \
  --data-urlencode 'fields[]=fill_requests' \
  --data-urlencode 'fields[]=fill_rate' \
  --data-urlencode 'fields[]=nominal_fill_rate' \
  --data-urlencode 'time_ranges[]={"type":"date_range","since":"2026-04-01","until":"2026-04-30"}'
```

* `fill_rate` counts only ads that were **confirmed on screen**.
* `nominal_fill_rate` counts every ad delivered, confirmed or not.

A big gap between the two usually means ads are delivered but never counted as viewed. See [Impression Billing](https://docs.thrad.ai/api/guides/billing-viewability.md).

## Use one key for all your publishers

If your organization has several publishers, you don't need one key per publisher to pull reports. An organization owner or admin can create an **organization key** (`sko_...`) under **Settings → API key**. It reads every publisher in your organization and can't be used to serve ads.

List your publishers to get their ids:

```bash theme={null}
curl https://api.thrad.ai/v1/publisher/publishers \
  -H "thrad-api-key: $THRAD_ORG_KEY"
```

```json theme={null}
{
  "object": "list",
  "data": [
    {"object": "publisher", "id": "6f1c2b8e-1d2a-4c3b-9e8f-0a1b2c3d4e5f", "name": "Alpha", "inventory_type": "web"}
  ]
}
```

Then pass the one you want as `publisher_id`:

```bash theme={null}
curl -G https://api.thrad.ai/v1/publisher/insights \
  -H "thrad-api-key: $THRAD_ORG_KEY" \
  --data-urlencode 'publisher_id=6f1c2b8e-1d2a-4c3b-9e8f-0a1b2c3d4e5f' \
  --data-urlencode 'fields[]=impressions' \
  --data-urlencode 'fields[]=revenue' \
  --data-urlencode 'time_ranges[]={"type":"date_range","since":"2026-04-01","until":"2026-04-08"}'
```

With an organization key, `publisher_id` is required. Your existing per-publisher keys keep working as before, without it. The rate limit (1000 requests per hour) applies per key, so an organization key shares one limit across all its publishers.

## How revenue is counted

`revenue` is your **net** share, after the revenue split. How it grows depends on your account's payment model, which Thrad sets up with you:

* **CPM** (the default): a share of advertiser spend on impressions shown on screen.
* **CPC**: a fixed rate for each click, times your revenue share.

## Next steps

> [card] [Impression Billing](https://docs.thrad.ai/api/guides/billing-viewability.md)
>
> Why billed impressions can differ from what you delivered.

> [card] [Talk to us](mailto:contact@thrad.ai)
>
> Questions about your numbers or payouts? Email us.

Need exact fields? The [Insights API Reference](https://docs.thrad.ai/insights/api-reference.md) has every parameter and response.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.