POST /v1/offers/import, then re-upload whenever the catalog changes — new offer added, price tweaked, contents adjusted.
Endpoint
Request body
game_id is resolved from your API key — you don’t pass it in the body. The offers array can hold up to 500 offers per request. If your catalog is larger, page through it in multiple requests.
Per-offer schema
Required fields
Optional fields
Eligibility rules (level gates, segment targeting, time windows) are not set at import time today. They are managed in the dashboard or via the offer-catalog endpoints once the offer exists.
Upsert behavior
external_id is the upsert key. Re-importing the same external_id updates the offer in place — name, price, contents, active flag. Recommendations served after the import use the new values.
If you re-import a partial catalog (say, just the 10 offers you changed today), the offers you didn’t include are left alone, not deleted. This makes incremental updates safe.
Offers imported without an external_id cannot be updated through this endpoint — each call creates a new row. Always set external_id if you intend to keep the catalog in sync from your source of truth.
Pausing offers
To remove an offer from rotation, re-import the sameexternal_id with "is_active": false. History is retained and the offer can be re-activated by importing again with "is_active": true.
If you need to fully delete an offer (legal/compliance), email [email protected].
Worked example
Here’s a 3-offer import for a fantasy MMO catalog. One starter bundle, one timed weekend deal, one segment-targeted whale offer:Response
imported counts new rows, updated counts upserts against an existing external_id, and failed is an array of {index, reason} for any offers that could not be persisted.
Response codes
Tips
- Re-import on every catalog change — even small ones. Stale offers in Qyren mean stale recommendations in your shop.
- Always set
external_id. It’s the only way to update an offer after the first import. Don’t recycle IDs across different offers — historical performance attaches to the ID. - Encode
contents_jsonas a string. It’s a JSON document inside a JSON string. Quote it correctly in your client code.

