POST /v1/ingest— stream in player events (sessions, purchases, currency, progression).POST /v1/offers/import— upload your offer catalog once, and re-upload when it changes.POST /v1/recommend— ask Qyren which offer to show a specific player right now.
/v1/ingest.
The three-call flow
1. Send events
Batch up to 100 events per call. Don’t wait for a batch to fill — flush every few seconds or when you reach ~50 events, whichever comes first. Full event schema: Events. Minimum events you should log for Qyren to work:session_startandsession_endpurchase(withrevenue_usd,offer_id,transaction_id,store,is_first_purchase)currency_earnedandcurrency_spent(withbalance_after— this is how we track inflation)offer_impressionevery time an offer is shown on screenoffer_clickwhen a player taps/clicks it
offer_impression, we cannot compute conversion rate and recommendations will be weaker.
2. Import your offer catalog
Upload every offer you sell, once. Re-upload whenever the catalog changes (new offer, price change, removal).game_id is resolved from your API key. external_id is your stable ID and acts as the upsert key on re-import.
See Offers for the full offer schema.
3. Ask for a recommendation
When a player hits a trigger (opens the shop, beats a boss, levels up), ask Qyren what to show:offer_impression events — this is how Qyren learns what works.
Latency expectations
/v1/ingest: under 50ms at p95. Safe to call inline with gameplay./v1/recommend: under 150ms at p95. Still fine for shop-open triggers. If your trigger is inside a tight loop (e.g. end-of-battle popup), pre-fetch at session start and cache for a few minutes.
Graceful degradation
If Qyren is ever unreachable, your game should fall back to a default offer list. Never block gameplay waiting on Qyren. A 500ms timeout on/v1/recommend is reasonable.
