GET /v1/rates 返回的汇率)从当地货币折算为 USDT,并从您的
余额中扣除 usdt_amount + fee(如已配置固定费用)。
以下是完整的生命周期,包括每一步中您的余额发生的变化:
1. 查询可用通道
国家、货币和方式由 CBPay 定义。请始终查询目录:
可用性可能变化;目录(
GET /v1/payouts/methods)始终是唯一可信来源。
如果某个国家只有一种方式,method 为可选。每种方式的计费方式相同:
您的汇率 + 固定费用。
对于银行转账,您还需要银行目录(收款人的 bank_code 即来自这里):
2. 创建出金
每笔出金都会自动将收款人保存为联系人
(发送
"save_contact": false 可跳过)。若要再次向其付款而无需重新输入
资料,请发送 "beneficiary_contact_id" 代替 beneficiary —— 系统将使用
其在该国家和方式下最近保存的收款人信息(若不存在则返回
422 no_saved_destination)。202 Accepted:
total_debit 已从 available 转入
held(在 settlement_asset 对应的余额上)。
bank_reference —— 银行为该笔转账分配的交易编号。 US ACH/wire/SWIFT 在创建时立即返回 CBF(payout 保持 processing 直至银行确认);其他通道在完成前为空("");
当出金状态变为 completed 时,它会带上目的地银行/通道分配的交易编号。收款人可使用该编号
与自己的银行核对付款。该字段同时出现在 payout_status_changed Webhook、PDF 回执、
出金 CSV 导出以及对账单中。银行 tracking 标识与实时跟进
Payout 响应和payout_status_changed 会包含两个新增且不绑定具体提供
商的字段:
uetr是 UETR/SWIFT gpi 标识,仅在银行为 SWIFT 转账报告该值时出现。imad是国内 wire/ACH 标识,仅在银行报告该值时出现。- 两个字段在可用前均为
""。CBPay 不会推导或编造这些值。
manual_dispatch 术语或合规细节。
从其他余额支付(settlement_asset)
扣款默认来自 USD;使用 PUT /v1/settlement 更改。若要让单笔操作从其他余额支付,请在请求中加入
settlement_asset。示例:一笔 100,000 CLP 的出金从 BTC 余额支付,会经过
四次转换,全部记录在响应中:
- CLP → USDT,按您的汇率:
100000 / 950.25 = 105.235465 USDT。 - + 固定费用:
105.235465 + 0.30 = 105.535465 USDT(total_debit)。 - USDT → BTC,按实际结算价格(
settlement_rate109029.34070000):105.535465 / 109029.3407 = 0.00096795 BTC(向上取整到聪)。 - 以 BTC 扣款并冻结:
settlement_amount0.00096795从您的 BTC 余额中扣除;收款人照常收到其 100,000 CLP,分毫不差。
settlement_amount ——
绝不重新报价。如果当时 BTC/GOLD/SILVER/PLATINUM 的执行价格不可用,您会收到
503 pricing_unavailable;波动性资产还有单笔操作限额
(422 settlement_limit_exceeded;可在 GET /v1/settlement 中查询)。
有关 BOB、MXN 和 ARS 同币种法币 settlement 的 request/response 示例、
校验错误以及 rates 中的 same_currency_only 字段,请参阅
法币 payout 结算。
技术筛查可能处于 pending
CBPay 会在扣款或调用 core 之前筛查收款人。如果筛查服务暂时不可用,但 技术筛查队列可用,payout 会先持久化,创建请求返回202 Accepted,
资源状态为 pending:
receipt_url。使用相同幂等键 replay 会返回同一个 payout,并带有
idempotency_hit: true;绝不会创建第二笔。worker 收到 process 后,
原 payout 才进入正常扣款和派发流程。有效的 hold 会进入交易防火墙;
之后如果结果是 rejected,该 payout 会在不扣款的情况下变为 failed。
收到 process 后,同一个 payout 仍可能保持 status: "pending",同时
持久化协调扣款和派发。API 与 payout_status_changed webhook 会暴露以下
持久化转换码:
compliance_dispatch_pending:筛查通过,扣款/hold 已存在,因此funds_debited: true;core 派发尚未完成。compliance_dispatching:派发声明已取得,正在执行。core_unreachable:派发或本地结算结果不明确,等待协调;不要创建第二笔 payout。
idempotency_key,重新读取 payout 并
等待下一个状态事件。payout 进入终态后,completed 消耗 hold,
failed 退回精确扣款;终态事件使用持久化路径并携带正常的回执字段。
当 payout 无法写入 pending 队列,或流程本身没有该队列时,仍使用
compliance_check_unavailable 等现有技术错误。现有的校验、安全和
compliance_hold 合约不变。
扣款前失败不是退款
如果筛查或硬性合规控制在扣款路径开始前失败,同一 payout 可以以failed 结束,并带有 predebit_failure: true 和
funds_debited: false。响应及其 payout_status_changed 事件不包含
receipt_url,因为没有可撤销的扣款、hold 或回执。这不同于扣款后的
failed payout,后者会在终态事件前退回准确的扣款金额。
有关汇率来源和 FIFO 指示性报价,请参阅 Payout 汇率来源与 FIFO 指示性报价。
3. 接收最终状态
订阅payout_status_changed 事件(webhooks):
completed:资金已到账;冻结金额被消耗。failed:全部扣款自动退回(在您的账本中记为payout_refund)。
status_message 是与 status_code 一起返回的可选规范化详情;
核心没有额外消息时该字段可以为空。
您也可以随时查询:
出金状态
查询与历史记录
每笔出金都可以单独读取,列表接口支持筛选:from/to 使用 YYYY-MM-DD(组织时区,两端均含);日期无效时返回
400 invalid_range。method 按实时 payout 目录过滤,search 会对 payout ID、
银行参考号或幂等键进行不区分大小写的部分匹配。
各国示例
每条通道均附有其精确的beneficiary、完整的请求和真实的响应。汇率
(fx_rate)仅供参考 —— 实际始终采用 GET /v1/rates 返回的您账户的
汇率;扣款为 usdt_amount + fee(固定费用,如已配置;此处为 0.30)。
各通道的收款人字段
- 智利
- 秘鲁
- 墨西哥
- 委内瑞拉
- 玻利维亚
- 巴西
- 厄瓜多尔
- 巴拉圭
- 阿根廷
- 美国
以 CLP 进行银行转账。需要 RUT、银行和账户:智利比索没有小数单位,因此 CLP payout 金额必须为整数(例如 银行目录(
30000 或 30000.00)。GET /v1/payouts/banks?country=CL)列出当前有效的
bank_code 值。对于 CL/CLP/bank_transfer,payout 可能在约五分钟
的短窗口内批量派发;POST /v1/payouts 仍返回 202 与
status: "processing",每笔 payout 仍保留自己的最终状态和
payout_status_changed webhook。QR 出金
支付收款二维码(玻利维亚、巴西 PIX)现已拥有独立指南:QR 出金
免费扫描二维码,向用户展示收款人信息,再通过第二次调用确认支付 — 按普通出金计费。
常见错误
立即拒绝与后续失败
如果处理方在创建时就拒绝了出金,您会收到422,对象处于
status: failed,且退款已经完成。如果之后才失败(例如目标账户不存在),
webhook 会以 status: failed 送达,自动退款也在那一刻发生。
解读失败出金的 status_code
无论哪种情况,退款均已完成 —— 可通过
账户流水中的
payout_refund
条目进行核实。
处于
processing 状态的出金无法通过 API 取消:通道已经在处理它。请通过
webhook 或 GET 等待最终状态 —— 它一定会到达,失败时会自动退款。常见问题
我的余额什么时候被扣款?
我的余额什么时候被扣款?
创建时:payout 立即扣款并冻结资金。如果 payout 失败,精确的扣款金额
(含手续费)会自动退回。
可以取消 processing 中的 payout 吗?
可以取消 processing 中的 payout 吗?
不可以 —— 一旦派发到通道,它会自行解析为
completed 或 failed。订阅
payout_status_changed 获取最终状态。我的 payout 使用哪个汇率?
我的 payout 使用哪个汇率?
创建时报价的汇率(以
fx_rate 返回),对该笔操作冻结。你约定的点差
已包含在汇率中。可以用 USDT 以外的余额付款吗?
可以用 USDT 以外的余额付款吗?
可以 —— 设置账户级默认值(
PUT /v1/settlement)或按笔用
settlement_asset 覆盖(USDC、BTC、GOLD)。退款返回精确的结算金额,
绝不重新报价。status: pending 且 compliance_pending: true 是什么意思?
status: pending 且 compliance_pending: true 是什么意思?
收款人筛查暂时不可用,但 CBPay 已将 payout 持久化到技术筛查队列。
没有扣款、hold 或账本分录,core 尚未被调用,也没有
receipt_url。使用相同
幂等键 replay 会返回同一个资源。等待 payout_status_changed 或查询
payout;结果为 process 时继续,hold 时进入防火墙,rejected 时
在不扣款的情况下变为 failed。compliance_hold(403)是什么意思?
compliance_hold(403)是什么意思?
受益人未通过合规筛查:payout 未被创建,你的
idempotency_key 也未
被消耗。请核对受益人信息或联系你的 CBPay 团队。超时或 5xx 之后如何安全重试?
超时或 5xx 之后如何安全重试?
用相同的
idempotency_key 重试:会返回原始 payout
(idempotency_hit: true)—— 绝不会重复。新的 key 是一笔全新的独立
payout。为什么我的美国 ACH/wire/SWIFT payout 一直处于 processing?
为什么我的美国 ACH/wire/SWIFT payout 一直处于 processing?
创建时就已经返回
bank_reference(CBF)。payout 保持 processing,直到银行确认人工付款。
监听 payout_status_changed 以获得 completed 或 failed(已退款)。该通道没有额外的收款人 AML hold。目的地拒绝保护
部分银行通道会在银行近期拒绝某个目的地后保护该目的地。API 会在创建 payout、扣除余额或消耗幂等键之前返回422 destination_recently_rejected。明确重试使用新幂等键和
options.destination_retry_ack;完全相同的请求使用原幂等键重放。目的地
会被规范化,因此改变格式不能绕过保护。
详见目的地拒绝保护与安全重试,
其中包含完整请求、响应、状态和恢复顺序。
US/USD 付款用途与校验
对于US/USD 银行通道出金(ach、wire 和 swift),
options.purpose 为必填。API 不区分大小写,接受下列可见标签或对应代码:
只有当
purpose 为 Other 时才必须提供 options.purpose_detail,最长
140 个字符;其他用途提供该字段会被拒绝。创建请求缺少 purpose 现在返回
400 purpose_required,这是相对于过去默认 Invoice_Payment 的不兼容变更。
beneficiary.account_type 对 ach 和 wire 都是必填,值必须为
checking 或 savings(不区分大小写);swift 不使用此字段。
wire 和 swift 低于 USD 25 时返回 422 amount_below_minimum。
收款人或银行位于附录 B 国家(CU、IR、KP、SY)时返回
422 prohibited_country。这些校验都在扣款前完成。
规范化错误包括 invalid_beneficiary、invalid_amount、
amount_below_minimum、prohibited_country、purpose_required、
invalid_options 和 supporting_document_required。请按 message
修正具体字段;拒绝请求不要原样重试,timeout 或 5xx 时使用相同幂等键。
OTC 派发路径仍在内部使用 Invoice_Payment,公共 payout 合约不变。