XML SSP Report API
Aggregated delivery figures for the XML feed, pulled over HTTP or HTTPS. Reporting runs on its own host so a slow report never competes with delivery.
GET /reports/ssp?sspId={sspId}&auth={authKey} HTTP/1.1
Host: reports.xml.adon3.com
Accept: application/json
Authentication
Both credentials go in the query string. There is no header to set and no token exchange to perform.
| Field | Type | Req. | Notes |
|---|---|---|---|
sspId | string | yes | Your SSP id. Tells us whose figures to return. |
auth | string | yes | Your reporting auth key, issued with the SSP id. |
Both are issued by the adon3 integration office. The auth key is read only, so a leaked key cannot spend money or change anything, but it does expose your figures. Ask for a rotation if it escapes.
A missing or unknown auth returns 401. An auth that is valid but does not
belong to the sspId you asked for returns 403.
Query parameters
| Field | Type | Req. | Notes |
|---|---|---|---|
sspId | string | yes | Your SSP id. |
auth | string | yes | Your reporting auth key. |
date_from | date | yes | First day in the range, inclusive. YYYY-MM-DD, UTC. |
date_to | date | yes | Last day in the range, inclusive. YYYY-MM-DD, UTC. |
dims | string | no | Comma-separated grouping dimensions. Default date. |
subid | string | no | Restrict to one subid. Filters, and does not group. |
date_from and date_to are the only way to set a range. There is no relative
shortcut such as last_7_days, deliberately, because relative ranges drift
across the UTC boundary and produce figures nobody can reconcile later.
Ranges are capped at 92 days. Beyond that the call returns RANGE_TOO_LONG, so
page through longer periods a month at a time.
Dimensions
dims is the only grouping control, and it accepts two values.
| Value | Groups by |
|---|---|
date | Calendar day, UTC |
subid | The subid you sent on the request |
Give it one or both, in either order. dims=date,subid returns a row per subid
per day. Anything else returns UNKNOWN_DIM.
Passing dims= empty is not the same as omitting it. Empty means no grouping,
and returns totals with an empty rows array.
Requesting
curl -sS -G 'https://reports.xml.adon3.com/reports/ssp' \
--data-urlencode 'sspId=ssp-90ab12cd' \
--data-urlencode 'auth=ak_4d1f77c0e93a' \
--data-urlencode 'date_from=2026-07-01' \
--data-urlencode 'date_to=2026-07-07' \
--data-urlencode 'dims=date,subid'
Response
{
"sspId": "ssp-90ab12cd",
"range": { "date_from": "2026-07-01", "date_to": "2026-07-07" },
"dims": ["date", "subid"],
"cur": "USD",
"totals": {
"requests": 512400,
"fills": 184320,
"impressions": 181044,
"clicks": 9210,
"billable_clicks": 8940,
"revenue": "126.94800"
},
"rows": [
{
"date": "2026-07-01",
"subid": "zone-4471",
"requests": 42000,
"fills": 15100,
"impressions": 14880,
"clicks": 760,
"billable_clicks": 740,
"revenue": "10.50800"
},
{
"date": "2026-07-01",
"subid": "zone-4472",
"requests": 31200,
"fills": 10420,
"impressions": 10310,
"clicks": 498,
"billable_clicks": 471,
"revenue": "6.68200"
}
]
}
totals covers the whole range regardless of grouping, so it does not change
when you change dims. That makes it the right figure to reconcile against, and
a quick check that your own aggregation is summing what you think it is.
Field reference
| Field | Type | Notes |
|---|---|---|
sspId | string | Echoes the SSP id the figures belong to. |
range | object | Echoes date_from and date_to. |
dims | array | Echoes the dimensions applied, in the order they group. |
cur | string | Currency of revenue. USD at launch. |
totals | object | Range totals. Present whatever dims you asked for. |
rows | array | One entry per group. Empty when dims is empty. |
date | string | Present when dims includes date. |
subid | string | Present when dims includes subid. |
requests | int | Calls we received on the feed endpoint. |
fills | int | Calls answered 200 with at least one ad. |
impressions | int | Impression notices received. |
clicks | int | Clicks recorded on the tracker. |
billable_clicks | int | Clicks that survived filtering. This is what pays. |
revenue | string | Net revenue in cur, to five decimal places. |
Counts are integers and revenue is a decimal string. Parse it as a decimal
rather than a float, because five places of CPC revenue summed over a month will
not survive binary floating point intact.
Freshness and settlement
Figures appear within a few minutes and stay provisional for 48 hours while click
filtering completes. After that they are final and match your invoice. Pulling
the same range a week later and seeing slightly lower billable_clicks than you
saw on the day is the filter working, not a discrepancy.
Raise discrepancy claims within 30 days, as set out in the charter.
Errors
| Code | Status | Meaning |
|---|---|---|
UNAUTHORIZED | 401 | auth is missing, unknown or revoked. |
FORBIDDEN | 403 | auth does not belong to that sspId. |
MISSING_PARAM | 400 | sspId, auth, date_from or date_to is absent. |
INVALID_DATE | 400 | A date is not YYYY-MM-DD, or date_from is after date_to. |
RANGE_TOO_LONG | 400 | The range exceeds 92 days. |
UNKNOWN_DIM | 400 | dims contains something other than date or subid. |
RATE_LIMITED | 429 | Above 60 report calls per hour. |
Reporting is rate limited at 60 calls an hour per SSP id. Pull once and cache, since polling the same range every minute achieves nothing that a five-minute schedule does not.