SportApi
API belgeleri · sürüm 1.2.0

Oranlar, bahisler ve kuponlar — API teknik dokümantasyonu

Bu dosya, Kupon Hesaplama Sistemi SportAPI'ye bağlanmak için minimum düzeyde bağımsız bir komut dosyası içerir. Ayrıntılar ve nadir durumlar tüm belgelerde mevcuttur.

Temel akış http
POST /api/partner/login
POST /api/partner/coupons/place
GET  /api/partner/coupons/calculated?time=10

1. Yöneticiden almanız gerekenler

  • temel URL API’si;
  • müşteri hesabı kullanıcı adı ve şifresi;
  • geri aramayı kullanırken - işlevi ve callback_secret gizli ifadesini etkinleştirin.

Örneklerde koşullu bir adres kullanılır:

BASE_URL="https://coupon-api.example.com"

Üretimde HTTPS kullanın. Tüm tarihler milisaniye cinsinden Unix zaman damgası olarak iletilir ve parasal değerler sabit hassasiyet olmadan ondalık sayılar olarak iletilir.

2. API yanıt biçimi

Başarı:

{
  "code": 1,
  "body": {},
  "error_code": null,
  "error_message": null,
  "date": 1784970000000,
  "time_ms": 5,
  "path": "/api/partner/example"
}

İş hatası genellikle HTTP 200 ile de birlikte gelir:

{
  "code": 0,
  "body": null,
  "error_code": 1002,
  "error_message": "Not all params",
  "date": 1784970000000,
  "time_ms": 5,
  "path": "/api/partner/example"
}

Her zaman HTTP kodunu, ardından code’yi ve ardından error_code’yi kontrol edin. error_message metnini yazılım anahtarı olarak kullanmayın.

3. Yetkilendirme

POST /api/partner/login
Content-Type: application/json
{
  "username": "partner-demo",
  "password": "strong-password"
}

login alanı uyumlu bir takma ad olan username olarak desteklenir.

Başarılı yanıt:

{
  "code": 1,
  "body": {
    "token": "<jwt-token>",
    "user_id": 17,
    "username": "partner-demo"
  },
  "error_code": null,
  "error_message": null
}

Tüm korumalı isteklerde şunu iletin:

Authorization: Bearer <jwt-token>

Temel giriş hataları:

KodSebep
1002Kullanıcı adı veya şifre gönderilmedi.
1003Bilinmeyen giriş veya yanlış şifre.
1004Müşteri hesabı devre dışı bırakıldı.
1006Erişim tarihi sona erdi.
1007Müşteri bakiyesi sıfır veya negatif.

Bu hatalar HTTP 200, code = 0’den döndürülür. Korumalı bir yöntemin HTTP 401’si, JWT’nin eksik, geçersiz, süresinin dolmuş veya iptal edilmiş olduğu anlamına gelir; Tekrar oturum açın. HTTP 403, uygunsuz rol veya erişimin reddedildiği anlamına gelir.

4. Hız göstergesi

Seçilen her sonuç, spor serisinden hazır bir hat olarak iletilir:

line_type#game_id#group_id#type_id#rate#coefficient[#player_id]

Örnekler:

line#737779544#1#1#0#1.85
live#738917381|119|5869|0.5#3.6#149439538
  • line_type: line veya live;
  • rate: toplam/handikap parametresi veya 0;
  • player_id: isteğe bağlı oynatıcı kimliği;
  • sınırlayıcılar # ve | desteklenir.

İşaretçiyi manuel olarak toplamayın veya düzeltmeyin - satırdan elde edilen değeri değiştirmeden iletin.

5. Kupon oluştur

