API Reference · Details
Offer Instance API
Look up as many as 100 Offer cards your application has already served, by offer_instance_id, using a Live API Key from your server. Get when each card was served, its placement, the Offer's current details and status, and the original tracked link while it can still be opened.
Operations
/v1/offers/instancesBearer requiredContent-TypestringThe request body is JSON.
example: application/jsonJSON payload. Unknown fields are rejected.
offer_instance_idsarray1 to 100 offer_instance_id UUIDs returned by Query. Duplicates are de-duplicated, keeping the first occurrence.
example: ["019dd208-27d2-7673-b16f-6897fa120304", "019dd208-27d2-7673-b16f-6897fa120305"]items: stringHTTP 200 uses {code, message, data, extra}; data.instances holds one item per de-duplicated requested ID, in request order. found items carry served_at, placement_id and offer; not_found items carry only offer_instance_id and status.
codestringSUCCESS on HTTP 200; otherwise the error code.
example: SUCCESSmessagestringEmpty on success; a readable explanation on failure.
objectContains instances on success; an empty object on failure.
2 nested fieldsinstancesarrayExactly one item per de-duplicated requested ID, in request order.
objectNested object container for the fields below.
5 nested fieldsoffer_instance_idstringThe requested offer_instance_id, in canonical lowercase UUID form.
format: uuidstatusstringfound when the card was served to your application; otherwise not_found, which contains only offer_instance_id and status.
Allowed valuesfoundnot_foundserved_atstringWhen the card was served, as RFC 3339 UTC with second precision.
format: date-timeplacement_idstringThe placement the instance was served through; null when the serve record itself carries no placement (legacy or static Offer Wall serves). A Query sent without a placement_id is served anonymously and returns not_found for your key, not a null placement_id.
nullable: trueobjectThe Offer's current details and status, in the OfferInfo API shape, plus the echoed offer_instance_id. Contains only offer_id, offer_instance_id and offer_info.status when no details are available, including real-time remote Partner Offers.
9 nested fieldsoffer_idstringThe canonical Offer ID of the served card.
format: uuidoffer_instance_idstringEcho of the requested offer_instance_id, so the object can be rendered like a Query result.
format: uuidobjectQuery public Offer information when details are returned; otherwise only status.
1 nested fieldstatusstringCurrent AgentOffer Protocol lifecycle status, identical to OfferInfo for the same offer_id. Only active is servable; real-time remote Partner Offers report expired.
Allowed valuesactivepausedpendingrejectedexpiredversionstringOffer document version, not the HTTP route version.
Allowed values3.0entityobjectPublic entity information using Query's entity mapping.
goalsarrayPublic goals using Query's CPA/CPS pricing semantics.
objectThe original tracked link from Query, returned only while it can be opened right now (active Offer, placement still active and yours, tracked short link, served target an absolute http or https URL). Omitted otherwise, never null; omitted when the served target is not an http(s) URL, such as a custom-scheme app deep link.
2 nested fieldstypestringTechnical form of the action destination.
example: open_urlobjectAction parameters.
1 nested fieldurlstringThe tracked aon.link short link served with the card. Open it unchanged; you may append sub_id attribution parameters.
format: uricontent_languagestringActual known language of the selected content; omitted when unknown.
materialarrayAvailable public creative assets using Query's material validation and limits.
extraobjectEmpty object for this route.
The body is not JSON, offer_instance_ids is missing or empty, contains more than 100 IDs or a value that is not a UUID, or the body has unknown fields.
- Correct the request body before retrying. Split larger lookups into batches of at most 100 IDs.
Curated guidance, not contract schema
Missing, invalid or revoked API Key, or an ordinary aon_test_ Test Key.
- Use a valid application-owned Live API Key.
Curated guidance, not contract schema
A Live API Key was sent together with the X-AON-Test: true header.
- Remove the X-AON-Test header when calling with a Live API Key.
Curated guidance, not contract schema
The application cannot currently serve requests.
- Restore the application state before retrying.
Curated guidance, not contract schema
The developer account is suspended.
- Restore the account state before retrying.
Curated guidance, not contract schema
The shared Public Test Sandbox Key is restricted to its Query route and cannot look up instances.
- Use your application's Live API Key.
Curated guidance, not contract schema
The route only accepts POST. GET and other methods are rejected.
- Send the lookup as POST with a JSON body.
Curated guidance, not contract schema
Served cards or Offer details are temporarily unreadable. No partial success is returned.
- Retry later.
Curated guidance, not contract schema
Behavior, compatibility, and source notes
Look up as many as 100 Offer cards your application has already served, by the offer_instance_id returned with each Query result, using an application-owned Live API Key. Each found card returns when it was served, its placement, the Offer's current details and status, and the original tracked link only while that link can still be opened.
- Use this when an Offer detail page is opened outside the Query response that produced the card, for example from a deep link, a bookmark, a share or a reload. Look the card up by its offer_instance_id instead of re-running Query, and never replace action with the Offer's landing page: that link carries no attribution.
- Send Authorization: Bearer <LIVE_API_KEY> from your server only. Never call this route from a browser or mobile client, because that exposes your Live API Key. Live and Live Limited applications can call this route; paused or suspended applications cannot. Offer Query and MCP search continue to use placement identity.
- Send Content-Type: application/json with a body of {"offer_instance_ids": [...]}: 1 to 100 offer_instance_id UUIDs returned by Query. Duplicate IDs are de-duplicated, keeping the first occurrence. Unknown body fields are rejected. Send offer_instance_id values only: a canonical Offer ID returns not_found and an aonlink is rejected as not a UUID. Use the OfferInfo API to read by Offer ID.
- data.instances contains exactly one item per de-duplicated requested ID, in request order. Each item is either found or not_found; there is no 404 or partial-failure response.
- An instance belongs to the application whose identity served it. not_found means the ID is unknown, was served to another application, was served by a test or sandbox request, or is a legacy record without a resolvable Offer. A not_found item contains only offer_instance_id and status.
- An instance belongs to the application of the identity that served it. Where anonymous mode is available, a Query sent without a placement_id is served anonymously through the AON default placement, so its instances belong to the AON default application and return not_found for your key; where it is not available, such a Query is rejected with 401. Always send your placement_id on Query if you need to look cards up later.
- A found item returns served_at (when the card was served, UTC, second precision), placement_id (the placement the instance was served through, or null when the serve record itself carries no placement, such as legacy or static Offer Wall serves) and offer. offer always echoes offer_id and offer_instance_id.
- offer uses the OfferInfo API projection of the Offer's current stored details and offer_info.status, so the status of a found card always matches what OfferInfo returns for the same offer_id. Treat any status other than active as not servable. When the Offer has no stored details, offer contains only offer_id, offer_instance_id and offer_info.status.
- Real-time remote Partner Offers are not stored in the AON catalog. Their cards are found, but report offer_info.status expired, the same as OfferInfo, and include no details and no action.
- action is the original tracked link from the Query response and is returned only while that link can be opened right now: the Offer is active, the card's placement is still active and belongs to your application (or the card was served without a placement), the card has a tracked short link, and the target frozen at serve time is an absolute http or https URL. Otherwise action is omitted; it is never null or a replacement link. Offers whose served target is not an http(s) URL, such as a custom-scheme app deep link, do not return action; a deep-link Offer whose target is an https universal link can.
- Clicks on a returned action are attributed to the original card. This route is read-only: it creates no offer instance, impression, click or link, does not call Partners, and consumes no serving quota. There is no application-level rate limit.
Implementation checklist · 5 items
- Create a Live API Key in Developer Portal under your application's API & Webhooks → API Keys, and call this route from your server only. The application must be Live or Live Limited.
- Always send your placement_id on Query. Where anonymous mode is available, a Query without one is served anonymously under the AON default application and its instances return not_found to your key; otherwise it is rejected with 401.
- POST a JSON body with offer_instance_ids: 1 to 100 offer_instance_id UUIDs returned by Query. Duplicates are de-duplicated.
- Render found items like a Query result. Show action only when it is returned, and never replace it with the Offer's landing page.
- Treat offer_info.status other than active as not servable. Real-time remote Partner Offers report expired with no details or action.