投递与重试
- 至少一次。 返回 2xx 即视为已送达。其他状态码、连接错误,或 10 秒内无响应,都算失败。
- 重试。 失败后,Kasskeep 依次在 1 分钟、5 分钟、30 分钟、2 小时、12 小时、24 小时和 24 小时后重试:共八次尝试,历时约两天半。之后事件标记为失败,但仍可从事件日志读取。
- id 稳定。 事件 id 由 App 和商店事件派生,所以同一次变化无论来自客户端提交、商店通知还是对账,都只有一个 id。
- 不保证顺序。 事件可能乱序到达。请依据
created_at和事件字段。 - 事件只投递到 App 当前的
webhook_url。没有配置地址的 App,事件只保存在日志里。
GET /v1/events 按创建顺序返回 App 的事件。可用于停机后补数据,或在不用回调的情况下处理事件。
curl "https://api.kasskeep.com/v1/events?after=0&limit=100" -H "Authorization: Bearer sk_..."{ "events": [ { "id": "evt_...", "type": "purchase", "...": "..." } ], "next_cursor": "42", "has_more": false }下次调用时把 next_cursor 作为 after 传入。游标是不透明的。limit 为 1 到 500,默认 100。测试事件不进日志。
curl -X POST https://api.kasskeep.com/v1/admin/tenants/<tenant_id>/apps/<app_id>/webhooks/test \ -H "Authorization: Bearer kkp_..."Kasskeep 用当前的回调签名密钥签一个 test 事件,带着与真实事件相同的请求头发出,最多等待 10 秒:
{ "event_id": "evt_...", "sent_at": "2026-11-06T08:00:00.000Z", "ok": true, "status": 200, "duration_ms": 87, "response_body": "ok", "error": null }response_body 是你的响应的前 500 字节,其中的密钥、token 和签名会被替换为 (redacted)。连接失败时,status 为 null,error 说明原因。测试投递不重试,也不写入日志。每个 App 每分钟最多发 10 次(超出返回 429 rate_limited),没有配置回调地址的 App 会收到 422 webhook_url_not_configured。需要 webhooks.test 权限(开发者及以上)。