Skip to main content
Before Qyren can recommend offers, it needs to know what offers exist. You upload your full catalog once via POST /v1/offers/import, then re-upload whenever the catalog changes — new offer added, price tweaked, contents adjusted.

Endpoint

Request body

The 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 same external_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_json as a string. It’s a JSON document inside a JSON string. Quote it correctly in your client code.