Free round kampanyaları
API · Operatör → Boss HubOyunculara ücretsiz dönüş veren kampanya oluşturur. Kampanyanın durumunu GET /v1/freerounds/{id} ile sorgular, kullanılmamış dönüşleri DELETE /v1/freerounds/{id} ile iptal edersiniz. Oyuncuları /v1/freerounds/{id}/players ile tek tek eklersiniz, listeler ve iptal edersiniz. promo modülü ve freerounds.write kapsamı gerekir; bu kapsam varsayılan olarak açık değildir, Boss Hub’dan isteyin.
Başlıklar
| Başlık | Açıklama |
|---|---|
| X-Operator-Id | Operatör kimliğiniz |
| X-Timestamp | Unix saniye. ±30 sn dışı reddedilir |
| X-Signature | hex(HMAC_SHA256(secret, ts + "." + METHOD + "." + path?query + "." + body)) |
| X-Request-Id | POST ve DELETE’te zorunlu. Aynı kimlik ve gövde ilk yanıtı döndürür; çift kampanya oluşmaz |
| X-Api-Key | İsteğe bağlı. Birden çok anahtarınız varsa doğru secret’ı seçer |
{
"id": "cmp_mrd_aralik",
"name": "Aralık Hoş Geldin",
"site_id": "site_mrd01",
"template_id": null,
"games": ["sultans-ember"],
"spins": 20,
"bet_value": 0.20,
"currency": "USD",
"players": ["u_88213"],
"starts_at": "2026-12-01T00:00:00Z",
"valid_days": 7,
"reference": "crm-dec-welcome-88213",
"status": "scheduled",
"spins_used": 0,
"won_total": 0.00
}{
"code": "VALIDATION_ERROR",
"message": "The submitted data is invalid.",
"request_id": "req_01HF3R1B",
"details": { "reason": "BET_OVER_LIMIT", "max_usd": "5.00" }
}Kampanya durumu
GET /v1/freerounds/{id} kampanyanın güncel hâlini döndürür. POST ve GET yanıtları, istek gövdesindeki alanlara ek olarak şunları içerir:
| Alan | Tür | Açıklama |
|---|---|---|
| id | string | Kampanya kimliği. Callback’lerde campaign_id olarak geçer. |
| status | string | draft, scheduled, active, finished, cancelled. |
| spins_used | integer | Kullanılan dönüş sayısı. |
| won_total | decimal(18,2) | Toplam kazanç, kampanya para biriminde (iptal edilen haklar dahil). |
| approval_id | string | Yalnız bütçe uyarısını aşan kampanyada: draft döner, Sahip onayı bu kimlikle izlenir. |
| already_processed | boolean | Yalnız aynı reference ve aynı içerikle gelen tekrar isteğinin 200 yanıtında, true. |
Tekrar güvenliği
reference gönderirseniz zaman aşımında aynı isteği güvenle yeniden deneyebilirsiniz. Aynı referans ve aynı içerik ilk kampanyayı 200 ve already_processed: true ile döndürür; kampanya bu arada iptal edilmiş olsa da aynı kampanya gelir; approval_id onay hâlâ bekliyorsa döner. İçerik karşılaştırılırken oyun ve oyuncu sırası, tekrarlanan oyuncu ve tutar yazımı (0.5, 0.50) fark etmez. Aynı referans farklı içerikle gelirse 409 REFERENCE_CONFLICT döner, kampanya açılmaz. Referans Test ve Canlı için ayrıdır. Kampanya yazılmadan önce doğrulama hatası alan istek referansı tüketmez. Tek istisna: hiçbir oyuncuya hak verilemezse (PLAYERS_REQUIRED) kampanya draft olarak kalır (reference verdiyseniz onunla); aynı referansla tekrar o taslağı döndürür, referanssız her deneme yeni taslak bırakır. Taslağı DELETE ile iptal edin. X-Request-Id kaydı süreyle silinir, reference silinmez.
{
"id": "cmp_mrd_aralik",
"name": "Aralık Hoş Geldin",
"site_id": "site_mrd01",
"template_id": null,
"games": ["sultans-ember"],
"spins": 20,
"bet_value": 0.20,
"currency": "USD",
"players": ["u_88213"],
"starts_at": "2026-12-01T00:00:00Z",
"valid_days": 7,
"reference": "crm-dec-welcome-88213",
"status": "scheduled",
"spins_used": 0,
"won_total": 0.00,
"already_processed": true
}{
"code": "REFERENCE_CONFLICT",
"message": "A campaign with different content was already created with this reference.",
"request_id": "req_01HF3R1C",
"details": { "reference": "crm-dec-welcome-88213" }
}Kampanya iptali
DELETE /v1/freerounds/{id} kampanyayı ve bekleyen veya etkin bütün hakları iptal eder, 204 döndürür, gövde yoktur. Oyuncunun açık turu varsa o turun kazancı yine ödenir. campaign.finished webhook’u status: cancelled ile gider. Kampanya bu sırada başladıysa 409 CAMPAIGN_CHANGED: tekrar deneyin.
DELETE /v1/freerounds/cmp_mrd_aralik HTTP/1.1 Host: staging.example.com X-Operator-Id: op_meridyen X-Timestamp: 1762344300 X-Signature: 1fb2d7…6c9a X-Request-Id: req_01HF3R2C
Oyuncu hakları
Kampanyadaki her oyuncunun kendi hakkı ve durumu vardır. Yalnız active hak dönüş verir; diğer durumdaki hakla gelen free round bahsi Boss Hub’da reddedilir, cüzdanınıza gelmez.
| Durum | Anlam |
|---|---|
| pending | Kampanya taslak veya planlı; başlayınca active olur |
| active | Dönüş kullanılabilir |
| used | Dönüşler bitti ve oyuncunun açık free round turu kalmadı |
| expired | Hakkın expires_at’i veya kampanyanın bitişi geçti |
| cancelled | Oyuncunun hakkı veya kampanyanın tamamı iptal edildi |
| failed | Hak yazıldı ama sağlayıcı oyuncuyu reddetti; neden fail_reason’da |
- Kampanya başına oyuncuya tek hak. Aynı istekte tekrarlanan oyuncu tek hak olur. Oyuncuyu yeniden eklemek hata vermez, exists ve mevcut hakkın durumunu döndürür; cancelled, expired veya used hak da yenilenmez. Oyuncuya yeniden dönüş vermek için yeni kampanya açın.
- Oluştururken atlanan oyuncular: para birimi kampanyanın oyunlarında olmayan veya bahis değeri kendi para biriminde geçersiz kalan oyuncu kampanyaya yazılmaz ve yanıttaki players dizisinde yer almaz; neden döndürülmez. Yanıttaki players’ı isteğinizle karşılaştırın ya da oyuncu başına sonucu görmek için kampanyayı oluşturup oyuncuları POST /v1/freerounds/{id}/players ile ekleyin.
Oyuncu ekleme
POST /v1/freerounds/{id}/players taslak, planlı veya açık kampanyaya oyuncu ekler; istek başına en çok 100 oyuncu. Yanıt 200 ve oyuncu başına sonuçtur: added yeni hak, exists oyuncunun bu kampanyada zaten hakkı var (hak çoğalmaz, status mevcut hakkın durumu), failed hak verilmedi. failed nedenleri: CURRENCY_NOT_SUPPORTED oyuncunun para birimi kampanyanın hiçbir oyununda yok veya kur yok, BET_INVALID dönüş değeri oyuncunun para birimine çevrilince sıfıra iniyor, BET_NOT_OFFERED çevrilen değer sağlayıcının bahis değerlerinden biri değil, PROVIDER_REJECTED: … sağlayıcı oyuncuyu reddetti. Üst alanlar: added bu istekte yazılan yeni hak, failed bu istekte başarısız olan, total kampanyadaki geçerli hak sayısı (iptal ve başarısızlar hariç). Kaydı olan oyuncunun hakkı kendi para birimindedir; henüz kaydı olmayan oyuncununki kampanya para biriminde. Aynı X-Request-Id ilk yanıtı döndürür.
POST /v1/freerounds/cmp_mrd_aralik/players HTTP/1.1
Host: staging.example.com
Content-Type: application/json
X-Operator-Id: op_meridyen
X-Timestamp: 1762344600
X-Signature: 7d41a0…b3e2
X-Request-Id: req_01HF3R3D
{
"players": ["u_90412", "u_88213", "u_77120"],
"expires_at": "2026-12-05T23:59:59Z"
}{
"added": 1,
"failed": 1,
"total": 2,
"items": [
{ "player_id": "u_90412", "result": "added", "status": "pending", "reason": null },
{ "player_id": "u_88213", "result": "exists", "status": "pending", "reason": null },
{ "player_id": "u_77120", "result": "failed", "status": null, "reason": "CURRENCY_NOT_SUPPORTED" }
]
}Oyuncu listesi
GET /v1/freerounds/{id}/players kampanyanın haklarını döndürür. Sonraki sayfa için yanıttaki next_cursor değerini cursor olarak gönderin; null ise liste bitti.
| Alan | Tür | Açıklama |
|---|---|---|
| player_id | string | Operatör tarafındaki oyuncu kimliği. |
| status | string | Hakkın durumu, yukarıdaki tablo. |
| currency | ISO 4217 | Hakkın para birimi: oyuncunun para birimi, kaydı yoksa kampanyanınki. |
| spins_left | integer | Kalan dönüş. |
| won_total | decimal(18,2) | Bu haktan toplam kazanç, currency biriminde. |
| expires_at | date-time | Hakkın bitişi: kendi tarihi yoksa kampanya bitişi. |
| cancelled_at | date-time | null | İptal anı. |
| fail_reason | string | null | Yalnız failed: sağlayıcının nedeni. |
GET /v1/freerounds/cmp_mrd_hosgeldin/players?player_id=u_88213 HTTP/1.1 Host: staging.example.com X-Operator-Id: op_meridyen X-Timestamp: 1762344700 X-Signature: 0c5e19…94af
{
"items": [
{
"player_id": "u_88213",
"status": "active",
"currency": "USD",
"spins_left": 38,
"won_total": 38.40,
"expires_at": "2026-11-30T23:59:59.999Z",
"cancelled_at": null,
"fail_reason": null
}
],
"next_cursor": null
}Tek oyuncu iptali
DELETE /v1/freerounds/{id}/players/{player_id} oyuncunun kullanılmamış dönüşlerini iptal eder ve 204 döndürür. Açık turun kazancı yine ödenir. Yalnız pending ve active hak iptal edilir; diğerleri 409 GRANT_CLOSED alır, details.status hakkın durumudur. Hakkı sağlayıcının yürüttüğü kampanyada iptal sağlayıcıya da iletilir; sağlayıcı tek oyuncu iptalini desteklemiyorsa 409 PROVIDER_CANCEL_UNSUPPORTED döner, kampanyanın tamamını iptal edebilirsiniz.
DELETE /v1/freerounds/cmp_mrd_hosgeldin/players/u_88213 HTTP/1.1 Host: staging.example.com X-Operator-Id: op_meridyen X-Timestamp: 1762344800 X-Signature: 5a9d33…e170 X-Request-Id: req_01HF3R4E
Cüzdana etkisi
- Free round bahsi bet ile gelir: is_freeround: true, campaign_id dolu, amount: 0. Bakiyeyi düşmeyin. Dönüş değeri freeround_bet_value alanındadır.
- Kazanç normal win ile gelir, bakiyeye ekleyin.
- Sağlayıcının Boss Hub kampanyası dışında kendi yürüttüğü free round’u da gelir: bahiste ve kazançta is_freeround: true, campaign_id: null; freeround_bet_value ve freeround_grant_id gelmeyebilir; kazanç bahissiz bir turda gelebilir ve Boss Hub kampanya kazanç tavanı uygulamaz. Bkz. Bahissiz kazanç.
- Bahis OK olunca dönüş hakkı azalır, rollback OK olunca geri gelir. Rollback nakit iade etmez.
- İptal edilen veya süresi dolan hakla bahis size gelmez: Boss Hub reddeder.
Hata kodları
| Kod | HTTP | Anlam |
|---|---|---|
| INVALID_SIGNATURE | 401 | İmza doğrulanamadı |
| TIMESTAMP_SKEW | 401 | X-Timestamp ±30 sn dışında |
| IP_NOT_ALLOWED | 403 | IP izin listesinde değil |
| SCOPE_MISSING | 403 | freerounds.write kapsamı yok |
| SCOPE_DENIED | 403 | Kampanya anahtarınızın kapsamı dışında; site_id sitelerinizden biri değil veya site anahtarınızın sitesi değil |
| MODULE_DISABLED | 403 | promo modülü kapalı |
| NOT_FOUND | 404 | Kampanya yok veya diğer ortamda; oyuncunun bu kampanyada hakkı yok (tek oyuncu iptali) |
| REQUEST_ID_CONFLICT | 409 | Aynı X-Request-Id, farklı gövde |
| REQUEST_IN_PROGRESS | 409 | Aynı X-Request-Id hâlâ işleniyor |
| REFERENCE_CONFLICT | 409 | Aynı reference, farklı içerik |
| CAMPAIGN_CLOSED | 409 | Kampanya iptali, oyuncu ekleme ve tek oyuncu iptali: kampanya bitmiş veya zaten iptal edilmiş |
| CAMPAIGN_CHANGED | 409 | Kampanya bu sırada durum değiştirdi (başladı veya açıldı); tekrar deneyin |
| GRANT_CLOSED | 409 | Tek oyuncu iptali: hak pending veya active değil |
| BUDGET_WARNING | 409 | Oyuncu ekleme: tahmini maliyet bütçe uyarısını aşıyor |
| FREEROUND_ADD_PLAYERS_UNSUPPORTED | 409 | Oyuncu ekleme: sağlayıcı açık kampanyaya oyuncu eklemiyor |
| PROVIDER_CANCEL_UNSUPPORTED | 409 | Tek oyuncu iptali: sağlayıcı desteklemiyor |
| VALIDATION_ERROR | 422 | Eksik veya geçersiz alan (details.fields) ya da kural ihlali (details.reason: SPINS_OVER_LIMIT, BET_INVALID, BET_OVER_LIMIT, BET_NOT_OFFERED, GAME_NOT_ELIGIBLE, TEMPLATE_INVALID, CAMPAIGN_IN_PAST, PLAYERS_REQUIRED, EXPIRES_INVALID) |
| INVALID_CURSOR | 422 | Oyuncu listesi: cursor önceki yanıttan gelmiyor |
| CURRENCY_NOT_SUPPORTED | 422 | Para birimi için kur yok veya bir oyun desteklemiyor (details.game) |
| RATE_LIMITED | 429 | Hız limiti aşıldı |