{"openapi":"3.1.0","info":{"title":"BitriPay Gateway API","version":"2026-09-01","description":"One QR. One gateway. Every eligible rail. Amounts are integers in minor units. Every money-moving POST takes an Idempotency-Key: a replay returns the same object, a reuse with a different body or on a different endpoint is refused (409 `idempotency_key_reused`); keys expire after 24 h. Errors carry `code`, a stable `bp` family (BP-1xxx auth · 2xxx validation · 3xxx ledger · 4xxx rail · 5xxx compliance · 6xxx intelligence) and `message`. Platforms and aggregators: create your customers' accounts with `POST /accounts`, then send `BitriPay-Account: acct_…` with your own key on any operation to act for that customer (the customer is the merchant of record; `application_fee_minor` keeps your fee; their events reach your webhooks with `account`).","contact":{"url":"https://www.bitripay.com"}},"servers":[{"url":"https://www.bitripay.com/api/v1"},{"url":"https://www.bitripay.com/v1"}],"tags":[{"name":"Payment intents"},{"name":"Refunds"},{"name":"Checkout"},{"name":"Payment links"},{"name":"QR"},{"name":"Verifications (KODA)"},{"name":"Wallets"},{"name":"Transfers"},{"name":"Cross-border routes"},{"name":"Remittances"},{"name":"Bulk payouts"},{"name":"Agents"},{"name":"Subscriptions"},{"name":"Credit readiness"},{"name":"Payouts"},{"name":"Balance"},{"name":"Settlement"},{"name":"Disputes"},{"name":"Webhooks"},{"name":"Keys"},{"name":"Sandbox"},{"name":"Offline"},{"name":"Diaspora-Direct"},{"name":"National switch"},{"name":"Platform"},{"name":"FX"},{"name":"Money requests"},{"name":"Connected accounts"}],"paths":{"/payment_intents":{"post":{"tags":["Payment intents"],"summary":"Create a payment intent (returns checkout_url, qr_payload and client_secret)","operationId":"post_payment_intents","security":[{"apiKey":["payment_intents:write"]}],"x-scope":"payment_intents:write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount_minor":{"type":"integer"},"currency":{"type":"string"},"rails":{"type":"array","items":{"type":"string"}},"capture_method":{"enum":["automatic","manual"]},"payment_method_policy":{"enum":["smart","cheapest","fastest","most_reliable"]},"reference":{"type":"string"},"description":{"type":"string"},"purpose_code":{"enum":["GENERAL_MERCHANT","SCHOOL","HEALTH","RENT","UTILITY","CONSTRUCTION","GOVERNMENT_FEE","TAX","DONATION","REMITTANCE","TRANSPORT","MARKET"]},"expires_in_minutes":{"type":"integer"},"metadata":{"type":"object"},"customer_msisdn":{"type":"string"},"customer_country":{"type":"string"},"success_url":{"type":"string"},"cancel_url":{"type":"string"},"qr":{"type":"boolean"},"splits":{"type":"array","items":{"type":"object","properties":{"recipient":{"type":"string"},"bps":{"type":"integer"},"fixed_minor":{"type":"integer"},"label":{"type":"string"}}}},"application_fee_minor":{"type":"integer","description":"Platform fee kept when acting for a connected account (BitriPay-Account header); defaults to the account rate"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}},"get":{"tags":["Payment intents"],"summary":"List payment intents","operationId":"get_payment_intents","security":[{"apiKey":["payment_intents:read"]}],"x-scope":"payment_intents:read","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payment_intents/{id}":{"get":{"tags":["Payment intents"],"summary":"Retrieve a payment intent","operationId":"get_payment_intents_id","security":[{"apiKey":["payment_intents:read"]}],"x-scope":"payment_intents:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payment_intents/{id}/timeline":{"get":{"tags":["Payment intents"],"summary":"Every state change and attempt of an intent","operationId":"get_payment_intents_id_timeline","security":[{"apiKey":["payment_intents:read"]}],"x-scope":"payment_intents:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payment_intents/{id}/cancel":{"post":{"tags":["Payment intents"],"summary":"Cancel an intent that has not been captured","operationId":"post_payment_intents_id_cancel","security":[{"apiKey":["payment_intents:write"]}],"x-scope":"payment_intents:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payment_intents/{id}/methods":{"get":{"tags":["Payment intents"],"summary":"Payment methods available to the payer for this intent","operationId":"get_payment_intents_id_methods","security":[{"apiKey":["payment_intents:read"]}],"x-scope":"payment_intents:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payment_intents/{id}/refundable":{"get":{"tags":["Refunds"],"summary":"Amount still refundable on an intent","operationId":"get_payment_intents_id_refundable","security":[{"apiKey":["refunds:read"]}],"x-scope":"refunds:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payment_intents/{id}/splits":{"get":{"tags":["Payment intents"],"summary":"Split payouts made from a captured intent","operationId":"get_payment_intents_id_splits","security":[{"apiKey":["payment_intents:read"]}],"x-scope":"payment_intents:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/checkout_sessions":{"post":{"tags":["Checkout"],"summary":"Create a hosted checkout session with line items","operationId":"post_checkout_sessions","security":[{"apiKey":["checkout_sessions:write"]}],"x-scope":"checkout_sessions:write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}},"get":{"tags":["Checkout"],"summary":"List checkout sessions","operationId":"get_checkout_sessions","security":[{"apiKey":["payment_intents:read"]}],"x-scope":"payment_intents:read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/checkout_sessions/{id}":{"get":{"tags":["Checkout"],"summary":"Retrieve a checkout session","operationId":"get_checkout_sessions_id","security":[{"apiKey":["payment_intents:read"]}],"x-scope":"payment_intents:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/checkout_sessions/{id}/expire":{"post":{"tags":["Checkout"],"summary":"Expire an open session","operationId":"post_checkout_sessions_id_expire","security":[{"apiKey":["checkout_sessions:write"]}],"x-scope":"checkout_sessions:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payment_links":{"post":{"tags":["Payment links"],"summary":"Create a single-use or reusable payment link","operationId":"post_payment_links","security":[{"apiKey":["payment_links:write"]}],"x-scope":"payment_links:write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}},"get":{"tags":["Payment links"],"summary":"List payment links","operationId":"get_payment_links","security":[{"apiKey":["payment_links:write"]}],"x-scope":"payment_links:write","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payment_links/{id}/deactivate":{"post":{"tags":["Payment links"],"summary":"Deactivate a link","operationId":"post_payment_links_id_deactivate","security":[{"apiKey":["payment_links:write"]}],"x-scope":"payment_links:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/qr_codes":{"post":{"tags":["QR"],"summary":"Create a static BitriQR (EMVCo + signed extension)","operationId":"post_qr_codes","security":[{"apiKey":["qr_codes:write"]}],"x-scope":"qr_codes:write","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}},"get":{"tags":["QR"],"summary":"List QR codes","operationId":"get_qr_codes","security":[{"apiKey":["qr_codes:read"]}],"x-scope":"qr_codes:read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/qr_codes/analytics":{"get":{"tags":["QR"],"summary":"Scan analytics","operationId":"get_qr_codes_analytics","security":[{"apiKey":["qr_codes:read"]}],"x-scope":"qr_codes:read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/qr_codes/{id}/revoke":{"post":{"tags":["QR"],"summary":"Revoke a code (lost, stolen, tampered, replaced, retired)","operationId":"post_qr_codes_id_revoke","security":[{"apiKey":["qr_codes:write"]}],"x-scope":"qr_codes:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/resolve":{"post":{"tags":["QR"],"summary":"Resolve any scanned payload (public; trust from the key registry)","operationId":"post_resolve","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/keys":{"get":{"tags":["QR"],"summary":"Public signing-key registry (ed25519, ETag cached)","operationId":"get_keys","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/locations":{"post":{"tags":["QR"],"summary":"Create a merchant location","operationId":"post_locations","security":[{"apiKey":["qr_codes:write"]}],"x-scope":"qr_codes:write","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/locations/{id}/terminals":{"post":{"tags":["QR"],"summary":"Add a terminal to a location","operationId":"post_locations_id_terminals","security":[{"apiKey":["qr_codes:write"]}],"x-scope":"qr_codes:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/refunds":{"post":{"tags":["Refunds"],"summary":"Refund a captured intent (atomic reservation; wallet or processor)","operationId":"post_refunds","security":[{"apiKey":["refunds:write"]}],"x-scope":"refunds:write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"payment_intent":{"type":"string"},"amount_minor":{"type":"integer"},"reason":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}},"get":{"tags":["Refunds"],"summary":"List refunds","operationId":"get_refunds","security":[{"apiKey":["refunds:read"]}],"x-scope":"refunds:read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/refunds/{id}":{"get":{"tags":["Refunds"],"summary":"Retrieve a refund","operationId":"get_refunds_id","security":[{"apiKey":["refunds:read"]}],"x-scope":"refunds:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/verifications":{"post":{"tags":["Verifications (KODA)"],"summary":"Scan-to-Verify: did a payment reach me? (reference, or MSISDN + amount)","operationId":"post_verifications","security":[{"apiKey":["verifications:write"]}],"x-scope":"verifications:write","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/verifications/quota":{"get":{"tags":["Verifications (KODA)"],"summary":"Free quota and price","operationId":"get_verifications_quota","security":[{"apiKey":["verifications:write"]}],"x-scope":"verifications:write","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/wallets":{"get":{"tags":["Wallets"],"summary":"Wallet balances with the available amount after holds","operationId":"get_wallets","security":[{"apiKey":["wallets:read"]}],"x-scope":"wallets:read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/transfers/quote":{"post":{"tags":["Transfers"],"summary":"Quote a transfer with the full fee and FX disclosure, plus rails ranked by the smart router","operationId":"post_transfers_quote","security":[{"apiKey":["transfers:write"]}],"x-scope":"transfers:write","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount_minor":{"type":"integer"},"currency":{"type":"string"},"target_currency":{"type":"string"},"destination":{"type":"object"},"source_method":{"enum":["wallet","card","mobile_money","bank"]},"policy":{"enum":["smart","cheapest","fastest","most_reliable"]}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/transfers":{"post":{"tags":["Transfers"],"summary":"Send from the wallet to another BitriPay account","operationId":"post_transfers","security":[{"apiKey":["transfers:write"]}],"x-scope":"transfers:write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"to":{"type":"string"},"amount_minor":{"type":"integer"},"currency":{"type":"string"},"note":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/transfers/{id}":{"get":{"tags":["Transfers"],"summary":"Retrieve a transfer","operationId":"get_transfers_id","security":[{"apiKey":["transfers:read"]}],"x-scope":"transfers:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/routes/quote":{"post":{"tags":["Cross-border routes"],"summary":"Quote any → any: fund from the wallet or any card / bank / mobile money, deliver to a wallet, QR, bank account, mobile money number or agent anywhere, in the currency the recipient will receive; rate, margin and every fee disclosed","operationId":"post_routes_quote","security":[{"apiKey":["routes:read"]}],"x-scope":"routes:read","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount_minor":{"type":"integer"},"currency":{"type":"string"},"target_currency":{"type":"string"},"source":{"type":"object","properties":{"method":{"enum":["wallet","card","bank","mobile_money"]},"gateway":{"type":"string"},"operator_id":{"type":"string"}}},"destination":{"type":"object","properties":{"method":{"enum":["wallet","qr","mobile_money","bank","agent","keep"]}}}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/routes/payout-currencies":{"post":{"tags":["Cross-border routes"],"summary":"Which currencies the recipient can receive for a destination right now (corridor rules, licence, liquidity)","operationId":"post_routes_payout-currencies","security":[{"apiKey":["routes:read"]}],"x-scope":"routes:read","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount_minor":{"type":"integer"},"currency":{"type":"string"},"destination":{"type":"object"},"requested":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/routes":{"post":{"tags":["Cross-border routes"],"summary":"Create a route: the funding leg runs through the processor (card / bank / mobile money) or the wallet, the payout leg follows automatically once funds are confirmed","operationId":"post_routes","security":[{"apiKey":["routes:write"]}],"x-scope":"routes:write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount_minor":{"type":"integer"},"currency":{"type":"string"},"target_currency":{"type":"string"},"source":{"type":"object"},"destination":{"type":"object"},"note":{"type":"string"},"quote_id":{"type":"string"},"source_of_funds":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}},"get":{"tags":["Cross-border routes"],"summary":"List routes","operationId":"get_routes","security":[{"apiKey":["routes:read"]}],"x-scope":"routes:read","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/routes/{id}":{"get":{"tags":["Cross-border routes"],"summary":"Retrieve a route with its stage, quote, funding payment and payout","operationId":"get_routes_id","security":[{"apiKey":["routes:read"]}],"x-scope":"routes:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/routes/{id}/receipt":{"get":{"tags":["Cross-border routes"],"summary":"Receipt for a settled route","operationId":"get_routes_id_receipt","security":[{"apiKey":["routes:read"]}],"x-scope":"routes:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/routes/{id}/cancel":{"post":{"tags":["Cross-border routes"],"summary":"Cancel before the payout is executed (funds return; card funding refunded where the processor allows)","operationId":"post_routes_id_cancel","security":[{"apiKey":["routes:write"]}],"x-scope":"routes:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/remittances/quote":{"get":{"tags":["Remittances"],"summary":"Quote an international transfer","operationId":"get_remittances_quote","security":[{"apiKey":["remittances:read"]}],"x-scope":"remittances:read","parameters":[{"name":"amount_minor","in":"query","required":false,"schema":{"type":"string"}},{"name":"currency","in":"query","required":false,"schema":{"type":"string"}},{"name":"target_currency","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/remittances":{"post":{"tags":["Remittances"],"summary":"Send an international transfer to a wallet, bank account, mobile money number or cash pickup in the recipient currency; add a `source` (any card, bank or mobile money) to fund it through a processor instead of the wallet","operationId":"post_remittances","security":[{"apiKey":["remittances:write"]}],"x-scope":"remittances:write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount_minor":{"type":"integer"},"currency":{"type":"string"},"target_currency":{"type":"string"},"payout_method":{"enum":["wallet","bank","mobile_money","cash_pickup"]},"recipient":{"type":"object","properties":{"name":{"type":"string"},"country":{"type":"string"},"phone":{"type":"string"},"tag":{"type":"string"},"operator_id":{"type":"string"},"bank_name":{"type":"string"},"account_number":{"type":"string"},"bank_account_id":{"type":"string"}}},"source":{"type":"object","properties":{"method":{"enum":["wallet","card","bank","mobile_money"]},"card":{"type":"object"},"saved_card_id":{"type":"string"},"gateway":{"type":"string"},"operator_id":{"type":"string"},"phone":{"type":"string"}}},"note":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}},"get":{"tags":["Remittances"],"summary":"List remittances","operationId":"get_remittances","security":[{"apiKey":["remittances:read"]}],"x-scope":"remittances:read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payouts/batches/columns":{"get":{"tags":["Bulk payouts"],"summary":"CSV columns accepted for a batch upload","operationId":"get_payouts_batches_columns","security":[{"apiKey":["payouts:read"]}],"x-scope":"payouts:read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payouts/batches":{"post":{"tags":["Bulk payouts"],"summary":"Upload a payout batch (rows or CSV); every row is validated and the totals are returned before approval","operationId":"post_payouts_batches","security":[{"apiKey":["payouts:write"]}],"x-scope":"payouts:write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"currency":{"type":"string"},"rows":{"type":"array","items":{"type":"object"}},"csv":{"type":"string"},"reference":{"type":"string"},"note":{"type":"string"},"skip_invalid":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}},"get":{"tags":["Bulk payouts"],"summary":"List payout batches","operationId":"get_payouts_batches","security":[{"apiKey":["payouts:read"]}],"x-scope":"payouts:read","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payouts/batches/{id}":{"get":{"tags":["Bulk payouts"],"summary":"Retrieve a batch with its rows and readiness (funds, invalid rows, approval rule)","operationId":"get_payouts_batches_id","security":[{"apiKey":["payouts:read"]}],"x-scope":"payouts:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payouts/batches/{id}/approve":{"post":{"tags":["Bulk payouts"],"summary":"Approve and execute a batch: four-eyes by another account holder, or the creator under PIN / passkey step-up","operationId":"post_payouts_batches_id_approve","security":[{"apiKey":["payouts:approve"]}],"x-scope":"payouts:approve","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pin":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payouts/batches/{id}/cancel":{"post":{"tags":["Bulk payouts"],"summary":"Cancel a batch awaiting approval","operationId":"post_payouts_batches_id_cancel","security":[{"apiKey":["payouts:write"]}],"x-scope":"payouts:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/ai/{agent}":{"post":{"tags":["Agents"],"summary":"Run an agent (canonical names such as RouteOptimiser, FraudScorer, SavingsAdvisor accepted); metered in ACU, provider and model never disclosed","operationId":"post_ai_agent","security":[{"apiKey":["ai:run"]}],"x-scope":"ai:run","parameters":[{"name":"agent","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"input":{"type":"string"},"context":{"type":"object"},"depth":{"enum":["standard","deep"]},"wait":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/ai/runs/{id}":{"get":{"tags":["Agents"],"summary":"Retrieve an agent run","operationId":"get_ai_runs_id","security":[{"apiKey":["ai:run"]}],"x-scope":"ai:run","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/plans":{"get":{"tags":["Subscriptions"],"summary":"List your subscription plans","operationId":"get_plans","security":[{"apiKey":["subscriptions:read"]}],"x-scope":"subscriptions:read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["Subscriptions"],"summary":"Create a plan (interval, trial, tax, metered usage)","operationId":"post_plans","security":[{"apiKey":["subscriptions:write"]}],"x-scope":"subscriptions:write","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"currency":{"type":"string"},"amount_minor":{"type":"integer"},"interval":{"enum":["day","week","month","year"]},"interval_count":{"type":"integer"},"trial_days":{"type":"integer"},"tax_bps":{"type":"integer"},"tax_label":{"type":"string"},"usage_unit":{"type":"string"},"usage_price_minor":{"type":"integer"},"code":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/plans/{id}":{"get":{"tags":["Subscriptions"],"summary":"Retrieve a plan","operationId":"get_plans_id","security":[{"apiKey":["subscriptions:read"]}],"x-scope":"subscriptions:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/plans/{id}/archive":{"post":{"tags":["Subscriptions"],"summary":"Stop offering a plan (existing subscriptions continue)","operationId":"post_plans_id_archive","security":[{"apiKey":["subscriptions:write"]}],"x-scope":"subscriptions:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/subscriptions":{"get":{"tags":["Subscriptions"],"summary":"List subscriptions with a billing overview (recurring revenue, collections, dunning)","operationId":"get_subscriptions","security":[{"apiKey":["subscriptions:read"]}],"x-scope":"subscriptions:read","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/subscriptions/{id}":{"get":{"tags":["Subscriptions"],"summary":"Retrieve a subscription with its invoices","operationId":"get_subscriptions_id","security":[{"apiKey":["subscriptions:read"]}],"x-scope":"subscriptions:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/subscriptions/{id}/usage":{"post":{"tags":["Subscriptions"],"summary":"Record metered usage for the current period","operationId":"post_subscriptions_id_usage","security":[{"apiKey":["subscriptions:write"]}],"x-scope":"subscriptions:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"quantity":{"type":"integer"},"note":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/subscriptions/{id}/cancel":{"post":{"tags":["Subscriptions"],"summary":"Cancel at period end (or immediately)","operationId":"post_subscriptions_id_cancel","security":[{"apiKey":["subscriptions:write"]}],"x-scope":"subscriptions:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"immediately":{"type":"boolean"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/invoices":{"get":{"tags":["Subscriptions"],"summary":"List invoices","operationId":"get_invoices","security":[{"apiKey":["subscriptions:read"]}],"x-scope":"subscriptions:read","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/credit_readiness/{code}":{"get":{"tags":["Credit readiness"],"summary":"Read a consented credit-readiness signal (score, band, factors); never the transactions, never a lending decision","operationId":"get_credit_readiness_code","security":[{"apiKey":["credit:read"]}],"x-scope":"credit:read","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payouts":{"post":{"tags":["Payouts"],"summary":"Pay out to a bank account or mobile-money number","operationId":"post_payouts","security":[{"apiKey":["payouts:write"]}],"x-scope":"payouts:write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}},"get":{"tags":["Payouts"],"summary":"List payouts","operationId":"get_payouts","security":[{"apiKey":["payouts:read"]}],"x-scope":"payouts:read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/balance":{"get":{"tags":["Balance"],"summary":"Balance classes: available, pending, reserved, settlement_pending, held, disputed, frozen","operationId":"get_balance","security":[{"apiKey":["balance:read"]}],"x-scope":"balance:read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/settlement_profiles":{"get":{"tags":["Settlement"],"summary":"Settlement profiles per rail and currency","operationId":"get_settlement_profiles","security":[{"apiKey":["settlements:read"]}],"x-scope":"settlements:read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["Settlement"],"summary":"Create or update a profile (T0/T1/T2/weekly/manual, cut-off, destination, minimum)","operationId":"post_settlement_profiles","security":[{"apiKey":["settlements:write"]}],"x-scope":"settlements:write","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/settlement_calendar":{"get":{"tags":["Settlement"],"summary":"Upcoming cut-offs, obligations and recent cycles","operationId":"get_settlement_calendar","security":[{"apiKey":["settlements:read"]}],"x-scope":"settlements:read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/settlement_cycles":{"get":{"tags":["Settlement"],"summary":"List cycles","operationId":"get_settlement_cycles","security":[{"apiKey":["settlements:read"]}],"x-scope":"settlements:read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["Settlement"],"summary":"Close the running period now (optionally pay)","operationId":"post_settlement_cycles","security":[{"apiKey":["settlements:write"]}],"x-scope":"settlements:write","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/settlement_cycles/{id}/statement":{"get":{"tags":["Settlement"],"summary":"Numbered, hashed statement (format=json|csv|pdf)","operationId":"get_settlement_cycles_id_statement","security":[{"apiKey":["settlements:read"]}],"x-scope":"settlements:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"format","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/settlement_cycles/{id}/pay":{"post":{"tags":["Settlement"],"summary":"Pay a closed cycle to its destination","operationId":"post_settlement_cycles_id_pay","security":[{"apiKey":["settlements:write"]}],"x-scope":"settlements:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/disputes":{"get":{"tags":["Disputes"],"summary":"Disputes against my payments","operationId":"get_disputes","security":[{"apiKey":["disputes:read"]}],"x-scope":"disputes:read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["Disputes"],"summary":"Open a dispute on a payment I received","operationId":"post_disputes","security":[{"apiKey":["disputes:write"]}],"x-scope":"disputes:write","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/disputes/{id}/respond":{"post":{"tags":["Disputes"],"summary":"Respond with evidence before the deadline","operationId":"post_disputes_id_respond","security":[{"apiKey":["disputes:write"]}],"x-scope":"disputes:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/webhook_endpoints":{"post":{"tags":["Webhooks"],"summary":"Create an endpoint (returns whsec_ secret once)","operationId":"post_webhook_endpoints","security":[{"apiKey":["webhooks:manage"]}],"x-scope":"webhooks:manage","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/webhook_endpoints/{id}/deliveries":{"get":{"tags":["Webhooks"],"summary":"Deliveries with attempts and status","operationId":"get_webhook_endpoints_id_deliveries","security":[{"apiKey":["webhooks:manage"]}],"x-scope":"webhooks:manage","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/webhook_deliveries/{id}/replay":{"post":{"tags":["Webhooks"],"summary":"Replay a delivery","operationId":"post_webhook_deliveries_id_replay","security":[{"apiKey":["webhooks:manage"]}],"x-scope":"webhooks:manage","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/events":{"get":{"tags":["Webhooks"],"summary":"Event log","operationId":"get_events","security":[{"apiKey":["events:read"]}],"x-scope":"events:read","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/events/{id}/replay":{"post":{"tags":["Webhooks"],"summary":"Replay an event to every endpoint","operationId":"post_events_id_replay","security":[{"apiKey":["webhooks:manage"]}],"x-scope":"webhooks:manage","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/api_keys":{"get":{"tags":["Keys"],"summary":"List API keys (session only; keys cannot mint keys)","operationId":"get_api_keys","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}},"post":{"tags":["Keys"],"summary":"Create sk_ / rk_ / pk_ key with scopes","operationId":"post_api_keys","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/sandbox":{"get":{"tags":["Sandbox"],"summary":"Magic MSISDNs and simulated outcomes","operationId":"get_sandbox","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/offline/devices":{"post":{"tags":["Offline"],"summary":"Register a device offline subkey (ed25519 SPKI, 72h)","operationId":"post_offline_devices","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/offline/qr":{"post":{"tags":["Offline"],"summary":"Server-signed offline QR with nonce","operationId":"post_offline_qr","security":[{"apiKey":["qr_codes:write"]}],"x-scope":"qr_codes:write","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/offline/nonces":{"post":{"tags":["Offline"],"summary":"Prefetch nonces for a merchant device","operationId":"post_offline_nonces","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/offline/sync":{"post":{"tags":["Offline"],"summary":"Submit signed promises in order; each is SETTLED, REJECTED (with restoreMinor) or DUPLICATE","operationId":"post_offline_sync","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/offline/promises":{"get":{"tags":["Offline"],"summary":"My offline promises","operationId":"get_offline_promises","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/diaspora/rate-cards":{"get":{"tags":["Diaspora-Direct"],"summary":"Published, platform-signed rate cards (≤ 4h validity)","operationId":"get_diaspora_rate-cards","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/institutions":{"get":{"tags":["Diaspora-Direct"],"summary":"Verified institutions and their purpose codes","operationId":"get_institutions","parameters":[{"name":"country","in":"query","required":false,"schema":{"type":"string"}},{"name":"purpose","in":"query","required":false,"schema":{"type":"string"}},{"name":"q","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/diaspora/quotes":{"post":{"tags":["Diaspora-Direct"],"summary":"Purpose-locked quote at the current rate card","operationId":"post_diaspora_quotes","parameters":[],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/diaspora/quotes/{id}/pay":{"post":{"tags":["Diaspora-Direct"],"summary":"Pay a quote from the source-currency wallet","operationId":"post_diaspora_quotes_id_pay","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payments":{"post":{"tags":["National switch"],"summary":"Create an interinstitutional payment (IDM-001/002/003; route computed server-side)","operationId":"post_payments","security":[{"apiKey":["payments:create"]}],"x-scope":"payments:create","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payments/{id}":{"get":{"tags":["National switch"],"summary":"Five status dimensions and journal","operationId":"get_payments_id","security":[{"apiKey":["payments:read"]}],"x-scope":"payments:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payments/{id}/cancel":{"post":{"tags":["National switch"],"summary":"Cancel before emission (never after)","operationId":"post_payments_id_cancel","security":[{"apiKey":["payments:cancel"]}],"x-scope":"payments:cancel","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/status":{"get":{"tags":["Platform"],"summary":"Operating state (guardian mode, degraded flags)","operationId":"get_status","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payment_intents/{id}/capture":{"post":{"tags":["Payment intents"],"summary":"Capture an AUTHORISED intent (capture_method manual); optional partial amount, the rest returns to the payer","operationId":"post_payment_intents_id_capture","security":[{"apiKey":["payment_intents:write"]}],"x-scope":"payment_intents:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount_minor":{"type":"integer"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/refunds/{id}/reject":{"post":{"tags":["Refunds"],"summary":"Reject a refund awaiting execution (REQUESTED / APPROVED): reservation released, intent keeps its prior state","operationId":"post_refunds_id_reject","security":[{"apiKey":["refunds:write"]}],"x-scope":"refunds:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","minLength":3,"maxLength":200}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payment_resolution":{"get":{"tags":["Verifications (KODA)"],"summary":"Did this payment happen? CONFIRMED (ledger posting), PENDING, AMBIGUOUS or NOT_FOUND, with the matches","operationId":"get_payment_resolution","security":[{"apiKey":["verifications:write"]}],"x-scope":"verifications:write","parameters":[{"name":"reference","in":"query","required":false,"schema":{"type":"string"}},{"name":"msisdn","in":"query","required":false,"schema":{"type":"string"}},{"name":"amount_minor","in":"query","required":false,"schema":{"type":"string"}},{"name":"currency","in":"query","required":false,"schema":{"type":"string"}},{"name":"window_hours","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/fx/quotes":{"post":{"tags":["FX"],"summary":"Lock an FX quote (mid-market rate, margin, fee, recipient amount); usable as quote_id on transfers and routes","operationId":"post_fx_quotes","security":[{"apiKey":["transfers:write"]}],"x-scope":"transfers:write","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"amount_minor":{"type":"integer"},"currency":{"type":"string"},"target_currency":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/fx/quotes/{id}":{"get":{"tags":["FX"],"summary":"Retrieve an FX quote (LOCKED, INDICATIVE or EXPIRED)","operationId":"get_fx_quotes_id","security":[{"apiKey":["transfers:read"]}],"x-scope":"transfers:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/money_requests":{"post":{"tags":["Money requests"],"summary":"Request a payment from a named payer (@tag, phone or email)","operationId":"post_money_requests","security":[{"apiKey":["payment_intents:write"]}],"x-scope":"payment_intents:write","parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"payer":{"type":"string"},"amount_minor":{"type":"integer"},"currency":{"type":"string"},"description":{"type":"string"},"expires_in_minutes":{"type":"integer"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/money_requests/{code}":{"get":{"tags":["Money requests"],"summary":"Retrieve a money request (requester or payer)","operationId":"get_money_requests_code","security":[{"apiKey":["payment_intents:read"]}],"x-scope":"payment_intents:read","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/money_requests/{code}/cancel":{"post":{"tags":["Money requests"],"summary":"Cancel an unpaid money request","operationId":"post_money_requests_code_cancel","security":[{"apiKey":["payment_intents:write"]}],"x-scope":"payment_intents:write","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/transactions/{id}":{"get":{"tags":["Balance"],"summary":"A ledger transaction with its balanced entries and the payment intent it settled","operationId":"get_transactions_id","security":[{"apiKey":["balance:read"]}],"x-scope":"balance:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/api_keys/{id}/rotate":{"post":{"tags":["Keys"],"summary":"Rotate a key (same label, kind, scopes, allowlist; old secret revoked). Live keys need PIN / passkey step-up (403 step_up_required)","operationId":"post_api_keys_id_rotate","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"pin":{"type":"string"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/webhook_events/types":{"get":{"tags":["Webhooks"],"summary":"Event catalogue with the receiver rules (`notes`): at-least-once, dedupe by event id","operationId":"get_webhook_events_types","parameters":[],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/settlements/{id}":{"get":{"tags":["Settlement"],"summary":"A settlement (cycle) with its items and statement summary: provider fee, BitriPay fee and tax on it as separate lines, plus the disclosed conversion when the settlement currency differs","operationId":"get_settlements_id","security":[{"apiKey":["settlements:read"]}],"x-scope":"settlements:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/settlement_profiles/{id}/preview":{"get":{"tags":["Settlement"],"summary":"What the next cycle of a profile would settle now: collection-currency totals with the fee lines, and the conversion into the settlement currency (rate, mid rate, margin bps)","operationId":"get_settlement_profiles_id_preview","security":[{"apiKey":["settlements:read"]}],"x-scope":"settlements:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/settlement_profiles/{id}":{"get":{"tags":["Settlement"],"summary":"Retrieve a settlement profile (settlement_currency, auto_convert)","operationId":"get_settlement_profiles_id","security":[{"apiKey":["settlements:read"]}],"x-scope":"settlements:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payment_intents/{id}/split_refunds":{"get":{"tags":["Payment intents"],"summary":"What each split recipient gave back on the refunds of an intent (pro_rata) or kept (merchant_absorbs)","operationId":"get_payment_intents_id_split_refunds","security":[{"apiKey":["payment_intents:read"]}],"x-scope":"payment_intents:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"refund","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/payment_intents/{id}/split_refunds/retry":{"post":{"tags":["Payment intents"],"summary":"Retry failed split refund recoveries","operationId":"post_payment_intents_id_split_refunds_retry","security":[{"apiKey":["payment_intents:write"]}],"x-scope":"payment_intents:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/accounts":{"post":{"tags":["Connected accounts"],"summary":"Create a customer's merchant account (user, organisation, wallets) that your key can act for with the BitriPay-Account header","operationId":"post_accounts","security":[{"apiKey":["accounts:write"]}],"x-scope":"accounts:write","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"business_name":{"type":"string"},"type":{"enum":["merchant","corporate","ngo","government","developer"]},"email":{"type":"string"},"phone":{"type":"string"},"country":{"type":"string"},"application_fee_bps":{"type":"integer","description":"Default platform fee in basis points, kept from each payment at capture (0–5000)"},"metadata":{"type":"object"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}},"get":{"tags":["Connected accounts"],"summary":"List your connected accounts","operationId":"get_accounts","security":[{"apiKey":["accounts:read"]}],"x-scope":"accounts:read","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/accounts/{id}":{"get":{"tags":["Connected accounts"],"summary":"A connected account: status, verification, onboarding, balances","operationId":"get_accounts_id","security":[{"apiKey":["accounts:read"]}],"x-scope":"accounts:read","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}},"patch":{"tags":["Connected accounts"],"summary":"Change the default application fee or metadata","operationId":"patch_accounts_id","security":[{"apiKey":["accounts:write"]}],"x-scope":"accounts:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"application_fee_bps":{"type":"integer"},"metadata":{"type":"object"}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"4XX":{"$ref":"#/components/responses/Error"}}}},"/accounts/{id}/account_links":{"post":{"tags":["Connected accounts"],"summary":"A one-time claim link (7 days) the customer opens to set a password and own the account","operationId":"post_accounts_id_account_links","security":[{"apiKey":["accounts:write"]}],"x-scope":"accounts:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}},"/accounts/{id}/detach":{"post":{"tags":["Connected accounts"],"summary":"End your access; the account, its keys and its money stay the customer's","operationId":"post_accounts_id_detach","security":[{"apiKey":["accounts:write"]}],"x-scope":"accounts:write","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Created"},"4XX":{"$ref":"#/components/responses/Error"}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"sk_live_/sk_test_ secret keys, rk_ restricted keys with scopes (wallets:read, transfers:read, transfers:write, remittances:read, remittances:write, payouts:approve, ai:run, subscriptions:read, subscriptions:write, credit:read, routes:read, routes:write, payment_intents:read, payment_intents:write, checkout_sessions:write, payment_links:write, qr_codes:read, qr_codes:write, refunds:read, refunds:write, verifications:write, payouts:read, payouts:write, balance:read, webhooks:manage, events:read, payments:create, payments:read, payments:cancel, refunds:create, participants:read, qr:create, reconciliation:read, bindings:manage, settlements:read, settlements:write, disputes:read, disputes:write, accounts:read, accounts:write), pk_ publishable keys."}},"schemas":{"Money":{"type":"object","properties":{"valueMinor":{"type":"integer"},"currency":{"type":"string","minLength":3,"maxLength":3}}},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"bp":{"type":"string","enum":["BP-1001","BP-1002","BP-1003","BP-1004","BP-1005","BP-1006","BP-1007","BP-1008","BP-1010","BP-2001","BP-2002","BP-2003","BP-2004","BP-2005","BP-2006","BP-2007","BP-3001","BP-3002","BP-3003","BP-3004","BP-3005","BP-3006","BP-3007","BP-3008","BP-4001","BP-4002","BP-4003","BP-4004","BP-4005","BP-5001","BP-5002","BP-5003","BP-5004","BP-5005","BP-5006","BP-5007","BP-5008","BP-5009","BP-5010","BP-5011","BP-5012","BP-5013","BP-6001","BP-6002","BP-6003","BP-6004","BP-6005","BP-6006"]},"message":{"type":"string"},"details":{}}}}}},"responses":{"Error":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-webhooks":{"signature":"BitriPay-Signature: t=<unix>,v1=<hex hmac-sha256(secret, `${t}.${rawBody}`)> and BitriPay-Signature-Ed25519: keyId,t,sig (platform key)","retries":"10s, 30s, 2m, 10m, 30m, then every 2h for 24h","events":[{"type":"payout_batch.created","description":"A bulk payout batch was uploaded and validated; it waits for approval."},{"type":"subscription.created","description":"A customer subscribed to one of your plans (mandate confirmed)."},{"type":"subscription.cancelled","description":"A subscription was cancelled by the customer, by you, or after dunning."},{"type":"invoice.paid","description":"A subscription invoice was collected from the customer wallet."},{"type":"invoice.payment_failed","description":"A collection attempt failed; dunning retries follow (1, 3, 7 days)."},{"type":"payout_batch.executed","description":"A bulk payout batch ran: paid, partial or failed, with per-row outcomes on the batch."},{"type":"payment_intent.created","description":"An intent was created (API, QR, link, checkout session or USSD)."},{"type":"payment_intent.requires_action","description":"The payer must authorise the payment (PIN, prompt, redirect)."},{"type":"payment_intent.processing","description":"An attempt is in flight on a rail. Do not create a second payment."},{"type":"payment_intent.authorised","description":"The payer authorised the payment and the funds are held (capture_method manual). Capture it with POST /payment_intents/{id}/capture, or cancel to void."},{"type":"payment_intent.succeeded","description":"Captured and posted to the ledger. Ship the goods."},{"type":"payment_intent.settled","description":"Funds settled to the merchant balance."},{"type":"payment_intent.failed","description":"The intent ended without a capture (declined, expired, cancelled)."},{"type":"payment_intent.cancelled","description":"The merchant cancelled the intent before capture."},{"type":"payment_intent.expired","description":"The intent expired without capture."},{"type":"payment_intent.ambiguous_hold","description":"The provider could not say whether money moved. Funds are in suspense; a human or reconciliation resolves it. Do not retry."},{"type":"payment_intent.disputed","description":"A dispute or chargeback was opened on the payment."},{"type":"dispute.opened","description":"A dispute object was created on one of your payments (same moment as payment_intent.disputed; carries the dispute)."},{"type":"refund.created","description":"A refund object was created."},{"type":"refund.updated","description":"A refund moved state. `status` is the stored value (REQUESTED, PENDING, MANUAL, SUCCEEDED, FAILED, REJECTED); `lifecycle` maps it to REQUESTED → APPROVED → PROCESSING → SUCCEEDED | FAILED | REJECTED, plus REVERSED."},{"type":"refund.succeeded","description":"The refund was executed and posted."},{"type":"refund.failed","description":"The refund could not be executed."},{"type":"checkout.session.completed","description":"A hosted checkout session was paid."},{"type":"checkout.session.expired","description":"A hosted checkout session expired unpaid."},{"type":"verification.completed","description":"A Scan-to-Verify (KODA) request produced a result."},{"type":"verification.confirmed","description":"A Scan-to-Verify (KODA) request found the payment settled on the ledger (VERIFIED). Sent next to verification.completed."},{"type":"payout.created","description":"A payout request was accepted."},{"type":"payout.processing","description":"The payout was handed to the payout network (queued to a prefunded account or agent) and is being executed."},{"type":"payout.completed","description":"A payout was paid out."},{"type":"payout.succeeded","description":"The payout was paid out (same moment as payout.completed)."},{"type":"payout.settled","description":"The payout left the platform ledger for good: the withdrawal posted to the treasury and the funds are with the recipient rail."},{"type":"payout.failed","description":"A payout was rejected or failed."},{"type":"settlement.created","description":"A settlement cycle was closed: the collections of the period were netted (gross, fees, refunds, splits, holds) and the statement is available."},{"type":"settlement.completed","description":"A settlement cycle was paid to its destination (or kept available in the wallet for wallet settlement)."},{"type":"payment.completed","description":"Legacy event: a payment request was paid (kept for existing integrations)."},{"type":"payment_request.created","description":"Legacy event: an API or link payment request was created."},{"type":"reconciliation.exception","description":"Reconciliation found a discrepancy involving one of your payments."},{"type":"payment.created","description":"National switch payment created (durable intent received)."},{"type":"payment.action_required","description":"National switch payment needs payer consent or authentication before it can be sent."},{"type":"payment.pending","description":"National switch payment transmitted or technically acknowledged; confirmation in progress."},{"type":"payment.unknown","description":"National switch payment outcome uncertain after transmission: do not repeat the payment; an inquiry is running."},{"type":"payment.rejected","description":"National switch payment definitively rejected."},{"type":"payment.cancelled","description":"National switch payment cancelled locally before any transmission."},{"type":"payment.expired","description":"National switch payment expired before any possible transmission."},{"type":"ping","description":"Test event sent from the dashboard or the API."}]},"x-error-codes":{"unauthorized":"BP-1001","invalid_credentials":"BP-1002","invalid_pin":"BP-1003","pin_required":"BP-1004","two_factor_required":"BP-1005","scope_denied":"BP-1006","forbidden":"BP-1007","role_required":"BP-1008","step_up_required":"BP-1010","validation_error":"BP-2001","bad_request":"BP-2002","invalid_amount":"BP-2003","invalid_json":"BP-2004","idempotency_key_reused":"BP-2005","not_found":"BP-2006","conflict":"BP-2007","insufficient_funds":"BP-3001","wallet_frozen":"BP-3002","limit_exceeded":"BP-3003","daily_limit_exceeded":"BP-3004","invalid_fee":"BP-3005","guardian_halt":"BP-3006","hold_released":"BP-3007","cycle_not_payable":"BP-3008","payout_unavailable":"BP-4001","connector_unavailable":"BP-4002","rail_unavailable":"BP-4003","route_refused":"BP-4004","degraded_mode":"BP-4005","risk_blocked":"BP-5001","velocity_limit":"BP-5002","cooling_off":"BP-5003","kyc_required":"BP-5004","kyc_tier_limit":"BP-5005","monthly_limit_exceeded":"BP-5006","kyb_required":"BP-5007","sanctions_hit":"BP-5008","fraud_review":"BP-5009","destination_cooling":"BP-5010","destination_locked":"BP-5011","compliance_hold":"BP-5012","module_disabled":"BP-5013","margin_protection_violation":"BP-6001","neural_quota_exceeded":"BP-6002","provider_unavailable":"BP-6003","output_schema_invalid":"BP-6004","rate_limited":"BP-6005","addon_required":"BP-6006"}}}