Programmatic broadsheet · Set in real time
adon3
The Real-Time Bidding Exchange
Integration Docs
Supply side · XML feed · OpenRTB 2.6 / 2.5

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.

HTTP
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.

FieldTypeReq.Notes
sspIdstringyesYour SSP id. Tells us whose figures to return.
authstringyesYour 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

FieldTypeReq.Notes
sspIdstringyesYour SSP id.
authstringyesYour reporting auth key.
date_fromdateyesFirst day in the range, inclusive. YYYY-MM-DD, UTC.
date_todateyesLast day in the range, inclusive. YYYY-MM-DD, UTC.
dimsstringnoComma-separated grouping dimensions. Default date.
subidstringnoRestrict 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.

ValueGroups by
dateCalendar day, UTC
subidThe 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

Shell
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

JSON
{
  "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

FieldTypeNotes
sspIdstringEchoes the SSP id the figures belong to.
rangeobjectEchoes date_from and date_to.
dimsarrayEchoes the dimensions applied, in the order they group.
curstringCurrency of revenue. USD at launch.
totalsobjectRange totals. Present whatever dims you asked for.
rowsarrayOne entry per group. Empty when dims is empty.
datestringPresent when dims includes date.
subidstringPresent when dims includes subid.
requestsintCalls we received on the feed endpoint.
fillsintCalls answered 200 with at least one ad.
impressionsintImpression notices received.
clicksintClicks recorded on the tracker.
billable_clicksintClicks that survived filtering. This is what pays.
revenuestringNet 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

CodeStatusMeaning
UNAUTHORIZED401auth is missing, unknown or revoked.
FORBIDDEN403auth does not belong to that sspId.
MISSING_PARAM400sspId, auth, date_from or date_to is absent.
INVALID_DATE400A date is not YYYY-MM-DD, or date_from is after date_to.
RANGE_TOO_LONG400The range exceeds 92 days.
UNKNOWN_DIM400dims contains something other than date or subid.
RATE_LIMITED429Above 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.

sellers.json · schain enforced · OpenRTB 2.5 / 2.6 / 3.0 · XML
Printed on the Open Exchange
—  Integration Docs  —