Skip to content

Webhook 事件历史

查询当前账号的 webhook 投递历史。常用场景:

  • 排查"为什么我的 webhook 没收到"
  • 监控 dead_letter 状态的死信
  • 与本地业务记录对账

端点

MethodPOST
Path/api/v1/openapi/webhook_events/list
鉴权HMAC
幂等键不需要

请求字段

字段类型必填说明
event_typestring过滤事件类型,如 card.opened
statusint过滤投递状态(见下表)
pageint默认 1
page_sizeint默认 20,最大 100

投递状态

statusstatus_desc含义
0pending等待首次投递
1delivered投递成功
2failed_retry失败但仍在重试
3dead_letter已死信,不再重试
4skipped跳过(如 webhook URL 未配置)

请求示例

json
{ "event_type": "card.opened", "status": 1, "page": 1, "page_size": 20 }

响应字段

data.list[] 中每项:

字段类型说明
event_idstringevt_<uuid>(与 Webhook-Id 头去前缀后一致)
event_typestring事件类型
statusint见上表
status_descstring英文描述
attempt_countint已尝试次数
next_attempt_atstring nullable下次重试时间(RFC3339)
last_errorstring最近一次失败原因
last_response_statusint最近一次 HTTP 状态码(0 = 网络层失败)
delivered_atstring nullable投递成功时间
created_atstring事件创建时间

响应示例

json
{
  "code": 200,
  "message": "成功",
  "data": {
    "list": [
      {
        "event_id": "evt_550e8400-e29b-41d4-a716-446655440000",
        "event_type": "card.opened",
        "status": 1,
        "status_desc": "delivered",
        "attempt_count": 1,
        "next_attempt_at": null,
        "last_error": "",
        "last_response_status": 200,
        "delivered_at": "2026-04-29T11:00:13Z",
        "created_at": "2026-04-29T11:00:12Z"
      }
    ],
    "total": 12,
    "page": 1,
    "page_size": 20,
    "total_pages": 1,
    "has_next": false,
    "has_prev": false
  }
}

典型错误

HTTPmessage_key说明
401openapi_invalid_credentials鉴权失败
500openapi_list_webhook_events_failed服务端异常

排查 Webhook 投递问题

场景 1:本地一直没收到 webhook

bash
# 看是不是根本没投递
{ "status": 0 }    # 仍 pending → 系统侧延迟,等几秒再看
{ "status": 4 }    # skipped → 你 webhook URL 没配 / 已禁用

# 或失败重试中
{ "status": 2 }    # 看 last_error / last_response_status 判断

场景 2:怀疑漏事件

bash
# 列你的 card_id 相关事件
{ "event_type": "card.opened", "page_size": 100 }
# 与本地接收记录对账

场景 3:确认死信

bash
{ "status": 3 }
# 死信通常是:URL 永久 4xx / 永久 timeout / DNS 失败
# 修好接收器后,联系支持手动重投或忽略

采用 MIT 等价条款发布