POST /api/partner/coupons/place
Authorization: Bearer <jwt-token>
Content-Type: application/json
{
  "list_bets": [
    "line#737779544#1#1#0#1.85"
  ],
  "amount": 10,
  "currency": "USD",
  "callback_url": "https://partner.example.com/api/coupon-result",
  "lang": "en",
  "mode": "reject",
  "mode_type": null,
  "multi": false
}
AlanZorunluAmaç
list_betsEvetBir veya daha fazla işaretçi.
amountEvetOluşturulan bir kuponun pozitif miktarı.
currencyHayırSanal para birimi de dahil olmak üzere herhangi bir dize tanımı.
callback_urlHayırURL geri araması; geri arama olmadan gönderemezsiniz, null’yi, boş bir dizeyi veya site etki alanını iletebilirsiniz.
langHayırDesteklenen yaklaşık 50 dilden biri için iki harfli kod. İsimlerin dili yaratılışta sabittir.
modeHayırreject veya accept; varsayılan reject.
mode_typeaccept içinKatsayı değişiminin izin verilen yönü.
multiHayırBir genel kupon veya bireysel tekli; varsayılan false.

Oranlar

AyarlarDavranış
mode = rejectKatsayı değiştiğinde oluşturmayı reddet.
mode = accept, mode_type = 1Yalnızca promosyonları kabul edin.
mode = accept, mode_type = 2Yalnızca rütbe düşürmeyi kabul edin.
mode = accept, mode_type = 3Herhangi bir değişikliği kabul edin.

Sıradan, ekspres ve multi

TalepSonuçMüşteri bakiyesinin silinmesi
Tek sonuçSıradan biramount
Çoklu sonuçlar, multi = falseBir ekspresamount
Çoklu sonuçlar, multi = trueHer sonuç için ayrı singleamount × oluşturulan kupon sayısı

Bir ekspres tren en fazla 15 etkinlik içerebilir. Ana maç, yarılar, periyotlar, kornerler, fauller ve diğer ilgili alt olaylar dahil olmak üzere aynı maça birden fazla bahis birleştiremezsiniz. Bu kombinasyon 506 değerini döndürür.

6. Kupon ve teklif oluşturma onayı

events_data içindeki kupon ve kabul edilen bahis verileriyle tam başarılı yanıt:

{
  "code": 1,
  "body": {
    "coupons": [
      {
        "coupon_code": "000000000272",
        "amount": 10,
        "win": 18.5,
        "potential_win": 18.5,
        "real_win": null,
        "coef": 1.85,
        "original_coef": 1.85,
        "calculate_coef": null,
        "has_return": false,
        "date": 1784970000000,
        "status": 0,
        "asian": false,
        "calculate_date": null,
        "coupon_type": 1,
        "events_count": 1,
        "events_data": [
          {
            "id": 912,
            "game_id": 737779544,
            "main_game_id": 737779544,
            "is_sub_game": false,
            "parent_game_id": null,
            "sub_game_key": null,
            "raw_pointer": "line#737779544#1#1#0#1.85",
            "line_type": "line",
            "is_live": false,
            "bet_group_id": 1,
            "bet_group_name": "Match result",
            "bet_id": 1,
            "bet_name": "First team to win",
            "sport_id": 1,
            "sport_name": "Football",
            "tournament_id": 10001,
            "tournament": "National League",
            "event_date": 1784971800000,
            "status": 0,
            "opp1": "Team A",
            "opp2": "Team B",
            "coef": 1.85,
            "calc_coef": null,
            "bet_score": "line#737779544#1#1#0#1.85",
            "calculate_date": null,
            "calculate_score": null,
            "settlement_reason_code": null,
            "settlement_reason": null,
            "placement_score_full": null,
            "placement_score_periods": null,
            "calculation_score_full": null,
            "calculation_score_periods": null,
            "timer": null,
            "dop_name": null,
            "rate": "0",
            "sgame_id": null,
            "game_num": null,
            "stat_id": null,
            "team1_id": 101,
            "team2_id": 102,
            "opp_icon1": 101,
            "opp_icon2": 102
          }
        ]
      }
    ]
  },
  "error_code": null,
  "error_message": null,
  "date": 1784970000015,
  "time_ms": 45,
  "path": "/api/partner/coupons/place"
}

Kupon alanları

Her öğe body.coupons[], oluşturulan ayrı bir kupondur.

