Skip to main content
Returns the bandit-ranked eligible offers for one user, up to limit, so you can render them in your own UI and cycle through them. Each offer carries its own impressionUid and a branded short clickUrl.
Calling this endpoint is not the impression. When you actually display an offer, confirm it with POST /offers/impressions/{impressionUid}/delivered. For the scenario walkthrough (render, confirm, route the tap), see the Rewarded Actions guide; to fetch your full curated inventory instead of a ranked selection, see POST /offers/catalog.

Authentication

Pass your publishable key in the X-API-Key header (pk_live_* for production, pk_test_* for development). Multi-app projects also send X-Platform: api (requires an API-platform app in the project; without one the response is 401 Invalid API key). A test key returns the demo catalog rather than your inventory, and records no impressions, clicks, or conversions from it. The full model, including the API platform app type, is in the overview’s Authentication section.

Request

Structure

Field Reference

Attributes you stored earlier fill the gaps. If you have sent this userId a set with POST /users/attributes, any attribute this request omits is filled from it, and a stored age narrows the offers a user under 18 may be shown. Anything in this request’s own attributes always wins. countryCode and language stay required here regardless: the request is rejected before the stored set is read, so storing them does not make them optional.
API-platform apps receive every eligible offer by default. An app created with platform API gets all entitled, geo-eligible offers with no per-platform trimming, which is ideal when you serve a mixed-platform audience from your own server. To narrow a single request to one surface, send that end user’s device platform in attributes.platform.

Response

Structure

Field Reference

Beyond impressionUid and campaignId, the response carries no internal identifiers. Creative ids and request ids are not returned; they are still computed server-side for analytics.

Image fields

imageUrl is a wide ~2.4:1 banner, not 16:9. A 16:9 slot will crop or letterbox it.

Example

Status codes

Retry guidance

  • Retries are not deduplicated server-side. Every /offers/feed call generates fresh short links and analytics rows, so only fetch a feed once per placement you intend to render.
  • Use exponential backoff with jitter (for example 200ms, 1s, 5s, max 3 retries) for transient failures (429 / 503 / network).
  • After exhausting retries, render nothing. The end-user experience should never degrade because of an Encore outage.