Reporting API
Use an application-owned Live Key to read batched offer performance. New integrations should use Reporting v2: its earnings projection is always USD and comes from the USD value frozen when each Settlement was created.
Reporting v2 is the default
POST /v2/developer/reports/offers/batch is the current integration path.
Reporting v1 remains available for existing per-currency consumers; it has
not been changed in place or removed.
Request
Set your Live Key in the local shell. AON Docs never asks you to paste the key into a browser form and does not execute this request for you.
export AON_API_KEY="<application-live-key>"
curl --request POST \
"https://api.aon.pro/v2/developer/reports/offers/batch" \
--header "Authorization: Bearer $AON_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"items": [
{
"placement_id": "plc_7c2e0dR9kL4mN8pQ",
"offer_id": "7d45b8ac-27bb-4d8f-9d32-68a9ac01a012"
},
{
"offer_link": "https://aon.link/static/st_8pK4vQ7mN2xR5cT9wY3zD6hJ1sL0bF4"
}
],
"from": "2026-08-01T00:00:00Z",
"to": "2026-08-10T00:00:00Z"
}'from is inclusive and to is exclusive. Both timestamps must be UTC Z
whole-hour boundaries. A batch accepts direct placement_id + offer_id
pairs and AON /static/{code} links. A merchant URL is not a report identity.
v2 earnings states
Each successful item reports its own completeness independently from siblings and from the batch coverage window.
| State | estimated_earnings | Meaning |
|---|---|---|
complete | One USD entry, including USD 0.00 for a known zero | Every included Settlement has a frozen USD snapshot |
unavailable + missing_usd_snapshot | null | At least one included Settlement lacks its frozen USD snapshot; AON does not return a partial USD subtotal |
unavailable + coverage reason | null | The item has no reliable included data; clicks and conversions are also null rather than invented as zero |
{
"code": "SUCCESS",
"message": "",
"data": {
"results": [
{
"input_index": 0,
"offer_link": null,
"status": "success",
"data": {
"placement_id": "plc_7c2e0dR9kL4mN8pQ",
"offer_id": "7d45b8ac-27bb-4d8f-9d32-68a9ac01a012",
"clicks": 201,
"conversions": 31,
"earnings_state": "complete",
"earnings_unavailable_reason": null,
"estimated_earnings": [{ "amount": "131.15", "currency": "USD" }]
}
}
],
"succeeded_count": 1,
"failed_count": 0,
"coverage": {
"data_state": "partial",
"unavailable_reason": null,
"requested_window": {
"from": "2026-08-01T00:00:00Z",
"to": "2026-08-10T00:00:00Z"
},
"included_window": {
"from": "2026-08-02T00:00:00Z",
"to": "2026-08-10T00:00:00Z"
},
"data_available_until": "2026-08-10T00:00:00Z",
"reliable_since": "2026-08-02T00:00:00Z",
"data_may_restate": true
}
},
"extra": { "timezone": "UTC" }
}The service never performs request-time FX conversion. Coverage describes the
reliable time window; earnings_state describes USD completeness inside that
window. One invalid, unauthorized, duplicate, or incomplete item does not
erase valid siblings.
Limits and errors
- Authentication is scoped to an application-owned Live Key. The shared Public Test Pair cannot call Reporting.
- A request accepts at most 10,000 items and 30 days, with a 2 MiB request and 16 MiB response limit.
- Item errors preserve input order and do not reveal whether an inaccessible pair exists outside the caller's application.
- Request-level authentication, validation, size, rate-limit, or dependency
errors use the standard
{code,message,data,extra}envelope.
Migrating from v1
POST /v1/developer/reports/offers/batch remains the compatibility endpoint.
It groups earnings by original Settlement currency and does not expose
earnings_state. To migrate:
- Change only the endpoint from
/v1/to/v2/; request fields and limits stay the same. - Treat
estimated_earningsas either one USD entry ornull. - Branch on
earnings_stateandearnings_unavailable_reason; do not convertnullto zero. - Keep coverage handling separate from earnings completeness.
Do not sum v1 currency buckets as if they were USD. Keep v1 in place until your consumer has adopted the v2 states and verified its own output.