AlanTürAnlamı
coupon_codestringHerkese açık 12 haneli kupon kodu. Baştaki sıfırları kaybetmemek için dize olarak saklayın.
amountnumberOluşturma sırasında aktarılan kupon tutarı.
winnumberGeçerli görüntülenen kazanç miktarı.
potential_winnumberNihai ödemeden önce olası kazançlar.
real_winnumber/nullHesaplama sonrasında gerçekleşen ödeme tutarı; hesaplamadan önce - null.
coefnumberMevcut veya nihai kupon oranı.
original_coefnumberKuponun oluşturulduğu andaki toplam katsayısı.
calculate_coefnumber/nullNihai hesaplanan katsayı; hesaplamadan önce - null.
has_returnbooleantrue, eğer kupon iade statüsünde bir bahis içeriyorsa.
dateintegerKupon oluşturma tarihi, milisaniye cinsinden Unix zaman damgası.
statusintegerMevcut kupon durumu. Değerler “Kupon ve Teklif Durumu” bölümünde açıklanmıştır.
asianbooleanYarı kazanç veya kayıplar da dahil olmak üzere Asya yerleşiminin varlığına dair işaret.
calculate_dateinteger/nullMilisaniye cinsinden kupon hesaplama tarihi; hesaplamadan önce - null.
coupon_typeintegerKupon türü: 1 - sıradan, 2 - ekspres.
events_countintegerKuponun içindeki bahis sayısı.
events_dataarrayKuponun içerdiği tüm bahis çeşitleri.

Teklif alanları

events_data[]’nin her bir öğesi, kupon içinde kabul edilen belirli bir bahsi açıklar.

AlanTürAnlamı
idinteger/nullKabul edilen bahsin dahili kimliği. Kupon içindeki oranı aramak için coupon_code ile birlikte kullanılır.
game_idintegerBahsin konulduğu etkinliğin veya alt etkinliğin kimliği.
main_game_idinteger/nullEtkinliğin veya alt etkinliğin ait olduğu ana eşleşmenin kimliği.
is_sub_gamebooleantrue, eğer bahis devre, periyot, set, korner veya başka bir alt olayla ilgiliyse.
parent_game_idinteger/nullVarsa, yakın ana etkinliğin kimliği.
sub_game_keystring/nullBir alt olayın veya dönemin teknik anahtarı.
raw_pointerstringAPI tarafından kabul edilen orijinal ücret göstergesi.
line_typestringHat türü: line - maç öncesi, live - gerçek zamanlı etkinlik.
is_livebooleantrue, bahis canlı bir çizgide oluşturulduysa.
bet_group_idintegerBahis grubunun veya pazarın kimliği.
bet_group_namestring/nullBahis grubunun yerelleştirilmiş adı.
bet_idintegerBahis grubu içindeki seçilen seçimin kimliği.
bet_namestring/nullSeçilen seçimin yerelleştirilmiş tam adı.
sport_idinteger/nullSpor kimliği.
sport_namestring/nullSporun yerelleştirilmiş adı.
tournament_idinteger/nullTurnuva kimliği.
tournamentstring/nullTurnuvanın yerelleştirilmiş adı.
event_dateinteger/nullEtkinlik başlangıç tarihi, milisaniye cinsinden Unix zaman damgası.
statusintegerGüncel oran hesaplama durumu. Kupon durumuyla karıştırılmamalıdır.
opp1string/nullİlk takımın veya katılımcının adı.
opp2string/nullİkinci takımın veya katılımcının adı.
coefnumberBahsin kabul edildiği bahis oranları.
calc_coefnumber/nullHesaplanan bahis çarpanı; hesaplamadan önce - null.
bet_scorestringMaç skoru yerine bahis göstergesini içeren eski API uyumlu alan.
calculate_dateinteger/nullMilisaniye cinsinden oran hesaplama tarihi; hesaplamadan önce - null.
calculate_scorestring/nullBahis hesaplamak için kullanılan hesap.
settlement_reason_codestring/nullÖdeme veya iade nedeninin kararlı makine kodu; hesaplamadan önce - null.
settlement_reasonstring/nullÖdeme veya iade nedeninin açıklayıcı metni; hesaplamadan önce - null.
placement_score_fullstring/nullVarsa, bahisin oluşturulduğu andaki toplam etkinlik puanı.
placement_score_periodsstring/nullVarsa, bahisin oluşturulduğu andaki döneme göre puan.
calculation_score_fullstring/nullBahis sonuçlandırıldığında etkinliğin toplam puanı.
calculation_score_periodsstring/nullOran hesaplaması sırasında döneme göre hesap.
timerinteger/nullVarsa, veri kaydetme sırasındaki olay zamanlayıcısı.
dop_namestring/nullAlt etkinliğin adı: yarı, periyot, set, vuruş vb.
ratestringSonuç parametresi, örneğin toplamın veya handikapın değeri; parametresi olmayan bir sonuç için - "0".
sgame_idstring/nullAlt olay yabancı anahtarı.
game_numinteger/nullKaynak tarafından sağlanmışsa oyun numarası.
stat_idstring/nullHarici istatistiksel olay kimliği.
team1_idinteger/nullİlk takımın veya katılımcının kimliği.
team2_idinteger/nullİkinci takımın veya katılımcının kimliği.
opp_icon1integer/nullİlk komut simgesinin uyumlu kimliği; team1_id ile eşleşir.
opp_icon2integer/nullUyumlu ikinci takım simgesi kimliği; team2_id ile eşleşir.

