オッズ、ベット、クーポン — API技術ドキュメント
このファイルには、クーポン計算システム SportAPI に接続するための最小限のスタンドアロン スクリプトが含まれています。詳細とまれなケースについては、完全なドキュメント を参照してください。
POST /api/partner/login
POST /api/partner/coupons/place
GET /api/partner/coupons/calculated?time=10 1. マネージャーから得るべきもの
- ベース URL API。
- クライアントアカウントのログイン名とパスワード。
- コールバックを使用する場合 - 関数と秘密フレーズ
callback_secretを有効にします。
例では条件付きアドレスを使用します。
BASE_URL="https://coupon-api.example.com"
運用環境では、HTTPS を使用します。すべての日付はミリ秒単位の Unix タイムスタンプとして送信され、通貨値は固定精度なしの 10 進数として送信されます。
2. APIレスポンス形式
成功:
{
"code": 1,
"body": {},
"error_code": null,
"error_message": null,
"date": 1784970000000,
"time_ms": 5,
"path": "/api/partner/example"
}
通常、ビジネス エラーには HTTP 200 も伴います。
{
"code": 0,
"body": null,
"error_code": 1002,
"error_message": "Not all params",
"date": 1784970000000,
"time_ms": 5,
"path": "/api/partner/example"
}
必ず HTTP コードを確認し、次に code、次に error_code を確認してください。テキスト error_message をソフトウェア キーとして使用しないでください。
3. 認可
POST /api/partner/login
Content-Type: application/json
{
"username": "partner-demo",
"password": "strong-password"
}
フィールド login は、互換性のあるエイリアス username としてサポートされます。
成功した応答:
{
"code": 1,
"body": {
"token": "<jwt-token>",
"user_id": 17,
"username": "partner-demo"
},
"error_code": null,
"error_message": null
}
すべての保護されたリクエストで、以下を渡します。
Authorization: Bearer <jwt-token>
基本的なログイン エラー:
| コード | 理由 |
|---|---|
1002 | ログインまたはパスワードが送信されませんでした。 |
1003 | 不明なログインまたは間違ったパスワード。 |
1004 | クライアント アカウントが無効になっています。 |
1006 | アクセス期限が切れています。 |
1007 | 顧客残高がゼロまたはマイナスです。 |
これらのエラーは、HTTP 200、code = 0 から返されます。保護されたメソッドの HTTP 401 は、JWT が欠落している、無効である、期限切れである、または取り消されていることを意味します。再度サインインします。 HTTP 403 は、不適切なロールまたはアクセスが拒否されたことを意味します。
4. レートインジケーター
選択された各結果は、スポーツ ラインから既製のラインとして送信されます。
line_type#game_id#group_id#type_id#rate#coefficient[#player_id]
例:
line#737779544#1#1#0#1.85
live#738917381|119|5869|0.5#3.6#149439538
line_type:lineまたはlive;rate: 合計/ハンディキャップ パラメーターまたは0;player_id: オプションのプレイヤー ID;- 区切り文字
#および|がサポートされています。
ポインターを手動で収集または修正しないでください。行から取得した値を変更せずに渡します。
5. クーポンを作成する
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
}
| フィールド | 必須 | 目的 |
|---|---|---|
list_bets | はい | 1 つ以上のポインター。 |
amount | はい | 作成される 1 つのクーポンの正の金額。 |
currency | いいえ | 仮想通貨を含む任意の文字列指定。 |
callback_url | いいえ | URL コールバック。コールバックがなければ送信できません。null、空の文字列、またはサイト ドメインを渡すことができます。 |
lang | いいえ | サポートされている約 50 言語のいずれかの 2 文字コード。名前の言語は作成時に固定されます。 |
mode | いいえ | reject または accept;デフォルトは reject。 |
mode_type | acceptの場合 | 許容される係数変更方向。 |
multi | いいえ | 一般クーポンまたは個別シングル 1 枚。デフォルトは false。 |
オッズ
| 設定 | 行動 |
|---|---|
mode = reject | 係数が変化した場合の作成を拒否します。 |
mode = accept、mode_type = 1 | プロモーションのみを受け入れます。 |
mode = accept、mode_type = 2 | 降格のみを受け入れます。 |
mode = accept、mode_type = 3 | あらゆる変更を受け入れます。 |
普通、急行、multi
| リクエスト | 結果 | 顧客残高の償却 |
|---|---|---|
| 一つの結果 | 普通の1枚 | amount |
複数の結果、multi = false | 特急1本 | amount |
複数の結果、multi = true | 結果ごとに個別のシングル | amount × 作成したクーポンの数 |
1 つの急行列車に含めることができるイベントは 15 個までです。メインマッチ、ハーフ、ピリオド、コーナー、ファウル、その他の関連サブイベントを含む、同じ試合で複数のベットを組み合わせることはできません。この組み合わせは 506 を返します。
6. クーポンと入札の作成の確認
events_data 内のクーポンと受け入れられた賭けデータを含む完全な成功応答:
{
"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"
}
クーポンフィールド
各アイテム body.coupons[] は個別に作成されたクーポンです。
| フィールド | 種類 | 意味 |
|---|---|---|
coupon_code | string | 公開されている 12 桁のクーポン コード。先頭のゼロが失われないように、文字列として保存します。 |
amount | number | 作成時に転送されるクーポンの金額。 |
win | number | 現在表示されている当選金額。 |
potential_win | number | 最終決済前に勝利の可能性。 |
real_win | number/null | 計算後の実際の支払い額。計算前 - null。 |
coef | number | 現在または最終のクーポン率。 |
original_coef | number | 作成時のクーポンの合計係数。 |
calculate_coef | number/null | 最終的に計算された係数。計算前 - null。 |
has_return | boolean | true、クーポンに返金ステータスのベットが含まれている場合。 |
date | integer | クーポン作成日、ミリ秒単位の Unix タイムスタンプ。 |
status | integer | 現在のクーポンのステータス。値は「クーポンと入札状況」セクションに記載されています。 |
asian | boolean | 半分の勝ち負けを含むアジアの決済の存在の兆候。 |
calculate_date | integer/null | クーポン計算日 (ミリ秒単位)。計算前 - null。 |
coupon_type | integer | クーポンの種類: 1 - 普通、2 - 特急。 |
events_count | integer | クーポン内のベット数。 |
events_data | array | クーポンに含まれるすべてのベット。 |
入札フィールド
events_data[] の各要素は、クーポン内で受け入れられた特定の賭けを記述します。
| フィールド | 種類 | 意味 |
|---|---|---|
id | integer/null | 受け入れられたベットの内部 ID。クーポン内のレートを検索するために、coupon_code と組み合わせて使用されます。 |
game_id | integer | 賭けが行われるイベントまたはサブイベントの ID。 |
main_game_id | integer/null | イベントまたはサブイベントが属するメインマッチの ID。 |
is_sub_game | boolean | true、ベットがハーフ、ピリオド、セット、コーナー、またはその他のサブイベントに関連する場合。 |
parent_game_id | integer/null | 直接の親イベントの ID (存在する場合)。 |
sub_game_key | string/null | サブイベントまたはピリオドのテクニカルキー。 |
raw_pointer | string | API によって受け入れられる元のレート インジケーター。 |
line_type | string | 回線タイプ: line - 試合前、live - リアルタイム イベント。 |
is_live | boolean | true、ベットがライブラインで作成された場合。 |
bet_group_id | integer | ベットグループまたはマーケットのID。 |
bet_group_name | string/null | ベット グループのローカライズされた名前。 |
bet_id | integer | ベット グループ内で選択されたセレクションの ID。 |
bet_name | string/null | 選択した選択項目のローカライズされたフルネーム。 |
sport_id | integer/null | スポーツID。 |
sport_name | string/null | スポーツのローカライズされた名前。 |
tournament_id | integer/null | トーナメントID。 |
tournament | string/null | トーナメントのローカライズされた名前。 |
event_date | integer/null | イベント開始日、ミリ秒単位の Unix タイムスタンプ。 |
status | integer | 現在のレート計算ステータス。クーポンステータスと混同しないでください。 |
opp1 | string/null | 最初のチームまたは参加者の名前。 |
opp2 | string/null | 2 番目のチームまたは参加者の名前。 |
coef | number | 賭けが受け入れられたときの賭けオッズ。 |
calc_coef | number/null | 計算されたベット倍率。計算前 - null。 |
bet_score | string | マッチスコアではなくベットインジケーターを含むレガシー API 互換フィールド。 |
calculate_date | integer/null | ミリ秒単位の料金計算日。計算前 - null。 |
calculate_score | string/null | 賭け金の計算に使用されるアカウント。 |
settlement_reason_code | string/null | 支払いまたは返品の理由の安定したマシンコード。計算前 - null。 |
settlement_reason | string/null | 支払いまたは返品の理由の説明文。計算前 - null。 |
placement_score_full | string/null | ベットが作成された時点の合計イベント スコア (利用可能な場合)。 |
placement_score_periods | string/null | 可能な場合は、ベットが作成された時点の期間ごとのスコア。 |
calculation_score_full | string/null | ベットが決済された時点でのイベントの合計スコア。 |
calculation_score_periods | string/null | レート計算時に期間ごとに計算されます。 |
timer | integer/null | データ保存時のイベント タイマー (利用可能な場合)。 |
dop_name | string/null | サブイベントの名前: ハーフ、ピリオド、セット、イニングなど。 |
rate | string | 結果パラメータ、たとえば合計やハンディキャップの値。パラメーターのない結果の場合 - "0"。 |
sgame_id | string/null | サブイベントの外部キー。 |
game_num | integer/null | ゲーム番号 (ソースから提供されている場合)。 |
stat_id | string/null | 外部統計イベント ID。 |
team1_id | integer/null | 最初のチームまたは参加者の ID。 |
team2_id | integer/null | 2 番目のチームまたは参加者の ID。 |
opp_icon1 | integer/null | 最初のコマンドアイコンの互換性のある ID。 team1_id と一致します。 |
opp_icon2 | integer/null | 互換性のある第 2 チームのアイコン ID。 team2_id と一致します。 |
値 null は、まだ計算されていないデータ、または使用できないデータでは正常です。自動的に 0 または空の文字列に置き換えないでください。
クーポンは、code = 1 であり、body.coupons にオブジェクトが存在する場合にのみ受け入れられると考えてください。これに先立って、バスケットは予備的な選択です。選択内容が消えるか、ブロックされるか、オッズが変更される可能性があります。
成功後:
- 最初のオブジェクトだけでなく、すべての
body.couponsオブジェクトを保存します。 coupon_codeを先頭にゼロを付けた文字列として保存します。- 必要なデータを
events_dataから保存します。 - クーポンをエンドユーザーに合わせます。
- ユーザーの金融取引をパートナーのシステムに記録します。
識別子:
| フィールド | 目的 |
|---|---|
coupon_code | 公開クーポンコード。 |
events_data[].id | クーポン内で受け入れられた特定のベットの ID。 |
コールバック events_data[].uuid | 同じ入札 ID が文字列として渡されます。 |
batchId | クーポンや料金ではなく、コールバック パッケージのバージョンの ID。 |
currency は、完全なモデルおよびコールバックでは返されません。通貨が必要な場合は、作成リクエストの値を保存します。
7. 作成エラー
| コード | 理由 | アクション |
|---|---|---|
10 | リクエスト本文がありません。 | リクエストを修正してください。 |
11 | 無効なポインタです。 | 行から現在のポインタを取得します。 |
12 | 無効な amount。 | 正の数を渡します。 |
501 | 係数が変わりました。 | 新しい値を表示するか、mode を変更します。 |
502 | 結果はありません。 | カート内の入札を削除/更新します。 |
503 | 結果はブロックされます。 | 一時的な利用不可を報告します。 |
504 | 結果検証エラー。 | クーポンが受け入れられたとは考えないでください。後で繰り返します。 |
506 | エクスプレス ベットでは 1 試合です。 | 1 つの結果を残すか、別のシングルを使用します。 |
507 | クライアント残高が不十分です。 | 残高を補充するか、合計金額を減らしてください。 |
1002 | 無効なパラメータセットです。 | パラメータを修正してください。 |
10000 | 内部エラー。 | エラーを記録し、再試行する前に結果を確認してください。 |
501 ~ 504 の場合、新しい API は問題のあるレートを body.changes[] で返します。フィールド change_type: 1 - 係数が増加しました、2 - 減少しました、null - 方向は適用されません。
タイムアウト後に POST /coupons/place をやみくもに再試行しないでください。最初のリクエストが受け入れられている可能性があり、再試行すると重複が作成されます。
8. クーポンの受け取り
| 操作 | エンドポイント | 結果 |
|---|---|---|
| クーポン1枚 | GET /api/partner/coupons/get?coupon_code={code} | body のクーポン。 |
| アクティブ | GET /api/partner/coupons/active | body[] の配列。 |
| 最近の計算 | GET /api/partner/coupons/calculated?time=10 | body[] の配列;最長120分。 |
| コード/期間別 | POST /api/partner/coupons/results | body.coupons の配列。 |
| 顧客残高 | GET /api/partner/balance | body.balance。 |
コードを使用して最大 100 個の値を転送できます。
{
"coupon_ids": ["000000000272", "000000000273"]
}
または、作成期間が 24 時間を超えないようにします。
{
"start_date": 1784880000000,
"end_date": 1784966400000
}
同じクエリ内で coupon_ids と日付を組み合わせないでください。 results は作成時間でフィルターし、calculated は最終決済時間でフィルターします。
9. クーポンとベットのステータス
クーポンのステータス:
| コード | 意味 | ファイナル |
|---|---|---|
0 | 活動中または部分的に定着しています。 | いいえ |
2 | 勝った。 | はい |
4 | 失われた。 | はい |
8 | 全額返金されました。 | はい |
15 | 再計算のために返されます。新しい結果を期待してください。 | いいえ |
入札ステータス:
| コード | 意味 | calc_coef |
|---|---|---|
0 | 計算されていません。 | null |
1 | 勝ちました。 | 元の係数 |
2 | 負ける。 | 0 |
3 | 戻ります。 | 1 |
4 | 再計算待ちです。 | null |
21 | 賞金の半分。 | (coef + 1) / 2 |
22 | 半分負け。 | 0.5 |
23 | 押してください。 | 1 |
エンド ユーザーへの財務上の見越には、既製の real_win を使用します。 potential_win を使用したり、支払いを自分で再計算したりしないでください。計算前、real_win、calculate_coef、calc_coef、および calculate_date は、0 ではなく、null と等しくなります。
クーポンの最初のステータス 15 で、前の結果がすでに財務処理されている場合、パートナーはエンド ユーザーから再度 amount を引き落とし、新しい最終ステータスを予期し、新しい real_win を請求します。再処理から操作を保護します。
10. 算出理由
完全なモデルとコールバックの各ベットには次のものが含まれます。
| フィールド | 目的 |
|---|---|
settlement_reason_code | 安定した支払い/返金理由コード。 |
settlement_reason | 説明的なソーステキスト。 |
計算前は、両方のフィールドは null に等しくなります。ローカライズされた通知の場合は、次のようなコードを使用します。
MATCH_POSTPONED- 試合は延期されました。MATCH_CANCELLED- 試合はキャンセルされました。MARKET_PUSH- 市場ルールに従って戻ります。
コードが不明な場合は、コードを保存し、空ではない settlement_reason をフォールバック テキストとして使用します。支払いを理由に基づいて計算しないでください - ステータスと real_win を使用してください。
これらのフィールドは、すでに実行された計算または戻り値を説明するものであり、一致ステータスの個別のリアルタイム フィードではありません。
11. コールバック
コールバックはオプションです。パートナーはポーリングを通じてのみ作業できます。コールバックの場合、マネージャーは関数を有効にして callback_secret を作成する必要があります。 URL は作成されたクーポンごとに送信されます。
コールバック URL はパートナーが独自に決定します。運用環境では、https:// を使用する必要があります。テスト環境では、http:// が許可されます。
システムは以下を送信します。
POST {callback_url}
Content-Type: application/json
X-Coupon-Signature: sha256=<hex_hmac_sha256>
短いペイロード:
{
"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
}
]
}
]
}
必須のルール:
- JSON を解析する前に本文の正確なソース バイトから
sha256=<hex(HMAC-SHA256(raw_body, callback_secret))>を計算し、安全な方法で署名を比較します。 - すべてのアイテムを処理
coupons、パッケージには最大 100 個のクーポンを含めることができます。 batchIdを一意のインデックスで保存します。batchIdを繰り返すと、償却または見越を繰り返すべきではありません。- プログレッシブ計算および再計算中に、1 つの
coupon_codeに別のbatchIdを指定することができます。 - パケット全体が安全に保存された後にのみ、HTTP
200を返します。
最小の成功応答は、空の HTTP 200 です。上級:
{
"success": true,
"processed": 1
}
processed は couponCount と等しくなければなりません。応答 201、202、および 204 は成功とみなされません。
リプレイは、タイムアウト、トランスポート エラー、または HTTP 500、502、503、504 の場合にのみ実行されます。すぐに実行され、その後 1、5、15、60 分後に実行されます。送信回数は 5 回までです。 success: false または部分的な processed を使用した HTTP 200 では自動再試行はありません。
12. ポーリングを予約する
コールバックを使用する場合でも、結果を定期的に確認してください。
GET /api/partner/coupons/calculated?time=10
120 分を超える休憩の後、保存された coupon_ids または最大 24 時間の作成期間にわたって POST /api/partner/coupons/results を使用します。同じ幸運を再び受け取っても、金融取引を繰り返すべきではありません。
13. セキュリティとストレージ
- ログイン、パスワード、JWT、および
callback_secretをサーバー上にのみ保存します。 - URL で JWT を渡したり、完全なトークンをログに書き込んだりしないでください。
- お金には 10 進数タイプを使用します。
coupon_codeを文字列として保存します。- 必要な入札データである
amountと、使用されている場合はcurrencyを保存します。 - クーポンと入札ステータスを区別します。
- 不明なフィールドと理由コードをエラーなしで受け入れます。
- すべてのエンドユーザーの金融トランザクションを冪等にします。
14. 古い API とキャッシュアウト
古いルートは引き続きサポートされますが、新しい統合では /api/partner/** を使用する必要があります。古い回答とエラーの形式は異なります。既存のクライアントを更新するには、単一のファイル 「古い API からの移行」 を使用します。
Cashout は開発中ですが、完全にテストされておらず、本番環境での使用は推奨されていません。
15. 最終チェックリスト
BASE_URL、ログイン名とパスワードを受け取りました。- JWTはBearerトークンとして送信されます。
- ポインタは、変更せずにその行から取得されます。
- カートは、
code = 1以降にのみ承認されたクーポンとして保存されます。 multi、明示的な制限とエラー501~507を処理しました。- 顧客残高の自動消込が考慮されています。
- すべての
coupon_codeと入札 ID が保存されます。 - 最終的な支払いは
real_winから取得されます。 - コールバックはソース バイトと照合され、
batchIdを使用して重複排除されます。 - バックアップポーリングが設定されました。
- ユーザー残高はクライアント残高 SportAPI とは別のものです。
詳細なドキュメントは API の概要 から始まります。完全なエンドポイント マップは マニュアル にあります。