SportApi
API ドキュメント · バージョン 1.2.0

オッズ、ベット、クーポン — API技術ドキュメント

このファイルには、クーポン計算システム SportAPI に接続するための最小限のスタンドアロン スクリプトが含まれています。詳細とまれなケースについては、完全なドキュメント を参照してください。

基本フロー http
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 200code = 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_typeacceptの場合許容される係数変更方向。
multiいいえ一般クーポンまたは個別シングル 1 枚。デフォルトは false

オッズ

設定行動
mode = reject係数が変化した場合の作成を拒否します。
mode = acceptmode_type = 1プロモーションのみを受け入れます。
mode = acceptmode_type = 2降格のみを受け入れます。
mode = acceptmode_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_codestring公開されている 12 桁のクーポン コード。先頭のゼロが失われないように、文字列として保存します。
amountnumber作成時に転送されるクーポンの金額。
winnumber現在表示されている当選金額。
potential_winnumber最終決済前に勝利の可能性。
real_winnumber/null計算後の実際の支払い額。計算前 - null
coefnumber現在または最終のクーポン率。
original_coefnumber作成時のクーポンの合計係数。
calculate_coefnumber/null最終的に計算された係数。計算前 - null
has_returnbooleantrue、クーポンに返金ステータスのベットが含まれている場合。
dateintegerクーポン作成日、ミリ秒単位の Unix タイムスタンプ。
statusinteger現在のクーポンのステータス。値は「クーポンと入札状況」セクションに記載されています。
asianboolean半分の勝ち負けを含むアジアの決済の存在の兆候。
calculate_dateinteger/nullクーポン計算日 (ミリ秒単位)。計算前 - null
coupon_typeintegerクーポンの種類: 1 - 普通、2 - 特急。
events_countintegerクーポン内のベット数。
events_dataarrayクーポンに含まれるすべてのベット。

入札フィールド

events_data[] の各要素は、クーポン内で受け入れられた特定の賭けを記述します。

フィールド種類意味
idinteger/null受け入れられたベットの内部 ID。クーポン内のレートを検索するために、coupon_code と組み合わせて使用​​されます。
game_idinteger賭けが行われるイベントまたはサブイベントの ID。
main_game_idinteger/nullイベントまたはサブイベントが属するメインマッチの ID。
is_sub_gamebooleantrue、ベットがハーフ、ピリオド、セット、コーナー、またはその他のサブイベントに関連する場合。
parent_game_idinteger/null直接の親イベントの ID (存在する場合)。
sub_game_keystring/nullサブイベントまたはピリオドのテクニカルキー。
raw_pointerstringAPI によって受け入れられる元のレート インジケーター。
line_typestring回線タイプ: line - 試合前、live - リアルタイム イベント。
is_livebooleantrue、ベットがライブラインで作成された場合。
bet_group_idintegerベットグループまたはマーケットのID。
bet_group_namestring/nullベット グループのローカライズされた名前。
bet_idintegerベット グループ内で選択されたセレクションの ID。
bet_namestring/null選択した選択項目のローカライズされたフルネーム。
sport_idinteger/nullスポーツID。
sport_namestring/nullスポーツのローカライズされた名前。
tournament_idinteger/nullトーナメントID。
tournamentstring/nullトーナメントのローカライズされた名前。
event_dateinteger/nullイベント開始日、ミリ秒単位の Unix タイムスタンプ。
statusinteger現在のレート計算ステータス。クーポンステータスと混同しないでください。
opp1string/null最初のチームまたは参加者の名前。
opp2string/null2 番目のチームまたは参加者の名前。
coefnumber賭けが受け入れられたときの賭けオッズ。
calc_coefnumber/null計算されたベット倍率。計算前 - null
bet_scorestringマッチスコアではなくベットインジケーターを含むレガシー API 互換フィールド。
calculate_dateinteger/nullミリ秒単位の料金計算日。計算前 - null
calculate_scorestring/null賭け金の計算に使用されるアカウント。
settlement_reason_codestring/null支払いまたは返品の理由の安定したマシンコード。計算前 - null
settlement_reasonstring/null支払いまたは返品の理由の説明文。計算前 - null
placement_score_fullstring/nullベットが作成された時点の合計イベント スコア (利用可能な場合)。
placement_score_periodsstring/null可能な場合は、ベットが作成された時点の期間ごとのスコア。
calculation_score_fullstring/nullベットが決済された時点でのイベントの合計スコア。
calculation_score_periodsstring/nullレート計算時に期間ごとに計算されます。
timerinteger/nullデータ保存時のイベント タイマー (利用可能な場合)。
dop_namestring/nullサブイベントの名前: ハーフ、ピリオド、セット、イニングなど。
ratestring結果パラメータ、たとえば合計やハンディキャップの値。パラメーターのない結果の場合 - "0"
sgame_idstring/nullサブイベントの外部キー。
game_numinteger/nullゲーム番号 (ソースから提供されている場合)。
stat_idstring/null外部統計イベント ID。
team1_idinteger/null最初のチームまたは参加者の ID。
team2_idinteger/null2 番目のチームまたは参加者の ID。
opp_icon1integer/null最初のコマンドアイコンの互換性のある ID。 team1_id と一致します。
opp_icon2integer/null互換性のある第 2 チームのアイコン ID。 team2_id と一致します。