null değeri henüz hesaplanmamış veya mevcut olmayan veriler için normaldir. Bunu otomatik olarak 0 veya boş dizeyle değiştirmeyin.

Kuponun yalnızca code = 1 ve body.coupons’de nesnelerin varlığı durumunda kabul edildiğini düşünün. Bundan önce sepet bir ön seçimdir: seçim kaybolabilir, bloke edilebilir veya oranlar değişebilir.

Başarıdan sonra:

  1. yalnızca ilkini değil, tüm body.coupons nesnelerini kaydedin;
  2. coupon_code’yi baştaki sıfırlarla bir dize olarak saklayın;
  3. gerekli verileri events_data’den kaydedin;
  4. kuponu son kullanıcıyla eşleştirin;
  5. kullanıcının mali işlemini ortağın sistemine kaydedin.

Tanımlayıcılar:

AlanAmaç
coupon_codeHerkese açık kupon kodu.
events_data[].idKuponun içinde kabul edilen spesifik bahsin kimliği.
geri arama events_data[].uuidBir dize olarak iletilen aynı teklif kimliği.
batchIdKupon veya ücretin değil, geri arama paketi sürümünün kimliği.

currency tam modelde ve geri aramada döndürülmez. Para birimi gerekiyorsa, değeri oluşturma isteğinden kaydedin.

7. Oluşturma hataları

KodSebepEylem
10Talep organı yok.Talebi düzeltin.
11Geçersiz işaretçi.Geçerli işaretçiyi satırdan alın.
12Geçersiz amount.Pozitif bir sayı iletin.
501Katsayı değişti.Yeni değeri gösterin veya mode’yi değiştirin.
502Sonuç yok.Sepetteki teklifi kaldırın/güncelleyin.
503Sonuç engellendi.Geçici olarak kullanılamama durumunu bildirin.
504Sonuç doğrulama hatası.Kuponu kabul edilmiş saymayın; daha sonra tekrarlayın.
506Ekspres bahislerde bir maç.Bir sonuç bırakın veya ayrı single’lar kullanın.
507Yetersiz müşteri bakiyesi.Bakiyenizi doldurun veya toplam tutarı azaltın.
1002Geçersiz parametre seti.Doğru parametreler.
10000Dahili hata.Hatayı kaydedin ve yeniden denemeden önce sonucu kontrol edin.

501504 için yeni API, body.changes[]’deki sorunlu oranları döndürür. Alan change_type: 1 - katsayı arttı, 2 - azaldı, null - yön geçerli değil.

Zaman aşımından sonra POST /coupons/place’yi körü körüne yeniden denemeyin: ilk istek kabul edilmiş olabilir ve yeniden denemek bir kopya oluşturacaktır.

8. Kupon alma

OperasyonUç noktaSonuç
Bir kuponGET /api/partner/coupons/get?coupon_code={code}Kupon body’de.
AktifGET /api/partner/coupons/activebody[]’deki dizi.
Son hesaplamalarGET /api/partner/coupons/calculated?time=10body[]’deki dizi; maksimum 120 dakika.
Kod/döneme görePOST /api/partner/coupons/resultsbody.coupons’deki dizi.
Müşteri bakiyesiGET /api/partner/balancebody.balance.

