reports/network
Field and value reference · Markdown
/reports/networkRead daily ad network reporting collected from your connected data sources, grouped by the dimensions you choose, with impressions, clicks, revenue, eCPM, and average CPC. Requires the reports:read permission and network reporting access for the account. Match exact values with repeated filter.<dimension> parameters, and select unknown values with is_null. source_timezone and currency always group. Rows from a network that does not report its currency also keep provider, provider_account_id, and provider_account_secondary_id, so revenue in different currencies is never summed. Impression, click, and missing counts are decimal strings. Pass the first page's page.snapshot as snapshot to detect data changes between pages.
Dimension list
Use these names in dimensions, filter.<dimension>, and is_null. See 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. |
Request
curl -X GET "https://provisioning.cloudx.io/api/v1/reports/network?start_date=2026-09-01&end_date=2026-09-07" \
-H "Authorization: Bearer $CLOUDX_API_KEY"Query parameters
| Name | Type | Description |
|---|---|---|
start_daterequired | string<date> | First report day, YYYY-MM-DD. The range covers at most 90 days, inclusive. |
end_daterequired | string<date> | Last report day, YYYY-MM-DD, inclusive. Must not precede start_date. |
dimensions | string | Comma-separated breakdown. Defaults to day,provider,provider_account_id,provider_account_secondary_id. Accepts day, provider, provider_account_id, provider_account_secondary_id, account_name, property_id, app_id, app_name, package, store_id, platform, country, format, placement_id, placement_reference_id, placement_name, ad_size, incentivized, original_platform, original_format, source_timezone, and currency. Output column order is fixed, whatever the request order. Dimension list |
filter.day | array of string<date> | Report day, YYYY-MM-DD. Repeat to match any of several values. Dimension list |
filter.provider | array of string | Ad network. Repeat to match any of several values. Allowed values: digitalturbine, inmobi, liftoff, meta, moloco. Dimension list |
filter.provider_account_id | array of string | Network account ID from the data source connection. Repeat to match any of several values. Dimension list |
filter.provider_account_secondary_id | array of string | Moloco publisher ID; empty string for other networks. Repeat to match any of several values. Dimension list |
filter.account_name | array of string | CloudX account name. Repeat to match any of several values. Dimension list |
filter.property_id | array of string | Meta property ID. Repeat to match any of several values. Dimension list |
filter.app_id | array of string | The network's app ID. Repeat to match any of several values. Dimension list |
filter.app_name | array of string | The network's app name. Repeat to match any of several values. Dimension list |
filter.package | array of string | Android package or iOS bundle ID, such as com.example.game. Repeat to match any of several values. Dimension list |
filter.store_id | array of string | App store ID, such as a numeric App Store ID. Repeat to match any of several values. Dimension list |
filter.platform | array of string | Normalized platform. Repeat to match any of several values. Allowed values: android, ios, fireos. Dimension list |
filter.country | array of string | Lowercase ISO 3166-1 alpha-2 country code, such as us. Repeat to match any of several values. Dimension list |
filter.format | array of string | Normalized ad format. Repeat to match any of several values. Allowed values: banner, interstitial, native, rewarded. Dimension list |
filter.placement_id | array of string | The network's placement or ad-unit ID. Repeat to match any of several values. Dimension list |
filter.placement_reference_id | array of string | Liftoff placement reference ID. Repeat to match any of several values. Dimension list |
filter.placement_name | array of string | The network's placement or ad-unit name. Repeat to match any of several values. Dimension list |
filter.ad_size | array of string | Liftoff ad size, such as 320x50. Repeat to match any of several values. Dimension list |
filter.incentivized | array of string | Liftoff rewarded traffic flag. Allowed values: true, false. Dimension list |
filter.original_platform | array of string | Platform exactly as the network reported it. Repeat to match any of several values. Dimension list |
filter.original_format | array of string | Ad format exactly as the network reported it. Repeat to match any of several values. Dimension list |
filter.source_timezone | array of string | Time zone that defines the network's report day. Allowed values: UTC, America/Los_Angeles. Dimension list |
filter.currency | array of string | Revenue currency reported by the network, such as USD. Repeat to match any of several values. Dimension list |
is_null | array of string | Select rows whose dimension value is unknown. Repeat for several dimensions. Cannot be combined with a filter.<dimension> for the same dimension. Allowed values: day, provider, provider_account_id, provider_account_secondary_id, account_name, property_id, app_id, app_name, package, store_id, platform, country, format, placement_id, placement_reference_id, placement_name, ad_size, incentivized, original_platform, original_format, source_timezone, currency. Dimension list |
sort_by | string | Sort by aggregate revenue. Without it, rows sort ascending by every grouping column, unknown values last. Allowed values: revenue. |
sort_order | string | Revenue sort direction; requires sort_by. Unknown revenue sorts last in both directions, and grouping columns break ties. Allowed values: desc, asc. |
limit | integer | Rows per page. |
offset | integer | Rows to skip before the page starts. |
snapshot | string | The page.snapshot value from the first page. A later page returns 409 if the query or the report data changed; restart from offset=0. |
format | string | Response format. CSV returns page and coverage metadata in X-Network-* headers. Allowed values: json, csv. |
Responses
{
"query_time": "<string>",
"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": "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"
}
],
"coverage": [
{
"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
}
],
"page": {
"limit": 123,
"offset": 123,
"has_more": true,
"snapshot": "50d858e0985ecc7f60418aaf0cc5ab587f42c2570a884095a9e8ccacd0f6545c"
}
}200 One page of report rows with per-source coverage. A page past the last row is empty.
| Field | Type | Description |
|---|---|---|
query_timerequired | string<date-time> | When the page was read. |
fieldsrequired | array of string | Row columns in output order, dimensions first, then metrics. |
rowsrequired | array of object | Report rows keyed by fields. Unknown values are null. |
coveragerequired | array of object | One entry per network account, scope, and requested day. |
pagerequired | object | Pagination state. |
400 Invalid parameter, date, dimension, or filter.
| Field | Type | Description |
|---|---|---|
errorrequired | string |
401 Unauthorized.
| Field | Type | Description |
|---|---|---|
errorrequired | string |
403 Missing the `reports:read` permission or network reporting access.
| Field | Type | Description |
|---|---|---|
errorrequired | string |
409 The snapshot no longer matches; restart from `offset=0` without `snapshot`.
| Field | Type | Description |
|---|---|---|
errorrequired | string |
422 A report limit was exceeded. Narrow the dates or filters, or reduce `limit` or `offset`.
| Field | Type | Description |
|---|---|---|
errorrequired | string |
500 Internal server error.
| Field | Type | Description |
|---|---|---|
errorrequired | string |
503 Report data is being updated. Retry after the `Retry-After` delay.
| Field | Type | Description |
|---|---|---|
errorrequired | string |
504 The report did not finish in time. Retry after the `Retry-After` delay, or narrow the dates or filters.
| Field | Type | Description |
|---|---|---|
errorrequired | string |
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. 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, such as day,provider,app_id,country. |
filter.<dimension> | No | — | An exact value of any dimension. 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. |
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. |
format | string or null | banner, interstitial, native, or rewarded. See 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 isnull. You cannot combineis_nullandfilter.<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
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"{
"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. |
page | limit, offset, has_more, and snapshot. See 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 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.
#!/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))
doneCSV response
format=csv returns the same rows as text/csv. The header row matches fields. Page and coverage metadata move to response headers.
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"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
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
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
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
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
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
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
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
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
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
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.
Break down by day, network, app, and country
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
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; there is no metric selector.
Export CSV
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.csvSelect rows with an unknown dimension
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
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
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
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
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 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.