# reports/network field reference
> Parameter, value, and response reference for GET /reports/network.
<!-- source: /en/api-reference/reporting/reportsnetwork -->

## Dimension list

Use these names in `dimensions`, `filter.<dimension>`, and `is_null`. See [Dimensions](#dimensions) for types and values.

| Dimension                       | Description                                   |
| ------------------------------- | --------------------------------------------- |
| `day`                           | Report day in the network's time zone.        |
| `provider`                      | Ad network.                                   |
| `provider_account_id`           | Network account ID.                           |
| `provider_account_secondary_id` | Moloco publisher ID.                          |
| `account_name`                  | CloudX account name.                          |
| `property_id`                   | Meta property ID.                             |
| `app_id`                        | Network app ID.                               |
| `app_name`                      | Network app name.                             |
| `package`                       | Android package or iOS bundle ID.             |
| `store_id`                      | App store ID.                                 |
| `platform`                      | Normalized platform.                          |
| `country`                       | Country code.                                 |
| `format`                        | Normalized ad format.                         |
| `placement_id`                  | Network placement ID.                         |
| `placement_reference_id`        | Liftoff placement reference ID.               |
| `placement_name`                | Network placement name.                       |
| `ad_size`                       | Liftoff ad size.                              |
| `incentivized`                  | Liftoff rewarded-traffic flag.                |
| `original_platform`             | Platform as the network reported it.          |
| `original_format`               | Ad format as the network reported it.         |
| `source_timezone`               | Time zone of the report day. Always included. |
| `currency`                      | Revenue currency. Always included.            |

## Network reporting reference

This endpoint returns the daily reports that your ad networks publish, as CloudX collected them from the connections under [Settings > Data sources](https://app.cloudx.io/settings/data-sources). Supported networks are Digital Turbine, InMobi, Liftoff, Meta, and Moloco. A request reads stored reports only; it never calls a network.

Every response includes impressions, clicks, revenue, eCPM, and average CPC for each row. Use `dimensions` to choose the breakdown, `filter.<dimension>` to match values, and `limit`, `offset`, and `snapshot` to page through the result.

The API key needs the `reports:read` permission, and network reporting must be enabled for the account. Contact your CloudX account manager to enable it. Without access, the endpoint returns `403`.

### Parameters

| Parameter            | Required | Default                                                          | Accepted values                                                                                 |
| -------------------- | -------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------- |
| `start_date`         | Yes      | —                                                                | `YYYY-MM-DD`, such as `2026-09-01`.                                                             |
| `end_date`           | Yes      | —                                                                | `YYYY-MM-DD`, on or after `start_date`. The range covers at most 90 days, inclusive.            |
| `dimensions`         | No       | `day,provider,provider_account_id,provider_account_secondary_id` | A comma-separated list of [dimensions](#dimensions), such as `day,provider,app_id,country`.     |
| `filter.<dimension>` | No       | —                                                                | An exact value of any [dimension](#dimensions). Repeat a filter to match any of several values. |
| `is_null`            | No       | —                                                                | A dimension name. Selects rows where that dimension is unknown. Repeat for several dimensions.  |
| `sort_by`            | No       | Grouping columns                                                 | `revenue`.                                                                                      |
| `sort_order`         | No       | `desc`                                                           | `desc` or `asc`. Requires `sort_by`.                                                            |
| `limit`              | No       | `1000`                                                           | `1` through `10000`.                                                                            |
| `offset`             | No       | `0`                                                              | `0` through `1000000`.                                                                          |
| `snapshot`           | No       | —                                                                | The `page.snapshot` value from the first page: 64 lowercase hexadecimal characters.             |
| `format`             | No       | `json`                                                           | `json` or `csv`.                                                                                |

Each parameter other than `filter.<dimension>` and `is_null` may appear once and must not be empty. An unknown parameter or dimension, a repeated parameter, or an empty value for one of these parameters returns `400`. An empty `filter.<dimension>` value is valid and matches an empty string.

### Dimensions

`dimensions` accepts the names below in any order. Responses always list columns in this table's order. `source_timezone` and `currency` are always grouped, even when you omit them.

| Dimension                       | Type              | Values                                                                                                         |
| ------------------------------- | ----------------- | -------------------------------------------------------------------------------------------------------------- |
| `day`                           | string            | Report day, `YYYY-MM-DD`, in the network's `source_timezone`.                                                  |
| `provider`                      | string            | `digitalturbine`, `inmobi`, `liftoff`, `meta`, or `moloco`.                                                    |
| `provider_account_id`           | string            | The network account from the data source connection. See [network accounts](#network-accounts).                |
| `provider_account_secondary_id` | string            | Moloco publisher ID. An empty string for other networks.                                                       |
| `account_name`                  | string or `null`  | Your CloudX account name.                                                                                      |
| `property_id`                   | string or `null`  | Meta property ID.                                                                                              |
| `app_id`                        | string or `null`  | The network's app ID.                                                                                          |
| `app_name`                      | string or `null`  | The network's app name.                                                                                        |
| `package`                       | string or `null`  | Android package or iOS bundle ID, such as `com.example.game`.                                                  |
| `store_id`                      | string or `null`  | App store ID, such as a numeric App Store ID.                                                                  |
| `platform`                      | string or `null`  | `android`, `ios`, or `fireos`.                                                                                 |
| `country`                       | string or `null`  | Lowercase ISO 3166-1 alpha-2 code, such as `us`. See [country codes](#country-codes).                          |
| `format`                        | string or `null`  | `banner`, `interstitial`, `native`, or `rewarded`. See [ad formats](#ad-formats).                              |
| `placement_id`                  | string or `null`  | The network's placement or ad-unit ID.                                                                         |
| `placement_reference_id`        | string or `null`  | Liftoff placement reference ID.                                                                                |
| `placement_name`                | string or `null`  | The network's placement or ad-unit name.                                                                       |
| `ad_size`                       | string or `null`  | Liftoff ad size, such as `320x50`.                                                                             |
| `incentivized`                  | boolean or `null` | Liftoff rewarded-traffic flag: `true` or `false`.                                                              |
| `original_platform`             | string or `null`  | Platform exactly as the network reported it.                                                                   |
| `original_format`               | string or `null`  | Ad format exactly as the network reported it.                                                                  |
| `source_timezone`               | string            | Time zone that defines the network's report day: `America/Los_Angeles` for Meta, `UTC` for the other networks. |
| `currency`                      | string or `null`  | Revenue currency the network reported, such as `USD`. `null` when the network does not report a currency.      |

`null` means the network did not report the value, or reported a value that CloudX cannot normalize. Reports have no mediation-platform dimension.

#### Revenue currency

CloudX does not convert revenue. Rows are always split by `currency`, and rows whose currency is unknown also keep `provider`, `provider_account_id`, and `provider_account_secondary_id`, even if you did not request them. This way, revenue that may be in different currencies is never summed into one row.

When any row in the result has an unknown currency, `fields` includes those three columns. Rows with a known currency return `null` in any of those columns you did not request.

Digital Turbine reports `USD`. Liftoff, InMobi, Meta, and Moloco currently return `currency: null`, so their rows keep their network account columns.

#### Dimensions by network

A network that does not report a dimension returns `null` for it. A `filter.<dimension>` on that dimension therefore excludes the network's rows; use `is_null` to select them instead.

| Dimension                                  | Digital Turbine | InMobi | Liftoff | Meta | Moloco |
| ------------------------------------------ | --------------- | ------ | ------- | ---- | ------ |
| `account_name`                             | Yes             | Yes    | Yes     | Yes  | Yes    |
| `property_id`                              | —               | —      | —       | Yes  | —      |
| `app_id`                                   | Yes             | Yes    | Yes     | —    | Yes    |
| `app_name`                                 | Yes             | Yes    | Yes     | —    | Yes    |
| `package`, `store_id`                      | Yes             | Yes    | Yes     | —    | Yes    |
| `platform`, `original_platform`, `country` | Yes             | Yes    | Yes     | Yes  | Yes    |
| `format`, `original_format`                | Yes             | Yes    | Yes     | —    | Yes    |
| `placement_id`                             | Yes             | Yes    | Yes     | Yes  | Yes    |
| `placement_reference_id`                   | —               | —      | Yes     | —    | —      |
| `placement_name`                           | —               | Yes    | Yes     | Yes  | Yes    |
| `ad_size`, `incentivized`                  | —               | —      | Yes     | —    | —      |
| `currency`                                 | Yes             | —      | —       | —    | —      |

`package` holds package-style identifiers, such as `com.example.game`. `store_id` holds store identifiers, such as a numeric App Store ID. Digital Turbine, InMobi, and Liftoff report one app identifier, which fills whichever of the two matches its shape. Moloco reports both.

#### Network accounts

| Network         | `provider_account_id`        | `provider_account_secondary_id` |
| --------------- | ---------------------------- | ------------------------------- |
| Digital Turbine | Digital Turbine publisher ID | Empty string                    |
| InMobi          | InMobi account ID            | Empty string                    |
| Liftoff         | Liftoff customer ID          | Empty string                    |
| Meta            | Meta business ID             | Empty string                    |
| Moloco          | Moloco platform ID           | Moloco publisher ID             |

#### Ad formats

`format` is the normalized ad format. `original_format` keeps the network's own value.

| Network         | `original_format`                              | `format`       |
| --------------- | ---------------------------------------------- | -------------- |
| Digital Turbine | `banner`, `interstitial`, `native`             | Same value     |
| Digital Turbine | `rewarded`, `rewarded_video`, `rewarded video` | `rewarded`     |
| InMobi          | `banner`, `interstitial`, `native`             | Same value     |
| InMobi          | `rewarded`, `rewarded_video`, `rewarded video` | `rewarded`     |
| Liftoff         | `banner`, `native`                             | Same value     |
| Liftoff         | `video` with `incentivized: true`              | `rewarded`     |
| Liftoff         | `video` with `incentivized: false`             | `interstitial` |
| Moloco          | `banner`, `interstitial`, `native`             | Same value     |
| Moloco          | `reward_video`, `rewarded`                     | `rewarded`     |
| Meta            | Not reported                                   | `null`         |

Matching ignores case and surrounding spaces. Any other value returns `format: null`; filter on `original_format` to select it.

#### Platforms

`platform` is `android`, `ios`, or `fireos`. Network values `iphone` and `ipad` normalize to `ios`, and `amazon` and `fire os` normalize to `fireos`. Any other value returns `platform: null`. `original_platform` keeps the network's own value.

#### Country codes

`country` is a lowercase ISO 3166-1 alpha-2 code. CloudX normalizes the alpha-2 codes, alpha-3 codes, and English country names that networks report. `xk` is Kosovo. Unrecognized values return `country: null`.

### All 250 country codes

|   | Codes                                                                                                              |
| - | ------------------------------------------------------------------------------------------------------------------ |
| A | `ad` `ae` `af` `ag` `ai` `al` `am` `ao` `aq` `ar` `as` `at` `au` `aw` `ax` `az`                                    |
| B | `ba` `bb` `bd` `be` `bf` `bg` `bh` `bi` `bj` `bl` `bm` `bn` `bo` `bq` `br` `bs` `bt` `bv` `bw` `by` `bz`           |
| C | `ca` `cc` `cd` `cf` `cg` `ch` `ci` `ck` `cl` `cm` `cn` `co` `cr` `cu` `cv` `cw` `cx` `cy` `cz`                     |
| D | `de` `dj` `dk` `dm` `do` `dz`                                                                                      |
| E | `ec` `ee` `eg` `eh` `er` `es` `et`                                                                                 |
| F | `fi` `fj` `fk` `fm` `fo` `fr`                                                                                      |
| G | `ga` `gb` `gd` `ge` `gf` `gg` `gh` `gi` `gl` `gm` `gn` `gp` `gq` `gr` `gs` `gt` `gu` `gw` `gy`                     |
| H | `hk` `hm` `hn` `hr` `ht` `hu`                                                                                      |
| I | `id` `ie` `il` `im` `in` `io` `iq` `ir` `is` `it`                                                                  |
| J | `je` `jm` `jo` `jp`                                                                                                |
| K | `ke` `kg` `kh` `ki` `km` `kn` `kp` `kr` `kw` `ky` `kz`                                                             |
| L | `la` `lb` `lc` `li` `lk` `lr` `ls` `lt` `lu` `lv` `ly`                                                             |
| M | `ma` `mc` `md` `me` `mf` `mg` `mh` `mk` `ml` `mm` `mn` `mo` `mp` `mq` `mr` `ms` `mt` `mu` `mv` `mw` `mx` `my` `mz` |
| N | `na` `nc` `ne` `nf` `ng` `ni` `nl` `no` `np` `nr` `nu` `nz`                                                        |
| O | `om`                                                                                                               |
| P | `pa` `pe` `pf` `pg` `ph` `pk` `pl` `pm` `pn` `pr` `ps` `pt` `pw` `py`                                              |
| Q | `qa`                                                                                                               |
| R | `re` `ro` `rs` `ru` `rw`                                                                                           |
| S | `sa` `sb` `sc` `sd` `se` `sg` `sh` `si` `sj` `sk` `sl` `sm` `sn` `so` `sr` `ss` `st` `sv` `sx` `sy` `sz`           |
| T | `tc` `td` `tf` `tg` `th` `tj` `tk` `tl` `tm` `tn` `to` `tr` `tt` `tv` `tw` `tz`                                    |
| U | `ua` `ug` `um` `us` `uy` `uz`                                                                                      |
| V | `va` `vc` `ve` `vg` `vi` `vn` `vu`                                                                                 |
| W | `wf` `ws`                                                                                                          |
| X | `xk`                                                                                                               |
| Y | `ye` `yt`                                                                                                          |
| Z | `za` `zm` `zw`                                                                                                     |

The United Kingdom is `gb`. There is no `uk` value.

### Filters

`filter.<dimension>` matches exact, case-sensitive values of any dimension, whether or not the dimension is in `dimensions`.

* Repeat a filter to match any of its values: `filter.country=us&filter.country=ca`.
* Different filters must all match: `filter.platform=ios&filter.country=us`.
* Filter values use the same text as the response: `filter.day=2026-09-01`, `filter.incentivized=true`, `filter.provider_account_secondary_id=` for an empty string.
* `is_null=<dimension>` selects rows where the dimension is `null`. You cannot combine `is_null` and `filter.<dimension>` for the same dimension.
* Each filter accepts up to 100 values of up to 1,024 bytes each.

Comma-separated filter values are not split: `filter.country=us,ca` matches nothing.

### Metrics

Every row ends with these metric columns.

| Metric                | Type                     | Meaning                                                          |
| --------------------- | ------------------------ | ---------------------------------------------------------------- |
| `impressions`         | decimal string or `null` | Impressions the network reported.                                |
| `clicks`              | decimal string or `null` | Clicks the network reported.                                     |
| `revenue`             | number or `null`         | Revenue the network reported, in the row's currency.             |
| `ecpm`                | number or `null`         | `revenue * 1000 / impressions`. `null` when impressions are `0`. |
| `average_cpc`         | number or `null`         | `revenue / clicks`. `null` when clicks are `0`.                  |
| `missing_impressions` | decimal string           | Network report rows in this group without an impression count.   |
| `missing_clicks`      | decimal string           | Network report rows in this group without a click count.         |
| `missing_revenue`     | decimal string           | Network report rows in this group without revenue.               |

Counts are strings so that values above 253 keep full precision. A metric is `null` when any network report row in its group lacks the value; CloudX does not return a partial sum. `ecpm` and `average_cpc` are `null` whenever an input metric is `null`. A zero reported by the network is a value, not a missing one.

### JSON response

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-01&dimensions=day,provider,country&filter.country=us" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

```json
{
  "query_time": "2026-09-02T09:30:00.123456Z",
  "fields": ["day", "provider", "provider_account_id", "provider_account_secondary_id", "country", "source_timezone", "currency", "impressions", "clicks", "revenue", "ecpm", "average_cpc", "missing_impressions", "missing_clicks", "missing_revenue"],
  "rows": [
    {"day": "2026-09-01", "provider": "digitalturbine", "provider_account_id": null, "provider_account_secondary_id": null, "country": "us", "source_timezone": "UTC", "currency": "USD", "impressions": "15320", "clicks": "201", "revenue": 68.94, "ecpm": 4.5, "average_cpc": 0.34298507462686567, "missing_impressions": "0", "missing_clicks": "0", "missing_revenue": "0"},
    {"day": "2026-09-01", "provider": "liftoff", "provider_account_id": "8f14e45fceea167a5a36dedd4bea2543", "provider_account_secondary_id": "", "country": "us", "source_timezone": "UTC", "currency": null, "impressions": "48210", "clicks": "612", "revenue": 241.05, "ecpm": 5, "average_cpc": 0.3938725490196079, "missing_impressions": "0", "missing_clicks": "0", "missing_revenue": "0"},
    {"day": "2026-09-01", "provider": "meta", "provider_account_id": "1029384756473829", "provider_account_secondary_id": "", "country": "us", "source_timezone": "America/Los_Angeles", "currency": null, "impressions": "30500", "clicks": "305", "revenue": 152.5, "ecpm": 5, "average_cpc": 0.5, "missing_impressions": "0", "missing_clicks": "0", "missing_revenue": "0"},
    {"day": "2026-09-01", "provider": "moloco", "provider_account_id": "EXAMPLE_PLATFORM", "provider_account_secondary_id": "EXAMPLE_PUBLISHER", "country": "us", "source_timezone": "UTC", "currency": null, "impressions": "9140", "clicks": "88", "revenue": 41.13, "ecpm": 4.5, "average_cpc": 0.46738636363636366, "missing_impressions": "0", "missing_clicks": "0", "missing_revenue": "0"}
  ],
  "coverage": [
    {"provider": "digitalturbine", "provider_account_id": "412833", "provider_account_secondary_id": "", "day": "2026-09-01", "scope": "[\"programmatic\",\"183920\",\"android\"]", "status": "covered", "accepted_at": "2026-09-02T04:12:51Z", "latest_status": null},
    {"provider": "liftoff", "provider_account_id": "8f14e45fceea167a5a36dedd4bea2543", "provider_account_secondary_id": "", "day": "2026-09-01", "scope": "customer-day", "status": "covered", "accepted_at": "2026-09-02T06:14:09Z", "latest_status": null},
    {"provider": "meta", "provider_account_id": "1029384756473829", "provider_account_secondary_id": "", "day": "2026-09-01", "scope": "business-day", "status": "covered", "accepted_at": "2026-09-02T08:40:17Z", "latest_status": "running"},
    {"provider": "moloco", "provider_account_id": "EXAMPLE_PLATFORM", "provider_account_secondary_id": "EXAMPLE_PUBLISHER", "day": "2026-09-01", "scope": "account-pair-day", "status": "covered", "accepted_at": "2026-09-02T05:03:44Z", "latest_status": null}
  ],
  "page": {"limit": 1000, "offset": 0, "has_more": false, "snapshot": "50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c"}
}
```

The request asked for `day`, `provider`, and `country`. `source_timezone` and `currency` are always added. Because three networks report no currency, `fields` also lists the network account columns: the Digital Turbine row reports `USD`, so its account columns are `null`.

| Field        | Meaning                                                                             |
| ------------ | ----------------------------------------------------------------------------------- |
| `query_time` | When CloudX read the page.                                                          |
| `fields`     | Row columns in output order: dimensions, then metrics.                              |
| `rows`       | Report rows. Each object has one key per `fields` entry, in the same order.         |
| `coverage`   | Which requested days have data for each network account. See [coverage](#coverage). |
| `page`       | `limit`, `offset`, `has_more`, and `snapshot`. See [pagination](#pagination).       |

### Coverage

`coverage` has one entry for each network account, scope, and requested day. Use it to tell a day with no traffic from a day CloudX has not collected yet.

| Field                                                              | Meaning                                                                                                                                                                                    |
| ------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `provider`, `provider_account_id`, `provider_account_secondary_id` | The network account.                                                                                                                                                                       |
| `day`                                                              | Requested day, `YYYY-MM-DD`.                                                                                                                                                               |
| `scope`                                                            | The unit the network reports independently, such as one business, customer, or account. Digital Turbine reports one scope per app and platform. Treat the value as opaque.                 |
| `status`                                                           | `covered` when the day has data, `empty` when the network reported the day with no rows, `missing` when CloudX has no data for the day yet.                                                |
| `accepted_at`                                                      | When CloudX stored the day's data. `null` when `status` is `missing`.                                                                                                                      |
| `latest_status`                                                    | `pending`, `running`, or `failed` when the latest collection of the day is queued, in progress, or failed. Otherwise `null`. A `covered` day can be `running` while a refresh is underway. |

Networks revise recent days after first publishing them. When CloudX collects a revision, it replaces the stored day, and `accepted_at` changes. When the account has no network reporting data at all, `coverage` holds a single entry with `status: "missing"` and empty account and day fields.

### Sorting

Without `sort_by`, rows sort ascending by every grouping column in output order, with `null` values last. Grouping columns include the network account columns that [revenue currency](#revenue-currency) adds.

With `sort_by=revenue`, rows sort by revenue, descending unless `sort_order=asc`. Rows with `null` revenue sort last in either direction. Grouping columns break ties, so page boundaries are deterministic.

### Pagination

A page holds at most `limit` rows, starting after `offset` rows. `page.has_more` is `true` when more rows follow. A page past the last row is empty.

Without `snapshot`, every page reads the latest data. If CloudX stores a revised day between two pages, rows can move across page boundaries. To detect that, pass the first page's `page.snapshot` as `snapshot` on every later page. The snapshot covers your query and the stored data it reads, but not `limit`, `offset`, or `format`. If either changes, the request returns `409`. Restart from `offset=0` without `snapshot`.

```bash
#!/usr/bin/env bash
set -euo pipefail

url="https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07&dimensions=day,provider,app_id,country&limit=1000"

offset=0
snapshot=""
: > rows.jsonl
while true; do
  status=$(curl -sS -o page.json -w '%{http_code}' \
    "$url&offset=$offset${snapshot:+&snapshot=$snapshot}" \
    -H "Authorization: Bearer $CLOUDX_API_KEY")
  if [ "$status" = 409 ]; then
    offset=0; snapshot=""; : > rows.jsonl; continue
  fi
  [ "$status" = 200 ] || { cat page.json >&2; exit 1; }

  jq -c '.rows[]' page.json >> rows.jsonl
  snapshot=$(jq -r '.page.snapshot' page.json)
  [ "$(jq -r '.page.has_more' page.json)" = true ] || break
  offset=$((offset + 1000))
done
```

### CSV response

`format=csv` returns the same rows as `text/csv`. The header row matches `fields`. Page and coverage metadata move to response headers.

```bash
curl -i "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-01&dimensions=day,provider,country&filter.country=us&format=csv" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

```text
HTTP/2 200
content-type: text/csv; charset=utf-8
x-network-query-time: 2026-09-02T09:30:00.123456Z
x-network-limit: 1000
x-network-offset: 0
x-network-has-more: false
x-network-snapshot: 50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c
x-network-coverage: [{"provider":"digitalturbine","provider_account_id":"412833","provider_account_secondary_id":"","covered":1,"empty":0,"missing":0,"latest_failed_scopes":0,"latest_pending_scopes":0,"latest_running_scopes":0,"oldest_accepted_at":"2026-09-02T04:12:51Z","latest_accepted_at":"2026-09-02T04:12:51Z"},…]

day,provider,provider_account_id,provider_account_secondary_id,country,source_timezone,currency,impressions,clicks,revenue,ecpm,average_cpc,missing_impressions,missing_clicks,missing_revenue
2026-09-01,digitalturbine,\N,\N,us,UTC,USD,15320,201,68.94,4.5,0.34298507462686567,0,0,0
2026-09-01,liftoff,8f14e45fceea167a5a36dedd4bea2543,,us,UTC,\N,48210,612,241.05,5,0.3938725490196079,0,0,0
2026-09-01,meta,1029384756473829,,us,America/Los_Angeles,\N,30500,305,152.5,5,0.5,0,0,0
2026-09-01,moloco,EXAMPLE_PLATFORM,EXAMPLE_PUBLISHER,us,UTC,\N,9140,88,41.13,4.5,0.46738636363636366,0,0,0
```

| Header                 | Meaning                                                                                                                                                                                                                        |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `X-Network-Query-Time` | Same as `query_time`.                                                                                                                                                                                                          |
| `X-Network-Limit`      | Same as `page.limit`.                                                                                                                                                                                                          |
| `X-Network-Offset`     | Same as `page.offset`.                                                                                                                                                                                                         |
| `X-Network-Has-More`   | Same as `page.has_more`.                                                                                                                                                                                                       |
| `X-Network-Snapshot`   | Same as `page.snapshot`. JSON and CSV pages of one query share a snapshot.                                                                                                                                                     |
| `X-Network-Coverage`   | JSON array with one summary per network account: counts of `covered`, `empty`, and `missing` scope-days; counts of scope-days whose latest collection is failed, pending, or running; and the oldest and latest `accepted_at`. |

CSV writes `null` as `\N` and an empty string as an empty field. A text value that starts with a backslash gains one more, so the literal text `\N` is written as `\\N`. Fields that contain commas, quotes, or line breaks are quoted.

If the coverage summary is too large for a response header, the request returns `422`. Request `format=json`, or filter by `provider`, `provider_account_id`, or `provider_account_secondary_id`.

### Example requests

All examples use the base URL `https://provisioning.cloudx.io/api/v1` and send your API key as a bearer token.

#### Report a date range

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

Returns one row per day and network account.

#### Filter by ad format

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07&filter.format=rewarded" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

#### Filter by network

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07&filter.provider=liftoff" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

#### Filter by country

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07&filter.country=us" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

#### Filter by app package

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07&filter.package=com.example.game" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

Meta does not report packages, so this filter excludes Meta rows.

#### Filter by platform

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07&filter.platform=ios" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

#### Filter by placement

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07&filter.placement_id=PLACEMENT_ID" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

Replace `PLACEMENT_ID` with the placement or ad-unit ID from the network.

#### Match several values of one dimension

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07&filter.country=us&filter.country=ca" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

Returns rows for the United States or Canada.

#### Combine filters across dimensions

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07&filter.platform=ios&filter.country=us" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

Returns iOS rows in the United States.

#### Daily breakdown

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07&dimensions=day" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

Returns one row per day, currency, and source time zone. Networks without a reported currency also keep one row per network account; see [revenue currency](#revenue-currency).

#### Break down by day, network, app, and country

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07&dimensions=day,provider,app_id,country" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

#### Read impressions, clicks, revenue, and eCPM

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07&dimensions=day" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

Every response includes all [metrics](#metrics); there is no metric selector.

#### Export CSV

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07&format=csv" \
  -H "Authorization: Bearer $CLOUDX_API_KEY" \
  -o network.csv
```

#### Select rows with an unknown dimension

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07&is_null=package" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

Returns rows whose `package` is `null`, including all Meta rows.

#### Find missing metrics and incomplete days

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07&format=json" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

Rows with nonzero `missing_impressions`, `missing_clicks`, or `missing_revenue` include network report rows that lack that metric. `coverage` entries with `status: "missing"` are days CloudX has not collected yet.

#### Sort by revenue

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07&sort_by=revenue&sort_order=desc" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

`sort_order` is optional and defaults to `desc`.

#### Page through results

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07&limit=100&offset=100" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

Returns rows 101 through 200. Continue while `page.has_more` is `true`; for CSV, read `X-Network-Has-More`.

#### Page through a consistent snapshot

```bash
curl "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07&limit=100&offset=100&snapshot=SNAPSHOT" \
  -H "Authorization: Bearer $CLOUDX_API_KEY"
```

Replace `SNAPSHOT` with `page.snapshot` from the first page. A `409` means the stored data changed; restart from `offset=0`.

### Errors

Errors return JSON with an `error` message, such as `{"error": "invalid network report request: unknown dimension app"}`.

| Status | Cause                                                                                                                                                                                                             | Action                                                                                                |
| ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- |
| `400`  | Unknown parameter or dimension, repeated or empty parameter, invalid date, `end_date` before `start_date`, `sort_order` without `sort_by`, malformed `snapshot`, or `is_null` and a filter on the same dimension. | Fix the request. The message names the problem.                                                       |
| `401`  | Missing or invalid API key.                                                                                                                                                                                       | Send a valid key.                                                                                     |
| `403`  | The key lacks `reports:read`, or network reporting is not enabled for the account.                                                                                                                                | Add the permission, or contact your CloudX account manager.                                           |
| `409`  | The `snapshot` no longer matches the query or the stored data.                                                                                                                                                    | Restart from `offset=0` without `snapshot`.                                                           |
| `422`  | A [limit](#limits) was exceeded.                                                                                                                                                                                  | Narrow the dates or filters, reduce `limit` or `offset`, or wait for other report requests to finish. |
| `503`  | Report data is being updated.                                                                                                                                                                                     | Retry after the `Retry-After` delay.                                                                  |
| `504`  | The report did not finish in time.                                                                                                                                                                                | Retry after the `Retry-After` delay, or narrow the dates or filters.                                  |

### Limits

| Limit                  | Value              |
| ---------------------- | ------------------ |
| Date range             | 90 days, inclusive |
| Values per filter      | 100                |
| Bytes per filter value | 1,024              |
| Rows per page          | 10,000             |
| Offset                 | 1,000,000          |
| Response size          | 32 MiB             |
| Request time           | 30 seconds         |

A request that reads too much report data, or arrives while too many report requests are running, also returns `422`. Send report requests one at a time.