Kodları kullanarak 100’e kadar değeri aktarabilirsiniz:

{
  "coupon_ids": ["000000000272", "000000000273"]
}

Veya oluşturma süresini 24 saatten fazla geçmeyin:

{
  "start_date": 1784880000000,
  "end_date": 1784966400000
}

coupon_ids ve tarihleri ​​aynı sorguda birleştirmeyin. results, oluşturma zamanına göre filtreler ve calculated, son ödeme zamanına göre filtreler.

9. Kupon ve bahis durumları

Kupon durumları:

KodAnlamıFinal
0Aktif veya kısmen yerleşik.Hayır
2Kazandım.Evet
4Kayıp.Evet
8Tamamen iade edildi.Evet
15Yeniden hesaplama için geri döndü; yeni bir sonuç bekliyoruz.Hayır

Teklif durumları:

KodAnlamıcalc_coef
0Hesaplanmadı.null
1Kazanıyorum.Orijinal katsayı
2Kaybetmek.0
3Geri dön.1
4Yeniden hesaplama bekleniyor.null
21Kazançların yarısı.(coef + 1) / 2
22Yarı kayıp.0.5
23İtin.1

Son kullanıcıya mali tahakkuk sağlamak için hazır real_win’yi kullanın. potential_win’yi kullanmayın ve ödemeyi kendiniz yeniden hesaplamayın. Hesaplamadan önce, real_win, calculate_coef, calc_coef ve calculate_date, 0’ye değil, null’ye eşittir.

15 kuponunun ilk durumunda, eğer önceki sonuç zaten finansal olarak işlenmişse, iş ortağı bir kez daha amount’yi son kullanıcıdan borçlandırır, yeni bir nihai durum bekler ve yeni bir real_win tahsil eder. Operasyonları yeniden işlemeye karşı koruyun.

10. Hesaplama nedeni

Tam modeldeki ve geri aramadaki her bahis şunları içerir:

AlanAmaç
settlement_reason_codeKararlı ödeme/geri ödeme nedeni kodu.
settlement_reasonAçıklayıcı kaynak metin.

Hesaplamadan önce her iki alan da null’ye eşittir. Yerelleştirilmiş bir bildirim için aşağıdaki gibi bir kod kullanın:

  • MATCH_POSTPONED - maç ertelendi;
  • MATCH_CANCELLED - maç iptal edildi;
  • MARKET_PUSH - piyasa kurallarına göre iade.

Kod bilinmiyorsa kaydedin ve boş olmayan settlement_reason’yi yedek metin olarak kullanın. Ödemeyi nedene göre hesaplamayın; durumları ve real_win’yi kullanın.

Bu alanlar, halihazırda gerçekleştirilmiş olan hesaplamayı veya getiriyi açıklar ve eşleşme durumunun ayrı bir gerçek zamanlı akışı değildir.

11. Geri arama

Geri arama isteğe bağlıdır. Bir ortak yalnızca oylama yoluyla çalışabilir. Geri arama için yöneticinin işlevi etkinleştirmesi ve callback_secret oluşturması gerekir; URL, oluşturulan her kuponda gönderilir.

İş ortağı, geri arama URL’sini bağımsız olarak belirler. Üretimde https:// kullanılmalıdır; test ortamında http://’ye izin verilir.

Sistem şunu gönderir:

POST {callback_url}
Content-Type: application/json
X-Coupon-Signature: sha256=<hex_hmac_sha256>

Kısa yük:

{
  "event": "coupons.settled",
  "batchId": "d407e986f3a64d9d36a77bf532322ef8",
  "couponCount": 1,
  "coupons": [
    {
      "coupon_code": "000000000272",
      "realWin": 18.5,
      "calculate_coefficient": 1.85,
      "status": 2,
      "calculate_date": 1784973600000,
      "events_data": [
        {
          "uuid": "912",
          "status": 1,
          "calculate_coefficient": 1.85,
          "calculate_date": 1784973600000,
          "calculate_score": "2:1",
          "settlement_reason_code": "REMOTE_WIN",
          "settlement_reason": "Win",
          "timer": 0
        }
      ]
    }
  ]
}

