使用指南

轮询已复核文档

说明外部 worker 如何轮询已在 Numora 中复核完成、可进入下游交付流程的文档。

适用范围

本页说明外部 worker(例如 n8n)应如何轮询 Numora 中已经完成复核、可进入下游交付的文档。

适用于以下场景:

  • 文档已经在 Numora 内完成处理与复核
  • 外部 worker 需要一个稳定的轮询读取口
  • 只有复核完成后才允许进入下游交付

完整的 outbox -> dispatch 集成模式见 n8n 出站交付

推荐接口

GET /v1/delivery/outbox?provider=dynamics365&limit=100

这是首阶段对外交付模型中推荐的轮询入口。

它会返回已经 reviewedfinalized、并且可进入下游交付流程的文档。

为什么推荐轮询 Outbox

相比自行扫描所有 documents,轮询 delivery/outbox 更安全,因为该接口已经应用了交付语义的过滤条件。

当前模型会排除已经处于以下状态的文档:

  • push_pending
  • push_succeeded

因此,worker 可以只关注仍待交付的 reviewed documents。

推荐轮询流程

  1. 每 5 到 10 分钟调度一次。
  2. GET /v1/delivery/outbox
  3. 读取返回的 data 数组。
  4. 对每个 item,调用 dispatch_url,或在外部执行目标系统写入。
  5. 如果响应里有 meta.next_cursor,下一次请求时原样带回。

请求示例

curl "https://api.numora.example/v1/delivery/outbox?provider=dynamics365&limit=100" \
  -H "Authorization: Bearer $NUMORA_API_KEY" \
  -H "x-request-id: reviewed-poll-001"

响应示例

{
  "data": [
    {
      "document_id": "4be38121-3791-4856-80d5-c57dbec2cf78",
      "schema": "invoice_v2",
      "status": "reviewed",
      "external_id": null,
      "metadata": {},
      "result_url": "/v1/documents/4be38121-3791-4856-80d5-c57dbec2cf78/result",
      "dispatch_url": "/v1/documents/4be38121-3791-4856-80d5-c57dbec2cf78/dispatch",
      "updated_at": "2026-03-24T02:36:37.684Z"
    }
  ],
  "meta": {
    "provider": "dynamics365",
    "next_cursor": null
  }
}

Cursor 处理规则

meta.next_cursor 是 opaque 值。

  • 不要自行解析
  • 不要修改内容
  • 下一次请求时原样带回

如果 next_cursornull,表示当前扫描窗口已经结束。

轮询后支持的两种交付路径

文档出现在 outbox 后,当前支持两条路径。

1. Numora 管理 dispatch

这是首阶段多租户模式下的推荐路径。

  1. 轮询 outbox
  2. POST /v1/documents/{id}/dispatch
  3. 轮询 GET /v1/documents/{id},直到状态离开 push_pending

2. 外部执行后 callback

只有当目标系统写入发生在 Numora 外部时才使用。

  1. 轮询 outbox
  2. GET /v1/documents/{id}/result
  3. 在外部写入目标系统
  4. POST /v1/documents/{id}/delivery

运行建议

  • 轮询应视为最终一致性的后台流程
  • 首次上线时建议保守控制并发
  • 建议记录 document_idx-request-id 以及返回的 run 标识,便于排障
  • 如果文档后续进入 push_failed,它可能在未来再次出现在轮询结果中

相关页面