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.
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_secretgizli 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ı:
| Kod | Sebep |
|---|---|
1002 | Kullanıcı adı veya şifre gönderilmedi. |
1003 | Bilinmeyen giriş veya yanlış şifre. |
1004 | Müşteri hesabı devre dışı bırakıldı. |
1006 | Erişim tarihi sona erdi. |
1007 | Müş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:lineveyalive;rate: toplam/handikap parametresi veya0;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
}
| Alan | Zorunlu | Amaç |
|---|---|---|
list_bets | Evet | Bir veya daha fazla işaretçi. |
amount | Evet | Oluşturulan bir kuponun pozitif miktarı. |
currency | Hayır | Sanal para birimi de dahil olmak üzere herhangi bir dize tanımı. |
callback_url | Hayır | URL geri araması; geri arama olmadan gönderemezsiniz, null’yi, boş bir dizeyi veya site etki alanını iletebilirsiniz. |
lang | Hayır | Desteklenen yaklaşık 50 dilden biri için iki harfli kod. İsimlerin dili yaratılışta sabittir. |
mode | Hayır | reject veya accept; varsayılan reject. |
mode_type | accept için | Katsayı değişiminin izin verilen yönü. |
multi | Hayır | Bir genel kupon veya bireysel tekli; varsayılan false. |
Oranlar
| Ayarlar | Davranış |
|---|---|
mode = reject | Katsayı değiştiğinde oluşturmayı reddet. |
mode = accept, mode_type = 1 | Yalnızca promosyonları kabul edin. |
mode = accept, mode_type = 2 | Yalnızca rütbe düşürmeyi kabul edin. |
mode = accept, mode_type = 3 | Herhangi bir değişikliği kabul edin. |
Sıradan, ekspres ve multi
| Talep | Sonuç | Müşteri bakiyesinin silinmesi |
|---|---|---|
| Tek sonuç | Sıradan bir | amount |
Çoklu sonuçlar, multi = false | Bir ekspres | amount |
Çoklu sonuçlar, multi = true | Her sonuç için ayrı single | amount × 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.
| Alan | Tür | Anlamı |
|---|---|---|
coupon_code | string | Herkese açık 12 haneli kupon kodu. Baştaki sıfırları kaybetmemek için dize olarak saklayın. |
amount | number | Oluşturma sırasında aktarılan kupon tutarı. |
win | number | Geçerli görüntülenen kazanç miktarı. |
potential_win | number | Nihai ödemeden önce olası kazançlar. |
real_win | number/null | Hesaplama sonrasında gerçekleşen ödeme tutarı; hesaplamadan önce - null. |
coef | number | Mevcut veya nihai kupon oranı. |
original_coef | number | Kuponun oluşturulduğu andaki toplam katsayısı. |
calculate_coef | number/null | Nihai hesaplanan katsayı; hesaplamadan önce - null. |
has_return | boolean | true, eğer kupon iade statüsünde bir bahis içeriyorsa. |
date | integer | Kupon oluşturma tarihi, milisaniye cinsinden Unix zaman damgası. |
status | integer | Mevcut kupon durumu. Değerler “Kupon ve Teklif Durumu” bölümünde açıklanmıştır. |
asian | boolean | Yarı kazanç veya kayıplar da dahil olmak üzere Asya yerleşiminin varlığına dair işaret. |
calculate_date | integer/null | Milisaniye cinsinden kupon hesaplama tarihi; hesaplamadan önce - null. |
coupon_type | integer | Kupon türü: 1 - sıradan, 2 - ekspres. |
events_count | integer | Kuponun içindeki bahis sayısı. |
events_data | array | Kuponun 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.
| Alan | Tür | Anlamı |
|---|---|---|
id | integer/null | Kabul edilen bahsin dahili kimliği. Kupon içindeki oranı aramak için coupon_code ile birlikte kullanılır. |
game_id | integer | Bahsin konulduğu etkinliğin veya alt etkinliğin kimliği. |
main_game_id | integer/null | Etkinliğin veya alt etkinliğin ait olduğu ana eşleşmenin kimliği. |
is_sub_game | boolean | true, eğer bahis devre, periyot, set, korner veya başka bir alt olayla ilgiliyse. |
parent_game_id | integer/null | Varsa, yakın ana etkinliğin kimliği. |
sub_game_key | string/null | Bir alt olayın veya dönemin teknik anahtarı. |
raw_pointer | string | API tarafından kabul edilen orijinal ücret göstergesi. |
line_type | string | Hat türü: line - maç öncesi, live - gerçek zamanlı etkinlik. |
is_live | boolean | true, bahis canlı bir çizgide oluşturulduysa. |
bet_group_id | integer | Bahis grubunun veya pazarın kimliği. |
bet_group_name | string/null | Bahis grubunun yerelleştirilmiş adı. |
bet_id | integer | Bahis grubu içindeki seçilen seçimin kimliği. |
bet_name | string/null | Seçilen seçimin yerelleştirilmiş tam adı. |
sport_id | integer/null | Spor kimliği. |
sport_name | string/null | Sporun yerelleştirilmiş adı. |
tournament_id | integer/null | Turnuva kimliği. |
tournament | string/null | Turnuvanın yerelleştirilmiş adı. |
event_date | integer/null | Etkinlik başlangıç tarihi, milisaniye cinsinden Unix zaman damgası. |
status | integer | Güncel oran hesaplama durumu. Kupon durumuyla karıştırılmamalıdır. |
opp1 | string/null | İlk takımın veya katılımcının adı. |
opp2 | string/null | İkinci takımın veya katılımcının adı. |
coef | number | Bahsin kabul edildiği bahis oranları. |
calc_coef | number/null | Hesaplanan bahis çarpanı; hesaplamadan önce - null. |
bet_score | string | Maç skoru yerine bahis göstergesini içeren eski API uyumlu alan. |
calculate_date | integer/null | Milisaniye cinsinden oran hesaplama tarihi; hesaplamadan önce - null. |
calculate_score | string/null | Bahis hesaplamak için kullanılan hesap. |
settlement_reason_code | string/null | Ödeme veya iade nedeninin kararlı makine kodu; hesaplamadan önce - null. |
settlement_reason | string/null | Ödeme veya iade nedeninin açıklayıcı metni; hesaplamadan önce - null. |
placement_score_full | string/null | Varsa, bahisin oluşturulduğu andaki toplam etkinlik puanı. |
placement_score_periods | string/null | Varsa, bahisin oluşturulduğu andaki döneme göre puan. |
calculation_score_full | string/null | Bahis sonuçlandırıldığında etkinliğin toplam puanı. |
calculation_score_periods | string/null | Oran hesaplaması sırasında döneme göre hesap. |
timer | integer/null | Varsa, veri kaydetme sırasındaki olay zamanlayıcısı. |
dop_name | string/null | Alt etkinliğin adı: yarı, periyot, set, vuruş vb. |
rate | string | Sonuç parametresi, örneğin toplamın veya handikapın değeri; parametresi olmayan bir sonuç için - "0". |
sgame_id | string/null | Alt olay yabancı anahtarı. |
game_num | integer/null | Kaynak tarafından sağlanmışsa oyun numarası. |
stat_id | string/null | Harici istatistiksel olay kimliği. |
team1_id | integer/null | İlk takımın veya katılımcının kimliği. |
team2_id | integer/null | İkinci takımın veya katılımcının kimliği. |
opp_icon1 | integer/null | İlk komut simgesinin uyumlu kimliği; team1_id ile eşleşir. |
opp_icon2 | integer/null | Uyumlu 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:
- yalnızca ilkini değil, tüm
body.couponsnesnelerini kaydedin; coupon_code’yi baştaki sıfırlarla bir dize olarak saklayın;- gerekli verileri
events_data’den kaydedin; - kuponu son kullanıcıyla eşleştirin;
- kullanıcının mali işlemini ortağın sistemine kaydedin.
Tanımlayıcılar:
| Alan | Amaç |
|---|---|
coupon_code | Herkese açık kupon kodu. |
events_data[].id | Kuponun içinde kabul edilen spesifik bahsin kimliği. |
geri arama events_data[].uuid | Bir dize olarak iletilen aynı teklif kimliği. |
batchId | Kupon 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ı
| Kod | Sebep | Eylem |
|---|---|---|
10 | Talep organı yok. | Talebi düzeltin. |
11 | Geçersiz işaretçi. | Geçerli işaretçiyi satırdan alın. |
12 | Geçersiz amount. | Pozitif bir sayı iletin. |
501 | Katsayı değişti. | Yeni değeri gösterin veya mode’yi değiştirin. |
502 | Sonuç yok. | Sepetteki teklifi kaldırın/güncelleyin. |
503 | Sonuç engellendi. | Geçici olarak kullanılamama durumunu bildirin. |
504 | Sonuç doğrulama hatası. | Kuponu kabul edilmiş saymayın; daha sonra tekrarlayın. |
506 | Ekspres bahislerde bir maç. | Bir sonuç bırakın veya ayrı single’lar kullanın. |
507 | Yetersiz müşteri bakiyesi. | Bakiyenizi doldurun veya toplam tutarı azaltın. |
1002 | Geçersiz parametre seti. | Doğru parametreler. |
10000 | Dahili hata. | Hatayı kaydedin ve yeniden denemeden önce sonucu kontrol edin. |
501–504 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
| Operasyon | Uç nokta | Sonuç |
|---|---|---|
| Bir kupon | GET /api/partner/coupons/get?coupon_code={code} | Kupon body’de. |
| Aktif | GET /api/partner/coupons/active | body[]’deki dizi. |
| Son hesaplamalar | GET /api/partner/coupons/calculated?time=10 | body[]’deki dizi; maksimum 120 dakika. |
| Kod/döneme göre | POST /api/partner/coupons/results | body.coupons’deki dizi. |
| Müşteri bakiyesi | GET /api/partner/balance | body.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ı:
| Kod | Anlamı | Final |
|---|---|---|
0 | Aktif veya kısmen yerleşik. | Hayır |
2 | Kazandım. | Evet |
4 | Kayıp. | Evet |
8 | Tamamen iade edildi. | Evet |
15 | Yeniden hesaplama için geri döndü; yeni bir sonuç bekliyoruz. | Hayır |
Teklif durumları:
| Kod | Anlamı | calc_coef |
|---|---|---|
0 | Hesaplanmadı. | null |
1 | Kazanıyorum. | Orijinal katsayı |
2 | Kaybetmek. | 0 |
3 | Geri dön. | 1 |
4 | Yeniden hesaplama bekleniyor. | null |
21 | Kazançların yarısı. | (coef + 1) / 2 |
22 | Yarı 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:
| Alan | Amaç |
|---|---|
settlement_reason_code | Kararlı ödeme/geri ödeme nedeni kodu. |
settlement_reason | Açı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:
- 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; - tüm öğeleri
couponsişleyin, paket en fazla 100 kupon içerebilir; batchId’yi benzersiz bir dizinle saklayın;- tekrarlanan
batchId, silme veya tahakkukları tekrarlamamalıdır; - bir
coupon_code, aşamalı hesaplama ve yeniden hesaplama sırasında farklıbatchIdile birlikte gelebilir; - 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ıyorsacurrency’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 = 1sonrasında kabul edilen bir kupon olarak kaydedilir. - İşlendi
multi, kısıtlamaları ve hataları ifade edin501–507. - Müşteri bakiyesinin otomatik olarak silinmesi dikkate alınmıştır.
- Tüm
coupon_codeve teklif kimlikleri kaydedilir. - Son ödeme
real_win’den alınır. - Geri arama, kaynak baytlarına göre kontrol edilir ve
batchIdkullanı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.