Zorunlu kurallar:

  1. JSON ayrıştırmadan önce gövdenin tam kaynak baytlarından sha256=<hex(HMAC-SHA256(raw_body, callback_secret))>’yi hesaplayın ve imzaları güvenli bir şekilde karşılaştırın;
  2. tüm öğeleri coupons işleyin, paket en fazla 100 kupon içerebilir;
  3. batchId’yi benzersiz bir dizinle saklayın;
  4. tekrarlanan batchId, silme veya tahakkukları tekrarlamamalıdır;
  5. bir coupon_code, aşamalı hesaplama ve yeniden hesaplama sırasında farklı batchId ile birlikte gelebilir;
  6. HTTP 200’yi yalnızca paketin tamamı güvenli bir şekilde saklandıktan sonra döndürün.

Minimum başarılı yanıt boş bir HTTP 200’dir. Gelişmiş:

{
  "success": true,
  "processed": 1
}

processed, couponCount’ye eşit olmalıdır. 201, 202 ve 204 yanıtları başarılı sayılmaz.

Tekrarlar yalnızca zaman aşımı, aktarım hatası veya HTTP durumunda gerçekleştirilir. 500, 502, 503, 504: hemen, ardından 1, 5, 15 ve 60 dakika sonra - en fazla beş gönderim. success: false veya kısmi processed ile HTTP 200 üzerinde otomatik yeniden deneme yoktur.

12. Rezerv oylaması

Geri aramada bile sonuçları periyodik olarak kontrol edin:

GET /api/partner/coupons/calculated?time=10

120 dakikadan uzun bir aradan sonra, kaydedilen coupon_ids veya 24 saate kadar oluşturma süreleri üzerinden POST /api/partner/coupons/results’yi kullanın. Aynı serveti tekrar almak, finansal işlemleri tekrarlamamalıdır.

13. Güvenlik ve depolama

  • kullanıcı adını, şifreyi, JWT ve callback_secret’yi yalnızca sunucuda saklayın;
  • URL’de JWT’yi iletmeyin ve belirtecin tamamını günlüklere yazmayın;
  • para için ondalık türü kullanın;
  • coupon_code’yi bir dize olarak saklayın;
  • amount’yi, gerekli teklif verilerini ve kullanılıyorsa currency’yi kaydedin;
  • kupon ve teklif durumları arasında ayrım yapın;
  • bilinmeyen alanları ve neden kodlarını hatasız kabul edin;
  • Tüm son kullanıcı finansal işlemlerini bağımsız hale getirin.

14. Eski API ve Cashout

Eski rotalar desteklenmeye devam ediyor ancak yeni entegrasyonların /api/partner/** kullanması gerekiyor. Eski yanıtlar ve hatalar farklı formatlara sahiptir. Mevcut bir istemciyi güncellemek için tek bir dosya kullanın “Eski API’den geçiş”.

Cashout geliştirme aşamasındadır, tam olarak test edilmemiştir ve üretim için önerilmez.

15. Son kontrol listesi

  • BASE_URL, kullanıcı adı ve şifre alındı.
  • JWT bir Taşıyıcı jetonu olarak iletilir.
  • İşaretçiler değişiklik yapılmadan satırdan alınır.
  • Sepet ancak code = 1 sonrasında kabul edilen bir kupon olarak kaydedilir.
  • İşlendi multi, kısıtlamaları ve hataları ifade edin 501507.
  • Müşteri bakiyesinin otomatik olarak silinmesi dikkate alınmıştır.
  • Tüm coupon_code ve teklif kimlikleri kaydedilir.
  • Son ödeme real_win’den alınır.
  • Geri arama, kaynak baytlarına göre kontrol edilir ve batchId kullanılarak tekilleştirilir.
  • Yedek yoklama yapılandırıldı.
  • Kullanıcı bakiyesi, müşteri bakiyesi SportAPI’den ayrıdır.

Ayrıntılı belgeler API’ye genel bakış ile başlar. Uç nokta haritasının tamamı manuel içindedir.

Daha fazla belgeye veya entegrasyon desteğine mi ihtiyacınız var?