构建机器人、叠加层、流工具以及与 D1Arena 数据的集成。
认证
所有 API 请求都需要在 X-API-Key / Authorization: Bearer 标头中传递 API 密钥。
要创建 API 密钥,请转到仪表板中的 开发者设置。您最多可以拥有 5 个钥匙。
429 Too Many Requests 和 Retry-After 标头。
基本网址
所有端点都返回 JSON。分页端点包括带有 current_page、last_page 和 total 的 meta 对象。
流
| 参数 | 类型 | 描述 |
|---|---|---|
category_id | integer | 按游戏/类别 ID 过滤 |
limit | integer | 每页结果(默认:20) |
page | integer | 页码 |
类别
| 参数 | 类型 | 描述 |
|---|---|---|
search | string | 按名称过滤类别 |
limit | integer | 每页结果(默认:50) |
用户
剪辑
| 参数 | 类型 | 描述 |
|---|---|---|
streamer_id | integer | 按主播用户 ID 过滤剪辑 |
category_id | integer | 按游戏/类别 ID 过滤 |
limit | integer | 每页结果(默认:20) |
锦标赛
| 参数 | 类型 | 描述 |
|---|---|---|
status | string | 按状态过滤(例如 open、in_progress、completed) |
league_id | integer | 按联赛 ID 过滤 |
limit | integer | 每页结果(默认:20) |
ELO排名
| 参数 | 类型 | 描述 |
|---|---|---|
category_id | integer | 按游戏/类别 ID 过滤 |
limit | integer | 结果数(默认:50) |
联赛
| 参数 | 类型 | 描述 |
|---|---|---|
status | string | 按联赛状态过滤 |
category_id | integer | 按游戏/类别 ID 过滤 |
limit | integer | 每页结果(默认:20) |
错误响应
所有错误都会返回一致的 JSON 信封。 error 对象始终包含机器可读的 code 和人类可读的 message。
状态代码
错误代码参考
| 验证码 | HTTP 状态 | 描述 |
|---|---|---|
invalid_api_key | 401 | API 密钥丢失、格式错误或不存在 |
api_key_disabled | 403 | API密钥已被撤销或禁用 |
not_found | 404 | 找不到所请求的资源 |
validation_error | 422 | 一个或多个请求参数无效 |
rate_limited | 429 | 超出此 API 密钥的请求速率限制 |
server_error | 500 | 内部服务器错误 - 请重试或联系支持人员 |
速率限制
每个 API 密钥的 API 请求受到速率限制。当超出限制时,请求将返回 429 Too Many Requests 和 Retry-After 标头。
按级别限制
| 等级 | 请求/分钟 (默认) | 最大按键数 |
|---|---|---|
| 起动机 (免费) | 60 | 5 |
| 专业版 | 60 | 5 |
| 终极版 | 60 | 5 |
| 伙伴 | 60 | 5 |
速率限制标头
每个 API 密钥的 API 请求受到速率限制。当超出限制时,请求将返回 429 Too Many Requests 和 Retry-After 标头。
| 标头 | 描述 |
|---|---|
Retry-After | 重试前等待的秒数(仅出现在 429 响应中) |
最佳实践
- Cache responses locally — stream and tournament data doesn't change every second.
- 订阅 webhooks 来获取实时事件,而不是轮询端点。
- 尽可能批量请求 - 使用过滤器参数以更少的调用次数准确获取您需要的内容。
Webhook(EventSub)
订阅实时推送通知而不是轮询。当事件发生时,D1Arena 会向您的回调 URL 发送一个 HTTP POST,其中包含使用 HMAC-SHA256 签名的 JSON 负载。
设置
在 开发者设置 中创建 webhook 订阅。每个订阅都需要:
- 回调地址 — 服务器上可公开访问的 HTTPS 端点。
- 活动 — 要订阅的一种或多种事件类型。
You'll receive a whsec_ signing secret upon creation. Store it securely — it's shown only once.
有效负载格式
每个 Webhook 传递都会发送一个具有以下结构的 JSON 正文:
标头
每个交付都包含以下用于路由和验证的标头:
| 标头 | 描述 |
|---|---|
Content-Type | application/json |
X-D1Arena-Event | 事件类型(例如 stream.online) |
X-D1Arena-Signature | 原始请求正文的 HMAC-SHA256 十六进制摘要 |
X-D1Arena-Signature-Version | 签名密钥格式:当前订阅为 v2,旧订阅为 v1-hashed-secret |
X-D1Arena-Delivery-Id | 唯一的交付 UUID — 用于重复数据删除 |
X-D1Arena-Timestamp | 发送事件时的 Unix 时间戳 |
验证签名
在处理 Webhook 之前,请务必验证 X-D1Arena-Signature 标头。签名计算为 HMAC-SHA256(raw_body, webhook_secret)。
对于 v2 交付,请使用创建订阅时显示的 whsec_ 密钥。对于升级前 v1-hashed-secret 交付,首先根据原始密钥计算 SHA256(whsec_secret) 并使用生成的小写十六进制摘要作为 HMAC 密钥。在可行时重新创建订阅以移动到 v2。
可用的活动
| 活动 | 描述 |
|---|---|
| stream.online | 主播上线了 |
| stream.offline | 一名主播下线了 |
| channel.follow | 用户关注频道 |
| channel.subscribe | 频道上有新的支持者订阅 |
| channel.tip | 一条提示已发送至主播 |
| tournament.started | 锦标赛比洞赛已经开始 |
| tournament.ended | 一场锦标赛已经结束 |
| tournament.match.completed | 记录了比赛结果 |
| clip.created | 从直播中创建了一个新剪辑 |
| overdrive.started | D1 频道开始疯狂 |
| overdrive.level_up | D1 疯狂晋级到下一个级别 |
| overdrive.ended | D1 疯狂已完成或已过期 |
事件负载示例
stream.online
stream.offline
channel.follow
channel.tip
tournament.match.completed
clip.created
交付和重试政策
| 尝试 | 延迟 | 注释 |
|---|---|---|
| 第一名(初始) | 立即 | 事件发生后几秒内发送 |
| 第二次(重试) | 30秒 | 如果第一次尝试失败或超时 |
| 第三次(重试) | 2分钟 | 指数退避 |
| 第四名(决赛) | 10分钟 | 标记为失败之前的最后一次尝试 |
2xx status within 10秒. Non-2xx responses or timeouts trigger a retry. After 连续10次失败, the subscription is automatically disabled. You'll receive an email notification and can re-enable it in 开发者设置.
最佳实践
- 始终验证签名 在处理有效负载之前以防止欺骗事件。
- 使用 Delivery-Id 进行重复数据删除 — 重试发送相同的 ID,因此存储已处理的 ID 以避免重复处理。
- 快速响应,异步处理 — 立即返回
200 OK并在后台作业中处理业务逻辑。 - 仅使用 HTTPS 端点 — Webhook URL 必须使用 TLS。 HTTP 回调被拒绝。
- 优雅地处理未知事件 — 可能会添加新的事件类型。返回
200表示无法识别的事件而不是错误。
D1 疯狂
D1 疯狂是由主播直播时的快速提示和订阅触发的。它分为 5 个级别,目标不断增加。
GET /api/overdrive/{streamerId}
为主播获取活跃的 D1 Frenzy。如果没有则返回 {"active": false}。
水平目标
| 等级 | 积分 |
|---|---|
| 1 | 100 |
| 2 | 250 |
| 3 | 500 |
| 4 | 1,000 |
| 5 | 2,000 |
D1 疯狂 — 积分: 提示 $1 → 100; 订阅 500 × 等级. 持续时间: 5 分钟; 冷却时间: 30 分钟.
扩展SDK
构建自定义面板和覆盖扩展,主播可以将其安装在其频道页面上。扩展程序在沙盒 iframe 中运行,并通过 postMessage 与主机页面通信。
开始使用
扩展类型
| 类型 | 地点 | 行为 |
|---|---|---|
panel | 流媒体播放器下方 | 直播时可见。全宽卡片,默认高度 300 像素。 |
overlay | 在视频播放器上 | 直播时可见。位置/大小由流光通过叠加定位工具控制。 |
发布消息API
您的扩展程序在加载时会自动接收上下文数据。实施这些事件:
为每条消息使用确切的 D1Arena 父源。官方 SDK 自动从嵌入页面派生并验证此来源。
由于扩展 iframe 有意使用不透明的沙箱源,因此 D1Arena 主机会验证确切注册的 iframe 窗口。在接受上下文之前,扩展代码仍然必须验证父窗口和确切的 D1Arena 来源。
1. 信号准备情况
2. 接收上下文
3. 发送操作(可选)
权限范围
声明您的扩展需要哪些数据。审阅者会验证您的代码是否符合您声明的权限。
| 范围 | 授予访问权限 |
|---|---|
read:stream | 流状态、标题、类别 |
read:viewers | 观看人数和列表 |
read:chat | 聊天消息(通过 Pusher 频道) |
read:clips | 通过 /api/clips/{slug} 频道剪辑 |
read:tournaments | 通过 /api/active-match/{id} 获取有效匹配信息 |
read:channel | 频道简介、关注者、时间表 |
安全要求
sandbox="allow-scripts" 的 沙盒 iframe 中运行。您的扩展程序 不能 访问 cookie、localStorage,或向 d1arena.com 发出经过身份验证的请求。
- 需要公共 HTTPS — 您的 iframe URL 必须使用 TLS 并仅解析为公共网络地址。
- 人类可读的源代码 — 没有混淆或缩小的 JavaScript。审阅者必须能够阅读您的代码。
- 无需加载外部脚本 除非您在提交的材料中声明。 CDN 库(jQuery、Chart.js 等)都很好。
- 无数据泄露 — 扩展程序不得将查看者数据发送到第三方分析或跟踪服务。
- 内容政策 — 没有广告、NSFW 内容、加密货币挖掘或恶意行为。
审核流程
| 状态 | 含义 |
|---|---|
| pending | 已提交,等待管理员审核(通常 1-3 个工作日)。 |
| approved | 已批准并在扩展市场中可见。 |
| rejected | 有理由拒绝。修复问题并重新提交。 |
| suspended | 因违反政策而被暂时删除。联系支持人员。 |
版本更新
要更新已批准的扩展,请删除当前版本并提交版本号递增的新版本。新版本再次审核。
变更日志
跟踪 API 更改和新功能。我们遵循语义版本控制,并至少提前 30 天宣布重大变更。
- 具有 API 密钥身份验证的初始公共 API 版本。
- 流:列出直播流,通过slug获取流媒体详细信息。
- 类别:搜索并列出所有游戏类别。
- 用户:包含竞技统计数据、ELO 评级和奖牌数的公开个人资料。
- 剪辑:浏览并检索带有主播/创作者信息的剪辑详细信息。
- 锦标赛:列出,按状态/联赛过滤,获取参与者计数。
- ELO 排行榜:全球和按类别排名的排行榜。
- 联赛:列出联赛的排名和积分明细。
- D1 疯狂:任何主播的实时疯狂状态。
- Webhooks (EventSub): 12 种事件类型,包括流、频道、锦标赛、剪辑和 Frenzy 事件。
- 速率限制
需要帮助吗?
关于 API 有疑问吗? 联系我们。