null は、まだ計算されていないデータ、または使用できないデータでは正常です。自動的に 0 または空の文字列に置き換えないでください。

クーポンは、code = 1 であり、body.coupons にオブジェクトが存在する場合にのみ受け入れられると考えてください。これに先立って、バスケットは予備的な選択です。選択内容が消えるか、ブロックされるか、オッズが変更される可能性があります。

成功後:

  1. 最初のオブジェクトだけでなく、すべての body.coupons オブジェクトを保存します。
  2. coupon_code を先頭にゼロを付けた文字列として保存します。
  3. 必要なデータを events_data から保存します。
  4. クーポンをエンドユーザーに合わせます。
  5. ユーザーの金融取引をパートナーのシステムに記録します。

識別子:

フィールド目的
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内部エラー。エラーを記録し、再試行する前に結果を確認してください。

501504 の場合、新しい 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/activebody[] の配列。
最近の計算GET /api/partner/coupons/calculated?time=10body[] の配列;最長120分。
コード/期間別POST /api/partner/coupons/resultsbody.coupons の配列。
顧客残高GET /api/partner/balancebody.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_wincalculate_coefcalc_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
        }
      ]
    }
  ]
}

必須のルール:

  1. JSON を解析する前に本文の正確なソース バイトから sha256=<hex(HMAC-SHA256(raw_body, callback_secret))> を計算し、安全な方法で署名を比較します。
  2. すべてのアイテムを処理 coupons、パッケージには最大 100 個のクーポンを含めることができます。
  3. batchId を一意のインデックスで保存します。
  4. batchId を繰り返すと、償却または見越を繰り返すべきではありません。
  5. プログレッシブ計算および再計算中に、1 つの coupon_code に別の batchId を指定することができます。
  6. パケット全体が安全に保存された後にのみ、HTTP 200 を返します。

最小の成功応答は、空の HTTP 200 です。上級:

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

processedcouponCount と等しくなければなりません。応答 201202、および 204 は成功とみなされません。

リプレイは、タイムアウト、トランスポート エラー、または HTTP 500502503504 の場合にのみ実行されます。すぐに実行され、その後 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、明示的な制限とエラー 501507 を処理しました。
  • 顧客残高の自動消込が考慮されています。
  • すべての coupon_code と入札 ID が保存されます。
  • 最終的な支払いは real_win から取得されます。
  • コールバックはソース バイトと照合され、batchId を使用して重複排除されます。
  • バックアップポーリングが設定されました。
  • ユーザー残高はクライアント残高 SportAPI とは別のものです。

詳細なドキュメントは API の概要 から始まります。完全なエンドポイント マップは マニュアル にあります。

追加資料や統合サポートが必要ですか?