SoftAggregator 娱乐场API文档
通过一个无缝钱包API接入 40,000+ 款娱乐场游戏。本参考文档涵盖获取游戏列表、创建玩家、启动游戏、读取玩家历史以及处理钱包回调所需的全部内容。
简介
SoftAggregator API 采用无缝钱包模式:玩家余额保存在您的平台上,每次查询余额、投注和派彩时,我们的API都会调用您的回调地址。所有API方法均以 POST 请求、JSON 请求体发送至同一个接口地址。
Base URL
https://api.softaggregator.com/api/v1
鉴权
每个请求都需携带您的 api_login 和 api_password(审核通过后在运营商后台发放)。method 字段用于指定要执行的操作。
{
"api_login": "YOUR_API_LOGIN",
"api_password": "YOUR_API_PASSWORD",
"method": "getGameList"
}
一个账户运营多个网站
您可以在一个 SoftAggregator 账户下运营多个网站或项目。在运营商后台(API integration → Your other sites)添加每个站点后,系统会为其发放独立的 api_login、api_password、salt_key 以及独立的回调地址。额度余额、游戏目录、价格与结算仍在同一账户下共享。
| 各站点共享 | 每个站点独立 |
|---|---|
| 额度余额、游戏目录、价格、账单、报表 | api_login / api_password / salt_key、回调地址、默认玩家币种、玩家 |
每个站点还可在同一界面设置独立的默认玩家币种。它只是默认值:您在 createPlayer / getGame 中传入的 currency 字段始终优先,因此按玩家区分的多币种功能保持不变。优先级顺序:调用中的 currency → 该玩家已记录的币种 → 站点默认币种 → 账户默认币种。
请始终使用玩家所属站点的密钥调用我们。玩家归属于创建他们时所用密钥对应的站点,因此两个站点可以安全地使用相同的 user_username(例如两边都是 1042),互不影响对方钱包:每笔投注与派彩只会回调到该站点的回调地址,用户名与您发送的完全一致。
如果您只运营一个网站,则无需任何改动,现有密钥和回调地址照常使用。
币种
所有涉及资金的方法(createPlayer、getGame 与 getGameDemo)都接受可选的 currency 字段(ISO 4217 代码,例如 EUR、USD、BRL、INR、PKR)。它决定玩家在游戏中看到的币种,包括投注限额与余额。
| 情形 | 处理方式 |
|---|---|
未传 currency | 使用发起调用的密钥所属站点的默认币种;若该站点未设置,则使用账户默认币种。 |
传入 currency | 必须是您账户已开通的币种,即您已开通的产品所支持的币种。不支持的币种会导致启动失败。 |
| 按玩家 | 玩家的币种在首次创建时确定,此后不再变更。如需同一玩家使用另一币种,请使用不同的 user_username。 |
钱包回调(balance / debit / credit)携带相同的 currency,amount 始终以该币种的最小单位表示(例如 2.50 → 250)。您可用的币种由 SoftAggregator 配置,如需为账户开通新币种,请联系 客服 或 @mentionso。
getCurrencies 从 API 读取同一份列表。getCurrencies获取您的币种
返回您账户已开通的币种,便于您以程序方式选择正确的 currency 值,而不必写死在代码中。
POST /api/v1
{ "api_login":"...", "api_password":"...", "method":"getCurrencies" }
→ {
"error": 0,
"response": {
"default": "PKR", // 在 getGame / createPlayer 中传入此值(或省略以使用它)
"currencies": ["PKR","EUR"], // 您的账户可使用的币种
"settlement": "EUR" // 您账户的结算币种
}
}
getGameList获取游戏列表
返回您可使用的全部游戏。启动游戏时请使用每款游戏的 id_hash。
POST /api/v1
{ "api_login": "...", "api_password": "...", "method": "getGameList" }
→ {
"error": 0,
"response": [
{
"id": 483,
"name": "Game Name",
"game_type": "slots", // 标准化品类,请用它来搭建游戏大厅
"provider": "pragmaticplay", // 工作室键值,与 getProviderList 对应
"provider_name": "Pragmatic Play",
"provider_logo": "https://cdn.imagesai.org/p/pragmaticplay.png",
"type": "Video Slots", // 工作室原始标签,不统一,仅为兼容保留
"category": "pragmaticplay", // 工作室原始代码,仅为兼容保留
"id_hash": "provider/GameName",
"freerounds_supported": false, // 见“免费回合”一节
"play_for_fun_supported": true,
"image": "https://.../GameName.webp"
}
]
}
game_type,而不是 type。
type 与 category 直接来自各游戏工作室,并不统一:少数几个真实品类对应着二十多种不同标签,
许多 Crash 游戏还被标成老虎机。game_type 是我们的标准化取值,固定为以下之一:
slots、live、crash、table、instant、
bingo、keno、fishing、virtual、sportsbook、other。
该列表不会在未通知的情况下变更。type 与 category 保持不变,现有集成可继续正常工作。getProviderList获取供应商
返回您可使用的游戏工作室,包含显示名称和标志。每个 provider 值都与
getGameList 中每款游戏的 provider 字段一一对应,便于直接搭建供应商筛选器。
以多个代码发布的工作室(例如两路 Pragmatic Play 游戏源)只返回一次。
POST /api/v1
{ "api_login": "...", "api_password": "...", "method": "getProviderList" }
→ {
"error": 0,
"response": [
{
"provider": "pragmaticplay",
"name": "Pragmatic Play",
"logo": "https://cdn.imagesai.org/p/pragmaticplay.png",
"games": 3410
}
]
}
标志为 PNG 格式,400×160,由我们自己的 CDN 提供,不依赖外部主机,不会被各国运营商网络屏蔽。 标志缓存一天,我们优化后的标志无需您做任何改动即可呈现给玩家。
createPlayer创建玩家
在启动游戏前于系统中创建(或确认)玩家。
{ "api_login":"...", "api_password":"...", "method":"createPlayer",
"user_username":"player123", "user_password":"secret", "currency":"EUR" }
→ { "error": 0, "response": { ... } }
getGame启动游戏
返回用于在 iframe 中加载游戏的 URL。请将 getGameList 返回的 id_hash 作为 gameid 传入。
| 字段 | 说明 |
|---|---|
user_username | 玩家用户名 |
user_password | 玩家密码 |
gameid | 游戏的 id_hash |
lang | 语言代码,例如 en |
currency | 可选,玩家币种(见币种)。默认为账户币种。 |
device | 可选,desktop(默认)或 mobile。部分游戏平台会拒绝未声明设备的启动请求。 |
country | 玩家所在国家,ISO 3166 alpha-2 代码(例如 ET、BR)。默认可选,对服务受限市场的账户为必填,详见下方说明。也接受别名 user_country。 |
homeurl | 玩家退出游戏后的返回地址 |
play_for_fun | 可选,试玩模式 |
{ "api_login":"...", "api_password":"...", "method":"getGame",
"user_username":"player123", "user_password":"secret",
"gameid":"provider/GameName", "lang":"en", "currency":"EUR",
"country":"BR", "homeurl":"https://yourcasino.com" }
→ { "error": 0, "response": "https://game-launch-url..." }
method: "getGameDemo",参数相同。试玩模式下从不要求 country。受限市场。少数游戏工作室会排除特定国家。我们按玩家执行这一限制,依据的是您在启动时传入的 country,绝不会根据 IP 地址推测。玩家所在国家不允许打开的游戏会返回 Game not available in your country,其余游戏正常启动。如果您的账户服务的市场存在工作室限制,我们会将 country 由可选改为必填,未携带该字段的启动请求将返回 country is required on getGame。只要在每次真钱启动时都传入该字段,无论日后开通什么都不受影响。
免费回合
促销型免费回合(free rounds)按账户单独开通。在未开通的账户上,addFreeRounds、getFreeRounds 和 deleteFreeRounds 返回 { "error": 1, "message": "Free rounds not supported" },游戏列表中的 freerounds_supported 为 false。如需通过自己的促销活动发放免费回合,请先联系我们沟通开通方案。
游戏内的免费旋转是另一回事,且完全可用。由 Scatter 触发的免费旋转、奖励回合、购买功能和奖池完全由游戏自身运行,您无需做任何集成。它们以普通钱包回调的形式到达:免费旋转的赢额会以 action: credit 发送,带有 amount,但没有对应的 debit。只要遵守钱包回调一节中的两条规则,即可正确派彩。跳过本节不会给您带来任何损失。
getPlayerHistory玩家历史
返回您的某位玩家的回合历史,按时间倒序排列。每个游戏回合一条记录(同一回合的所有分段会合并)。金额为以分为单位的整数,币种为该回合所用币种。
{ "api_login":"...", "api_password":"...", "method":"getPlayerHistory",
"user_username":"player123",
"limit":50, "offset":0,
"date_from":"2026-08-01 00:00:00", "date_to":"2026-08-01 23:59:59",
"gameid":"x6046f4988155b46", "round_id":"..." }
只有 user_username 为必填。limit 默认 50(最大 500);gameid 为 getGameList 返回的 id_hash;date_from/date_to 为 UTC 时间。
{ "error":0, "response":{
"user_username":"player123", "total":128, "limit":50, "offset":0,
"rounds":[
{ "round_id":"88c6807b55e7434c3e00aa50dc82240e",
"gameid":"x6046f4988155b46", "game_name":"Gates of Olympus 1000",
"currency":"USD", "bet":40, "win":58, "net":18,
"legs":2, "rolled_back":false,
"started_at":"2026-08-01 16:10:15", "ended_at":"2026-08-01 16:10:24" } ] } }
| 字段 | 含义 |
|---|---|
total | 符合筛选条件的回合总数(用于分页),而非本次返回的数量 |
bet / win | 该回合的投注总额 / 派彩总额,单位为分 |
net | win - bet:负数表示玩家输掉该回合 |
legs | 合并到该回合的钱包变动笔数 |
rolled_back | 若该回合被取消/退款则为 true |
ticket | 仅体育博彩回合:ticket_id、currency、stake / payout(分)、总 odds、status、placed_at、settled_at 以及 selections[](sport、category、tournament、team1、team2、start_at、live、market、pick、handicap、odds、status、score1、score2)。status:0 未结算 · 1 赢 · 2 输 · 3 退款 · 4 已兑现 |
钱包回调
每当玩家余额发生变化,我们都会调用您的回调地址(在运营商后台设置,每个网站一个,见多站点)。回调以 GET 请求发送。您的接口必须始终返回 HTTP 200,错误只通过 JSON 响应体传达。余额始终为以分为单位的整数(例如 €2.50 → 250)。
action: balance
在会话开始时发送,用于读取玩家余额。
GET {your_callback}?username=player123¤cy=EUR&action=balance
&call_id=...×tamp=...&key=...
← { "error": 0, "balance": 250 }
action: debit / credit
debit 扣除投注;credit 增加派彩。call_id 是唯一交易 ID,请用它去重。若 debit 时余额不足,请返回 error: 1 并附上当前余额。
GET {your_callback}?username=player123¤cy=EUR&action=debit
&amount=100&type=bet&round_id=...&game_id=x95adbbbf8314c37
&call_id=...×tamp=...&rb=0&key=...
← { "error": 0, "balance": 150 }
您的处理程序必须遵守两条规则。
- 绝不要因为
type而拒绝回调。只根据action分支处理。type仅供参考,其取值会随着我们新增供应商而增加,遇到未知值请按普通投注或派彩处理。 credit可能没有对应的debit。免费旋转、奖励回合和奖池派彩都是只有amount的赢额,没有可匹配的投注。请仅依据call_id去重;若要求先有 debit,您的玩家将永远拿不到免费旋转的赢额。
| 字段 | 说明 |
|---|---|
amount | 金额,单位为分 |
action | debit | credit | balance |
type | 仅供参考,绝不据此拒绝。debit 时为 bet,credit 时为 win;bonus_fs 表示免费旋转(debit 时无需扣款)。也可能出现其他取值。 |
call_id | 唯一交易 ID(去重) |
round_id | 游戏回合 ID |
game_id | 游戏的 id_hash,与 getGameList 返回、您传给 getGame 的值逐字节一致。直接匹配即可,无需解析,也没有前缀需要去除。已下架的游戏仍可能结算其最后几个回合,因此遇到无法识别的 ID,请按普通投注或派彩处理,不要拒绝回调。 |
rb | 1 = 回滚(按普通 debit/credit 处理) |
签名校验
每个回调都携带 timestamp 和 key。请校验时间戳在 30 秒以内,且 key 匹配:
key = md5(timestamp + your_salt_key)
您的 salt_key 显示在运营商后台。若校验失败,请返回 { "error": 2, "balance": 0 }。
完整载荷签名(推荐)。每个回调还会携带 X-Signature HTTP 头:以您的 salt_key 为密钥,对全部查询参数计算的 HMAC-SHA256(十六进制)。它覆盖 amount、action、username、call_id、timestamp 以及其他所有字段。签名字符串的构造方式:使用解码后的参数,按名称排序,以 name=value 形式用 & 连接:
X-Signature = hex( HMAC_SHA256( salt_key, "action=debit&amount=250&call_id=...¤cy=EUR&key=...×tamp=...&username=player123" ) )
所有回调均从固定 IPv4 地址 85.122.129.59 发出:您可以将其加入白名单并拒绝其他来源。
错误码
| 代码 | 含义 |
|---|---|
0 | 成功 |
1 | 余额不足(返回当前余额) |
2 | 处理错误 / 签名无效 / 玩家不存在 |
集成需要帮助?请通过 Telegram @mentionso 联系我们,或发送邮件至 [email protected]。
API 变更、新增游戏供应商和计划维护都会在我们的 Telegram 频道 @casinogamessoftware 发布。负责维护本集成的同事值得关注。