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.
Send attributes.platform whenever you know the end user’s device. Your Android players then stop seeing offers that only run on iPhone (and the other way round), and each impression is recorded under the right platform. If you can’t tell the device for a request, omit it: for an app created with platform API, the feed then draws from all entitled, geo-eligible offers with no per-platform trimming, and you curate them yourself.

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 200 ms, 1 s, 5 s, 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.