{"openapi":"3.0.0","paths":{"/v1/fx/pairs":{"get":{"description":"Returns the currency pairs the calling organization can quote on. Backs customer-facing pickers so they only offer corridors the org has configured. The response is cached server-side for ~30s.","operationId":"FxPairsController_list_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"onBehalfOf","required":false,"in":"query","description":"Filter the listing to the pairs a specific customer can trade. Some customers have a narrower pair set than the organization; pass the customer that will request quotes so pickers only offer corridors that customer can actually quote on.","schema":{"example":"cus_abc123","type":"string"}}],"responses":{"200":{"description":"Enabled pairs.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FxPairsListResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"List FX pairs enabled for the organization","tags":["FX"]}},"/v1/fx/quotes":{"post":{"description":"Always firm — consumes one vendor quote and persists a Quote row. Pass an `Idempotency-Key` header to make retries safe (returns the original response on replay).","operationId":"FxQuoteController_create_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"Idempotency-Key","required":false,"in":"header","description":"Client-supplied key to deduplicate retries (e.g. on network timeout). Replays return the original quote rather than burning another vendor quote.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFxQuoteDto"}}}},"responses":{"201":{"description":"Firm quote created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FxQuoteResponseDto"}}}},"400":{"description":"Invalid pair shape (mismatched network/rail slots), or the fiat source rail is not yet supported (`fx_source_rail_not_supported` — send `SEPA` or `SEPA_INSTANT` for EUR onramp or `FASTER_PAYMENTS` for GBP; slow rails such as SWIFT are not available today)."},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"403":{"description":"Fiat pairs are not enabled (`fx_fiat_pairs_not_enabled`)."},"409":{"description":"FX is not enabled for this organization on the given pair."},"422":{"description":"No executable quote could be produced for the pair (`fx_quote_capacity_exhausted`, `fx_quote_amount_too_small`, `fx_quote_amount_too_large`, or `fx_quote_temporarily_unavailable`). For the amount buckets the body includes a `hint` and, when available, `limits` (`sourceCurrency`, `min`, `max` in minor units) plus the `requested` amount. Per-corridor amount limits are environment-specific — sandbox uses small test limits, so amounts that quote in production may be rejected in sandbox.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FxNotExecutableResponseDto"}}}}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"Create a firm FX quote","tags":["FX"]}},"/v1/fx/rates":{"get":{"description":"Returns an indicative (cached, ~30s-fresh) mid-market reference rate with the calling organization’s spread applied. Use this for browse/UX surfaces. This endpoint takes no amount — per-corridor amount limits apply only when committing to a firm price via `POST /v1/fx/quotes`.","operationId":"FxRateController_getRate_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"sourceCurrency","required":true,"in":"query","schema":{"example":"USDT","type":"string"}},{"name":"sourceNetwork","required":false,"in":"query","description":"Network for crypto source (e.g. BASE, ETHEREUM). Required when source is a crypto asset; must be omitted when source is fiat.","schema":{"example":"BASE","type":"string"}},{"name":"sourceRail","required":false,"in":"query","description":"Rail for fiat source (SEPA, SEPA_INSTANT, FASTER_PAYMENTS). Required when source is fiat; must be omitted when source is crypto. For EUR onramp prefer `SEPA`; `SEPA_INSTANT` remains accepted. Slow EUR rails are not available today.","schema":{"example":"SEPA","type":"string"}},{"name":"destinationCurrency","required":true,"in":"query","schema":{"example":"USDC","type":"string"}},{"name":"destinationNetwork","required":false,"in":"query","description":"Network for crypto destination. Required when destination is a crypto asset; must be omitted when destination is fiat.","schema":{"example":"BASE","type":"string"}},{"name":"destinationRail","required":false,"in":"query","description":"Rail for fiat destination (SEPA, SWIFT, ACH). Required when destination is fiat; must be omitted when destination is crypto.","schema":{"example":"SEPA","type":"string"}},{"name":"onBehalfOf","required":false,"in":"query","description":"Customer the rate is browsed for. **Required** when either leg is fiat (GBP/EUR) — fiat pairs quote against per-customer Codex credentials. Optional on stablecoin pairs: pass the customer that will later request the firm quote when they have customer-specific pricing (e.g. market-rate pin) so the indicative rate matches it.","schema":{"example":"cus_abc123","type":"string"}}],"responses":{"200":{"description":"Indicative rate.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FxRateResponseDto"}}}},"400":{"description":"Invalid pair shape (mismatched network/rail slots), the fiat source rail is not yet supported (`fx_source_rail_not_supported` — send `SEPA` or `SEPA_INSTANT` for EUR onramp or `FASTER_PAYMENTS` for GBP; slow rails such as SWIFT are not available today), or a fiat pair was requested without `onBehalfOf` (`fx_rates_on_behalf_of_required`)."},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"403":{"description":"The indicative-rates endpoint is not enabled for this organization (`fx_rates_not_enabled`), or fiat pairs are not enabled (`fx_fiat_pairs_not_enabled`)."},"404":{"description":"The requested pair is not supported by any vendor (`fx_pair_unsupported`)."},"409":{"description":"FX is not enabled for this organization on the given pair (`fx_not_enabled_for_pair`)."},"422":{"description":"No rate is available for the pair right now (`fx_quote_capacity_exhausted` / `fx_quote_temporarily_unavailable`). The body includes a `hint` with a human-readable explanation; `limits`/`requested` are never present on this endpoint (it takes no amount).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FxNotExecutableResponseDto"}}}}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"Get an indicative FX rate for a pair","tags":["FX"]}},"/v1/fx/trades":{"post":{"operationId":"FxTradeController_accept_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFxTradeDto"}}}},"responses":{"201":{"description":"Trade created. Deposit funds within `depositDeadline`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FxTradeResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"409":{"description":"Another active FX trade already exists for this (customer, source asset, source network)."},"410":{"description":"Quote expired or no longer pending."}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"Accept a firm FX quote and create a trade","tags":["FX"]}},"/v1/fx/trades/{tradeId}":{"get":{"operationId":"FxTradeController_getTrade_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"tradeId","required":true,"in":"path","description":"Trade ID (tfr_…)","schema":{"type":"string"}}],"responses":{"200":{"description":"Trade detail. Shape varies by `status` — `PENDING_WALLET_APPROVAL` omits `depositInstructions` and returns `screeningDeadline`; `AWAITING_DEPOSIT` returns `depositInstructions` and `depositDeadline`; terminal states return only `status`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FxTradeResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"404":{"description":"Trade does not exist for the calling organization."}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"Read an FX trade","tags":["FX"]}},"/v1/fx/trades/{tradeId}/simulate-deposit":{"post":{"description":"Sandbox only — always returns 403 in production. Simulates the deposit arriving for a trade in `AWAITING_DEPOSIT`, standing in for the on-chain transfer (crypto-source) or the bank wire (fiat-source, which cannot be sent in sandbox). The trade then advances through its normal lifecycle asynchronously: poll `GET /v1/fx/trades/{tradeId}` or subscribe to FX trade webhooks to observe the transition.","operationId":"FxTradeController_simulateDeposit_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"tradeId","required":true,"in":"path","description":"Trade ID (tfr_…)","schema":{"type":"string"}}],"responses":{"202":{"description":"Simulation accepted. The trade advances asynchronously as the simulated funds settle.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FxTradeSimulationResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"403":{"description":"Simulation is sandbox-only and not available in production."},"404":{"description":"Trade does not exist for the calling organization."},"409":{"description":"Trade is not in `AWAITING_DEPOSIT`."}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"Simulate the deposit for an FX trade (sandbox only)","tags":["FX"]}},"/v1/fx/trades/{tradeId}/simulate-payout":{"post":{"description":"Sandbox only — always returns 403 in production. Simulates the payout completing for a trade in `PROCESSING` (deposit already settled), driving it to `COMPLETED` through its normal lifecycle asynchronously: poll `GET /v1/fx/trades/{tradeId}` or subscribe to FX trade webhooks to observe the transition.","operationId":"FxTradeController_simulatePayout_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"tradeId","required":true,"in":"path","description":"Trade ID (tfr_…)","schema":{"type":"string"}}],"responses":{"202":{"description":"Simulation accepted. The trade completes asynchronously as the simulated payout settles.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FxTradeSimulationResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"403":{"description":"Simulation is sandbox-only and not available in production."},"404":{"description":"Trade does not exist for the calling organization."},"409":{"description":"Trade is not in `PROCESSING`."}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"Simulate the payout for an FX trade (sandbox only)","tags":["FX"]}},"/v1/accounts":{"get":{"description":"Returns all accounts across all customers in the organization. Use holdsBalance=true to list balance accounts.","operationId":"AccountsController_getAllAccounts_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return (1-1000). Use with offset for traditional pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of results to skip. Use with limit for traditional pagination.","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"page_size","required":false,"in":"query","description":"Number of results per page (1-1000). Use with starting_after for cursor-based pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"starting_after","required":false,"in":"query","description":"Cursor for pagination. Use the ID of the last item from the previous page to get the next page. Use with page_size for cursor-based pagination.","schema":{"type":"string"}},{"name":"id","required":false,"in":"query","description":"Account ID prefix to search for","schema":{"type":"string"}},{"name":"customerId","required":false,"in":"query","description":"Customer ID to filter accounts by","schema":{"type":"string"}},{"name":"holdsBalance","required":false,"in":"query","description":"Only return balance accounts (USD or stablecoin). Same set as POST /v1/balance-accounts and POST /v1/balance-accounts/stablecoin.","schema":{"type":"boolean"}},{"name":"counterpartyId","required":false,"in":"query","schema":{"type":"string"}},{"name":"type","required":false,"in":"query","schema":{"type":"string","enum":["VIRTUAL_BANK","VIRTUAL_WALLET","INFINITE_BANK","INFINITE_WALLET","EXTERNAL_BANK","EXTERNAL_WALLET","EXTERNAL_PROXY","PROVIDER_BALANCE"]}},{"name":"provider","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["IN_REVIEW","ACTIVE","CLOSED"]}},{"name":"addressType","required":false,"in":"query","schema":{"type":"string","enum":["EVM","TRON","BITCOIN","SOLANA"]}},{"name":"currencyCodes","required":false,"in":"query","schema":{"type":"array","items":{"type":"string","enum":["USD","EUR","MXN","USAT","USDC","USDT","BTC"]}}},{"name":"paymentRails","required":false,"in":"query","schema":{"type":"array","items":{"type":"string","enum":["ACH","ACH_SAME_DAY","WIRE","FEDWIRE","FED_NOW","RTP","EREBOR","EREBOR_RAIL","BALANCE","SWIFT","SEPA","SEPA_INSTANT","TIPS","FASTER_PAYMENTS","BACS","CHAPS","ELIXIR","NICS","EFT","INTERAC","NPP","BECS","UPI","IMPS","IMPS_WITH_FIRC","NEFT","RTGS","BI_FAST","ARTAJASA","PIX","TED","TEF","SPEI","COELSA","SINPE","CIPS","CFXPS","CHATS","ZENGIN","KFTC","FAST_SG","MEPS","DUITNOW","PROMPTPAY","INSTAPAY","PESONET","NAPAS","BEFTN","SLIPS","ZAHAV","GHIPSS","NIBSS","PESALINK","RTC_ZA","TZS_RTGS","EGP_ACH","JOD_ACH","NPSS","MADA","QPS","DOP_ACH","GTQ_ACH","HNL_ACH","PEN_ACH","JMD_ACH","USD_ACH_SV","USD_ACH_EC","CLP_TEF","PSE","COP_ACH","BOB_RTGS","PYG_ACH","CERTIS","DKK_TIPS","SENT","NKS","BANKGIROT","HKD_FPS","IBFT","TRY_FAST"]}}},{"name":"expand","required":false,"in":"query","schema":{"type":"array","items":{"type":"string","enum":["customer","sweepTargetAccount","counterparty"]}}}],"responses":{"200":{"description":"Paginated list of all accounts","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AccountResponseDto"}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}}}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get all accounts","tags":["Accounts"]}},"/v1/accounts/{id}/virtual-accounts":{"get":{"description":"Returns all virtual accounts (virtual bank accounts or virtual wallets) that sweep to the specified account. This endpoint returns virtual accounts where the specified account is the sweep target.","operationId":"AccountsController_getVirtualAccountsByAccount_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Account ID (sweep target)","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return (1-1000). Use with offset for traditional pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of results to skip. Use with limit for traditional pagination.","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"page_size","required":false,"in":"query","description":"Number of results per page (1-1000). Use with starting_after for cursor-based pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"starting_after","required":false,"in":"query","description":"Cursor for pagination. Use the ID of the last item from the previous page to get the next page. Use with page_size for cursor-based pagination.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of virtual accounts","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AccountResponseDto"}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}}}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get virtual accounts by account","tags":["Accounts"]}},"/v1/accounts/{id}/balance":{"get":{"description":"Returns the balance of a balance account: funds available to pay out and funds committed to in-flight payouts. Only available for accounts with holdsBalance=true.","operationId":"AccountsController_getBalance_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Balance account ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Account balance","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountBalanceResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get account balance","tags":["Accounts"]}},"/v1/accounts/{id}/balance/transactions":{"get":{"description":"Returns the transaction history of a balance account: deposit credits, payout debits, and reversals, newest-first with cursor pagination.","operationId":"AccountsController_getBalanceTransactions_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Balance account ID","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Maximum number of transactions to return","schema":{"minimum":1,"maximum":100,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","description":"Cursor from a previous page","schema":{"type":"string"}}],"responses":{"200":{"description":"Balance transactions","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BalanceTransactionsResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get balance transactions","tags":["Accounts"]}},"/v1/accounts/{id}":{"get":{"description":"Retrieve an account by ID with optional expansion of related resources.\n\nUse the `expand` query parameter to include full objects:\n- `customer`: Include full customer details\n- `sweepTargetAccount`: Include full sweep target account details (for virtual bank accounts and virtual wallets)\n- `counterparty`: Include full counterparty details (for third-party recipient accounts)\n\nMultiple expansions can be requested: `?expand=customer,sweepTargetAccount,counterparty`","operationId":"AccountsController_getAccount_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Account ID","schema":{"type":"string"}},{"name":"expand","required":false,"in":"query","description":"Fields to expand in the response. Pass as comma-separated values or repeated query params.","schema":{"example":["customer","sweepTargetAccount","counterparty"],"type":"array","items":{"type":"string","enum":["customer","sweepTargetAccount","counterparty"]}}}],"responses":{"200":{"description":"Account details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get account by ID","tags":["Accounts"]}},"/v1/accounts/{id}/history":{"get":{"description":"Retrieves all transfers involving this account (as source or destination)","operationId":"AccountsController_getAccountHistory_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Account ID","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return (1-1000). Use with offset for traditional pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of results to skip. Use with limit for traditional pagination.","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"page_size","required":false,"in":"query","description":"Number of results per page (1-1000). Use with starting_after for cursor-based pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"starting_after","required":false,"in":"query","description":"Cursor for pagination. Use the ID of the last item from the previous page to get the next page. Use with page_size for cursor-based pagination.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of transfers involving this account","content":{"application/json":{"schema":{"type":"object","properties":{"has_more":{"type":"boolean","description":"Whether there are more results available"},"page_size":{"type":"number","description":"Number of results per page"},"url":{"type":"string","description":"URL for this request"},"data":{"type":"array","items":{"$ref":"#/components/schemas/TransferResponseDto"}},"page_next":{"type":"string","nullable":true,"description":"URL to fetch the next page of results"},"page_prev":{"type":"string","nullable":true,"description":"URL to fetch the previous page of results"}}}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get account transfer history","tags":["Accounts"]}},"/v1/accounts/customer/{customerId}":{"get":{"description":"Returns all accounts for a specific customer. Use holdsBalance=true to list balance accounts.","operationId":"AccountsController_getAccountsByCustomer_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","description":"Customer ID","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return (1-1000). Use with offset for traditional pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of results to skip. Use with limit for traditional pagination.","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"page_size","required":false,"in":"query","description":"Number of results per page (1-1000). Use with starting_after for cursor-based pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"starting_after","required":false,"in":"query","description":"Cursor for pagination. Use the ID of the last item from the previous page to get the next page. Use with page_size for cursor-based pagination.","schema":{"type":"string"}},{"name":"id","required":false,"in":"query","description":"Account ID prefix to search for","schema":{"type":"string"}},{"name":"holdsBalance","required":false,"in":"query","description":"Only return balance accounts (USD or stablecoin). Same set as POST /v1/balance-accounts and POST /v1/balance-accounts/stablecoin.","schema":{"type":"boolean"}},{"name":"counterpartyId","required":false,"in":"query","schema":{"type":"string"}},{"name":"type","required":false,"in":"query","schema":{"type":"string","enum":["VIRTUAL_BANK","VIRTUAL_WALLET","INFINITE_BANK","INFINITE_WALLET","EXTERNAL_BANK","EXTERNAL_WALLET","EXTERNAL_PROXY","PROVIDER_BALANCE"]}},{"name":"provider","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string","enum":["IN_REVIEW","ACTIVE","CLOSED"]}},{"name":"addressType","required":false,"in":"query","schema":{"type":"string","enum":["EVM","TRON","BITCOIN","SOLANA"]}},{"name":"currencyCodes","required":false,"in":"query","schema":{"type":"array","items":{"type":"string","enum":["USD","EUR","MXN","USAT","USDC","USDT","BTC"]}}},{"name":"paymentRails","required":false,"in":"query","schema":{"type":"array","items":{"type":"string","enum":["ACH","ACH_SAME_DAY","WIRE","FEDWIRE","FED_NOW","RTP","EREBOR","EREBOR_RAIL","BALANCE","SWIFT","SEPA","SEPA_INSTANT","TIPS","FASTER_PAYMENTS","BACS","CHAPS","ELIXIR","NICS","EFT","INTERAC","NPP","BECS","UPI","IMPS","IMPS_WITH_FIRC","NEFT","RTGS","BI_FAST","ARTAJASA","PIX","TED","TEF","SPEI","COELSA","SINPE","CIPS","CFXPS","CHATS","ZENGIN","KFTC","FAST_SG","MEPS","DUITNOW","PROMPTPAY","INSTAPAY","PESONET","NAPAS","BEFTN","SLIPS","ZAHAV","GHIPSS","NIBSS","PESALINK","RTC_ZA","TZS_RTGS","EGP_ACH","JOD_ACH","NPSS","MADA","QPS","DOP_ACH","GTQ_ACH","HNL_ACH","PEN_ACH","JMD_ACH","USD_ACH_SV","USD_ACH_EC","CLP_TEF","PSE","COP_ACH","BOB_RTGS","PYG_ACH","CERTIS","DKK_TIPS","SENT","NKS","BANKGIROT","HKD_FPS","IBFT","TRY_FAST"]}}},{"name":"expand","required":false,"in":"query","schema":{"type":"array","items":{"type":"string","enum":["customer","sweepTargetAccount","counterparty"]}}}],"responses":{"200":{"description":"Paginated list of customer accounts","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/AccountResponseDto"}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}}}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get accounts by customer","tags":["Accounts"]}},"/v1/balance-accounts/stablecoin":{"post":{"description":"Creates a provider-held stablecoin balance account. Supports USDT and USDC across their available networks. Use this account as the destination of an eligible fiat-to-crypto fixed route and as the funding source for Global Payouts.","operationId":"BalanceAccountsController_createStablecoin_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"Idempotency-Key","required":false,"in":"header","description":"Optional idempotency key. When supplied, retries return the original account.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateStablecoinBalanceAccountDto"}}}},"responses":{"201":{"description":"Stablecoin balance account created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Create a stablecoin balance account","tags":["balance-accounts"]}},"/v1/balance-accounts":{"post":{"description":"Creates a USD account that holds a balance. Use product STANDARD (default) for a fiat hold funded by bank transfer, or YIELD for a reserve-backed hold that can earn configurable yield. Pay out by creating a transfer sourced from this account. Requires the matching customer capability (USD_BALANCE or USD_YIELD). Use the Idempotency-Key header to safely retry on network failure.","operationId":"BalanceAccountsController_create_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"Idempotency-Key","required":false,"in":"header","description":"Optional idempotency key. When supplied, a retry with the same key replays the original response (24h TTL) instead of being rejected as a duplicate.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBalanceAccountDto"}}}},"responses":{"201":{"description":"Balance account created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"409":{"description":"The customer already has an active balance account for this product."}},"security":[{"bearer":[]}],"summary":"Create a balance account","tags":["balance-accounts"]}},"/v1/balance-accounts/{id}":{"delete":{"description":"Closes a balance account. The available balance must be zero and no payouts may be in flight — pay out any remaining funds first. After closing, the account no longer accepts deposits and (for STANDARD accounts that shared deposit coordinates) the customer can be issued bank pay-in fixed routes again.","operationId":"BalanceAccountsController_close_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Balance account ID","schema":{"type":"string"}}],"responses":{"204":{"description":"Balance account closed"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"409":{"description":"The account still holds a balance or has payouts in flight."}},"security":[{"bearer":[]}],"summary":"Close a balance account","tags":["balance-accounts"]}},"/v1/fixed-routes/virtual-bank-accounts":{"post":{"description":"Creates a virtual bank account that automatically sweeps fiat deposits. Route type (FIAT_TO_CRYPTO or FIAT_TO_CRYPTO_TO_FIAT) is inferred from the sweep target account type. Use the Idempotency-Key header to safely retry on network failure.","operationId":"FixedRoutesController_createVba_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"Idempotency-Key","required":false,"in":"header","description":"Optional idempotency key. When supplied, a retry with the same key replays the original response (24h TTL) instead of being rejected as a duplicate.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVbaFixedRouteDto"}}}},"responses":{"201":{"description":"Fixed route created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FixedRouteResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"409":{"description":"An enabled route with the same source, destination, and sweep target already exists for this customer."}},"security":[{"bearer":[]}],"summary":"Create a virtual bank account fixed route","tags":["fixed-routes"]}},"/v1/fixed-routes/virtual-wallets":{"post":{"description":"Creates an Infinite Wallet (`inw_`, wallet type VIRTUAL) that automatically sweeps crypto deposits. This is a dedicated deposit mailbox, not a treasury vault and not a `vwa_` virtual wallet. Route type (CRYPTO_TO_FIAT or CRYPTO_TO_CRYPTO) is inferred from the sweep target. Use the Idempotency-Key header to safely retry on network failure.","operationId":"FixedRoutesController_createVirtualWallet_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"Idempotency-Key","required":false,"in":"header","description":"Optional idempotency key. When supplied, a retry with the same key replays the original response (24h TTL) instead of being rejected as a duplicate.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateVirtualWalletFixedRouteDto"}}}},"responses":{"201":{"description":"Fixed route created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FixedRouteResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"409":{"description":"An enabled route with the same source, destination, and sweep target already exists for this customer."}},"security":[{"bearer":[]}],"summary":"Create a virtual wallet fixed route","tags":["fixed-routes"]}},"/v1/fixed-routes/{id}":{"get":{"description":"Returns details of a specific fixed route.","operationId":"FixedRoutesController_getById_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"expand","required":false,"in":"query","description":"Comma-separated list of fields to expand (e.g., \"sweepTargetAccount\")","schema":{"example":"sweepTargetAccount","type":"string"}}],"responses":{"200":{"description":"Fixed route details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FixedRouteResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get a fixed route by ID","tags":["fixed-routes"]},"patch":{"description":"Updates a fixed route configuration. Supports updating fees, refund address, enabled status, and metadata. Sweep target changes require creating a new route.","operationId":"FixedRoutesController_update_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFixedRouteDto"}}}},"responses":{"200":{"description":"Fixed route updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FixedRouteResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Update a fixed route","tags":["fixed-routes"]}},"/v1/fixed-routes/validate":{"post":{"description":"Checks if a fixed route configuration is valid before creating it. Returns validation result with any errors.","operationId":"FixedRoutesController_validateRoute_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateFixedRouteDto"}}}},"responses":{"200":{"description":"Validation result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateFixedRouteResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Validate if a fixed route can be created","tags":["fixed-routes"]}},"/v1/external-wallets":{"post":{"description":"Create an external wallet for a customer. This is an asynchronous flow.","operationId":"ExternalWalletsController_create_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateExternalWalletDto"}}}},"responses":{"201":{"description":"External wallet created and submitted for async review","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalWalletResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Create an external wallet","tags":["External Wallets"]}},"/v1/external-wallets/{id}":{"patch":{"operationId":"ExternalWalletsController_update_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"External wallet ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateExternalWalletDto"}}}},"responses":{"200":{"description":"External wallet updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalWalletResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Update an external wallet","tags":["External Wallets"]}},"/v1/external-bank-accounts":{"post":{"description":"Create an external account for bank transfers or proxy-based payments.\n\nIf the same bank details or proxy alias match an account previously closed through the API, that account is reopened and its existing ID is returned. Fixed routes disabled when the account was closed remain disabled and must be re-enabled separately.\n\n## Field Mapping\n\nWe use generic field names that adapt to country-specific identifiers:\n\n| Field | US | UK | EU | India | Mexico | Australia |\n|-------|----|----|----|----|----|----|\n| `routingNumber` | ABA (9 digits) | Sort code (6 digits) | - | IFSC (11 chars) | - | BSB (6 digits) |\n| `accountNumber` | Account number | Account (8 digits) | - | Account number | CLABE (18 digits) | Account number |\n| `iban` | - | - | IBAN | - | - | - |\n\n## Bank Account Requirements by Rail\n\n| Rail | Required Fields |\n|------|-----------------|\n| **ACH/Wire** (US) | `routingNumber` + `accountNumber` |\n| **SWIFT** (IBAN countries) | `swiftBic` + `iban` |\n| **SWIFT** (US) | `swiftBic` + `accountNumber` (`routingNumber` optional) |\n| **SWIFT** (AU) | `swiftBic` + `routingNumber` (BSB) + `accountNumber` |\n| **SEPA** | `iban` (swiftBic optional) |\n| **Faster Payments** (UK) | `routingNumber` (sort code) + `accountNumber` |\n| **IMPS/NEFT** (India) | `routingNumber` (IFSC) + `accountNumber` |\n| **SPEI** (Mexico) | `accountNumber` (18-digit CLABE) |\n\n## Proxy Accounts\n\nFor instant payment rails (PIX, UPI, PromptPay), provide alias details instead of bank details:\n- `aliasType`: phone, email, tax_id, national_id, or random\n- `aliasValue`: The identifier value\n\nThe payment network resolves the alias to the recipient's account.","operationId":"ExternalBankAccountsController_create_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateExternalBankAccountDto"},"examples":{"pixCpf":{"summary":"[Proxy] PIX with CPF (Brazil)","description":"Brazilian instant payment using tax ID. Only needs beneficiaryName + aliasType + aliasValue.","value":{"customerId":"cust_abc123","beneficiaryName":"João Silva","aliasType":"tax_id","aliasValue":"12345678901","paymentRails":["pix"]}},"pixPhone":{"summary":"[Proxy] PIX with phone (Brazil)","value":{"customerId":"cust_abc123","beneficiaryName":"Maria Santos","aliasType":"phone","aliasValue":"+5511912345678","paymentRails":["pix"]}},"upi":{"summary":"[Proxy] UPI VPA (India)","description":"Indian instant payment using Virtual Payment Address","value":{"customerId":"cust_abc123","beneficiaryName":"Raj Patel","aliasType":"random","aliasValue":"rajpatel@upi","paymentRails":["upi"]}},"promptpay":{"summary":"[Proxy] PromptPay (Thailand)","value":{"customerId":"cust_abc123","beneficiaryName":"Somchai Jaidee","aliasType":"national_id","aliasValue":"1234567890123","paymentRails":["promptpay"]}},"achMultiRail":{"summary":"[Bank] US domestic (ACH + Wire)","description":"US bank account supporting multiple rails. Uses routingNumber (ABA) + accountNumber.","value":{"customerId":"cust_abc123","beneficiaryName":"Jane Doe","beneficiaryAddress":{"addressLine1":"456 Oak Avenue","city":"New York","state":"NY","postalCode":"10001","country":"US"},"bankName":"Chase Bank","bankAddress":{"country":"US"},"accountNumber":"1234567890","routingNumber":"021000021","bankAccountType":"checking","paymentRails":["ACH","ACH_SAME_DAY","WIRE"]}},"sepa":{"summary":"[Bank] SEPA (Eurozone)","description":"European bank account using IBAN only.","value":{"customerId":"cust_abc123","beneficiaryName":"Hans Mueller","beneficiaryAddress":{"addressLine1":"Hauptstraße 1","city":"Berlin","postalCode":"10115","country":"DE"},"iban":"DE89370400440532013000","paymentRails":["SEPA","SEPA_INSTANT"]}},"swiftIban":{"summary":"[Bank] SWIFT to EU (IBAN)","description":"International wire to IBAN country using swiftBic + iban.","value":{"customerId":"cust_abc123","beneficiaryName":"John Smith","beneficiaryAddress":{"addressLine1":"123 Main Street","city":"London","postalCode":"SW1A 1AA","country":"GB"},"bankAddress":{"country":"GB"},"swiftBic":"BARCGB22","iban":"GB82WEST12345698765432","paymentRails":["SWIFT"]}},"swiftUs":{"summary":"[Bank] SWIFT to US","description":"International wire to US using swiftBic + accountNumber (no IBAN; routingNumber optional).","value":{"customerId":"cust_abc123","beneficiaryName":"Jane Doe","beneficiaryAddress":{"addressLine1":"456 Oak Avenue","city":"New York","state":"NY","postalCode":"10001","country":"US"},"bankAddress":{"country":"US"},"swiftBic":"CHASUS33","routingNumber":"021000021","accountNumber":"1234567890","paymentRails":["SWIFT"]}},"ukFasterPayments":{"summary":"[Bank] UK Faster Payments","description":"UK bank account using sort code (in routingNumber) + account number.","value":{"customerId":"cust_abc123","beneficiaryName":"James Wilson","beneficiaryAddress":{"addressLine1":"10 Downing Street","city":"London","postalCode":"SW1A 2AA","country":"GB"},"bankName":"Barclays","routingNumber":"200000","accountNumber":"12345678","paymentRails":["FASTER_PAYMENTS"]}},"spei":{"summary":"[Bank] SPEI (Mexico)","description":"Mexican bank account using 18-digit CLABE (in accountNumber). No routingNumber needed.","value":{"customerId":"cust_abc123","beneficiaryName":"Carlos García","beneficiaryAddress":{"addressLine1":"Av. Reforma 222","city":"Mexico City","postalCode":"06600","country":"MX"},"accountNumber":"032180000118359719","paymentRails":["SPEI"]}}}}}},"responses":{"201":{"description":"External account created, reused, or reopened successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalAccountResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Create an external account","tags":["External Bank Accounts"]}},"/v1/external-bank-accounts/{id}/close":{"post":{"description":"Closes an active external account. Accounts still in review cannot be closed. The account can no longer be used as a transfer or FX destination, and linked fixed routes are disabled. Creating an external account later with the same bank details or proxy alias reopens this account with the same ID. Disabled fixed routes are not re-enabled automatically.","operationId":"ExternalBankAccountsController_close_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"External account ID","schema":{"type":"string"}}],"responses":{"200":{"description":"External account closed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalAccountResponseDto"}}}},"400":{"description":"The account is still in review or is not an external account"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Close an external account","tags":["External Bank Accounts"]}},"/v1/external-bank-accounts/{id}":{"patch":{"operationId":"ExternalBankAccountsController_update_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"External account ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateExternalBankAccountDto"}}}},"responses":{"200":{"description":"External account updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExternalAccountResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Update an external account","tags":["External Bank Accounts"]}},"/v1/external-bank-accounts/validate":{"post":{"description":"Validate a bank code for a specific payment network and retrieve enriched bank information.\n\nProvide the payment network (rail) and the appropriate bank code:\n\n| Payment Network | Bank Code Type | Format | Example |\n|-----------------|----------------|--------|---------|\n| `ach`, `wire` | Routing Number | 9 digits | 021000021 |\n| `swift` | BIC/SWIFT | 8-11 chars | CHASUS33 |\n| `sepa`, `sepa_instant` | IBAN | 15-34 chars | DE89370400440532013000 |\n| `faster_payments`, `bacs`, `chaps` | Sort Code | 6 digits | 200000 |\n| `eft`, `interac` | Transit Number | 9 digits | 000412345 |\n| `npp`, `becs` | BSB | 6 digits | 063000 |\n| `imps`, `neft`, `rtgs` | IFSC | 11 chars | HDFC0001234 |\n| `pix`, `ted` | COMPE Code | 3 digits | 001 |\n| `chats` | Bank Code | 3 digits | 004 |\n|| `fast_sg`, `meps` | Bank Code | 4 digits | 7171 |\n|| `bi_fast`, `artajasa` | Bank Code | 3 digits | 014 |\n|| `spei` | Institution Code | 3 digits | 012 |","operationId":"ExternalBankAccountValidationController_validateBankCode_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateBankCodeDto"}}}},"responses":{"200":{"description":"Bank code validation and enrichment result","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankCodeEnrichmentResponseDto"}}}},"429":{"description":"Rate limit exceeded for unauthenticated requests"}},"summary":"Validate and enrich bank code","tags":["External Bank Accounts"]}},"/v1/liquidity/facility":{"get":{"operationId":"TreasuryLiquidityController_getFacility_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreasuryLiquidityFacilityDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"503":{"description":"Credit line snapshot unavailable (`credit_line_temporarily_unavailable`)."}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"Get credit line facility","tags":["Liquidity"]},"patch":{"operationId":"TreasuryLiquidityController_updateFacility_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTreasuryLiquidityFacilityDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreasuryLiquidityFacilityDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"Update credit line payout treasury","tags":["Liquidity"]}},"/v1/liquidity/positions":{"get":{"operationId":"TreasuryLiquidityController_listPositions_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return (1-1000). Use with offset for traditional pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of results to skip. Use with limit for traditional pagination.","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"page_size","required":false,"in":"query","description":"Number of results per page (1-1000). Use with starting_after for cursor-based pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"starting_after","required":false,"in":"query","description":"Cursor for pagination. Use the ID of the last item from the previous page to get the next page. Use with page_size for cursor-based pagination.","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","description":"Comma-separated customer-facing statuses","schema":{"example":"OPEN,REPAYING","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListTreasuryLiquidityPositionsResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"List credit line positions","tags":["Liquidity"]}},"/v1/liquidity/positions/{positionId}":{"get":{"operationId":"TreasuryLiquidityController_getPosition_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"positionId","required":true,"in":"path","description":"Position ID (liq_…)","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TreasuryLiquidityPositionDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"Get a credit line position","tags":["Liquidity"]}},"/v1/liquidity/draws":{"post":{"description":"Draws into the configured payout treasury. Requires `Idempotency-Key` so retries cannot double-borrow.","operationId":"TreasuryLiquidityController_draw_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"Idempotency-Key","required":true,"in":"header","description":"Client-supplied key scoped per organization. Retries return the original draw; a different amount for the same key is rejected.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DrawTreasuryLiquidityDto"}}}},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DrawTreasuryLiquidityResponseDto"}}}},"400":{"description":"Missing key, invalid amount, capacity unavailable (`credit_line_capacity_unavailable`), or temporary unavailability (`credit_line_temporarily_unavailable`)."},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"409":{"description":"Idempotency key reused with a different payload (`idempotency_key_payload_mismatch`)."}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"Draw USDC credit into Solana treasury","tags":["Liquidity"]}},"/v1/liquidity/positions/{positionId}/payback":{"post":{"operationId":"TreasuryLiquidityController_payback_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"positionId","required":true,"in":"path","description":"Position ID (liq_…)","schema":{"type":"string"}}],"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaybackTreasuryLiquidityResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]},{"bearer":[]}],"summary":"Pay back a credit line position","tags":["Liquidity"]}},"/v1/customers/individuals":{"post":{"description":"Create an individual customer record without sending a polymorphic customer type in the request body. Use this endpoint to create INDIVIDUAL customers.","operationId":"CustomersController_createIndividual_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"Idempotency-Key","required":false,"in":"header","description":"Idempotency key for preventing duplicate requests","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIndividualCustomerDto"}}}},"responses":{"201":{"description":"Customer created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerResponseDto"}}}},"400":{"description":"Invalid customer data"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Create a new individual customer","tags":["Customers"]}},"/v1/customers/businesses":{"post":{"description":"Create a business customer record without sending a polymorphic customer type in the request body. Use this endpoint to create BUSINESS customers.","operationId":"CustomersController_createBusiness_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"Idempotency-Key","required":false,"in":"header","description":"Idempotency key for preventing duplicate requests","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBusinessCustomerDto"}}}},"responses":{"201":{"description":"Customer created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerResponseDto"}}}},"400":{"description":"Invalid customer data"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Create a new business customer","tags":["Customers"]}},"/v1/customers":{"get":{"operationId":"CustomersController_findAll_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return (1-1000). Use with offset for traditional pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of results to skip. Use with limit for traditional pagination.","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"page_size","required":false,"in":"query","description":"Number of results per page (1-1000). Use with starting_after for cursor-based pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"starting_after","required":false,"in":"query","description":"Cursor for pagination. Use the ID of the last item from the previous page to get the next page. Use with page_size for cursor-based pagination.","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","description":"Filter by customer status","schema":{"type":"string","enum":["DRAFT","IN_REVIEW","NEED_ACTIONS","REJECTED","ACTIVE","INACTIVE","SUSPENDED"]}},{"name":"type","required":false,"in":"query","description":"Filter by customer type","schema":{"type":"string","enum":["INDIVIDUAL","BUSINESS"]}},{"name":"search","required":false,"in":"query","description":"Search by customer name or email","schema":{"type":"string"}},{"name":"organizationId","required":false,"in":"query","description":"Filter by organization ID. Must be within the caller accessible org scope.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of customers","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CustomerResponseDto"}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}}}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get all customers","tags":["Customers"]}},"/v1/customers/{customerId}/treasury":{"get":{"description":"Retrieve treasury balances grouped by treasury and wallet. Ideal for portfolio views showing accounts and sub-accounts. Transaction wallets are excluded.","operationId":"CustomersController_getCustomerTreasury_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","description":"Customer ID","schema":{"example":"cus_abc123","type":"string"}},{"name":"treasuryId","required":false,"in":"query","description":"Treasury ID to filter to a specific treasury","schema":{"example":"trs_abc123","type":"string"}},{"name":"view","required":false,"in":"query","description":"Treasury response shape. PORTFOLIO returns wallet-group treasuries. OVERVIEW may include provider-backed treasury entries for the treasury page.","schema":{"enum":["PORTFOLIO","OVERVIEW"],"type":"string"}}],"responses":{"200":{"description":"Treasury balances grouped by treasury and wallet","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerTreasuryResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get customer treasury balances","tags":["Customers"]}},"/v1/customers/{customerId}/transfers":{"get":{"description":"Retrieve all transfers for a specific customer (as source or destination)","operationId":"CustomersController_getCustomerTransfers_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","description":"Customer ID","schema":{"example":"cus_abc123","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return (1-1000). Use with offset for traditional pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of results to skip. Use with limit for traditional pagination.","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"page_size","required":false,"in":"query","description":"Number of results per page (1-1000). Use with starting_after for cursor-based pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"starting_after","required":false,"in":"query","description":"Cursor for pagination. Use the ID of the last item from the previous page to get the next page. Use with page_size for cursor-based pagination.","schema":{"type":"string"}},{"name":"id","required":false,"in":"query","description":"Filter by transfer ID prefix (e.g. tfr_abc123)","schema":{"maxLength":100,"type":"string"}},{"name":"sourceCustomerId","required":false,"in":"query","description":"Filter by source customer ID","schema":{"type":"string"}},{"name":"accountId","required":false,"in":"query","schema":{"type":"string"}},{"name":"counterpartyId","required":false,"in":"query","description":"Filter by counterparty ID","schema":{"type":"string"}},{"name":"clientReferenceId","required":false,"in":"query","description":"Filter by the clientReferenceId supplied at transfer creation. Exact match. Not enforced unique — multiple transfers can share a value, so treat the result as a list.","schema":{"maxLength":256,"example":"order_abc123","type":"string"}},{"name":"flow","required":false,"in":"query","schema":{"type":"string","enum":["CRYPTO_TO_CRYPTO","CRYPTO_TO_FIAT","FIAT_TO_CRYPTO","FIAT_TO_FIAT","FIAT_TO_CRYPTO_TO_FIAT","FX","INTERNAL","FEE_CRYPTO","REFUND_CRYPTO","REFUND_FIAT"]}},{"name":"status","required":false,"in":"query","description":"Filter by transfer status. Transfers that fail after funds are received are treated as IN_REVIEW and excluded from FAILED.","schema":{"type":"string","enum":["DRAFT","PENDING_AUTHORIZATION","IN_REVIEW","PENDING","PROCESSING","COMPLETED","FAILED","CANCELLED","REVERSED"]}},{"name":"startDate","required":false,"in":"query","schema":{"type":"string"}},{"name":"endDate","required":false,"in":"query","schema":{"type":"string"}},{"name":"expand","required":false,"in":"query","description":"Fields to expand in the response. Pass as comma-separated values or repeated query params.","schema":{"example":["counterparty"],"type":"array","items":{"type":"string","enum":["sourceAccount","destinationAccount","sourceCustomer","counterparty","documents"]}}}],"responses":{"200":{"description":"Paginated list of customer transfers","content":{"application/json":{"schema":{"type":"object","properties":{"has_more":{"type":"boolean","description":"Whether there are more results available"},"page_size":{"type":"number","description":"Number of results per page"},"url":{"type":"string","description":"URL for this request"},"data":{"type":"array","items":{"$ref":"#/components/schemas/TransferResponseDto"}},"page_next":{"type":"string","nullable":true,"description":"URL to fetch the next page of results"},"page_prev":{"type":"string","nullable":true,"description":"URL to fetch the previous page of results"}}}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get customer transfers","tags":["Customers"]}},"/v1/customers/{customerId}/fixed-routes":{"get":{"description":"Returns all fixed routes (virtual bank accounts and virtual wallets) configured for a customer.","operationId":"CustomersController_getCustomerFixedRoutes_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","description":"Customer ID","schema":{"example":"cus_abc123","type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of items to return (default: 50)","schema":{"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of items to skip (default: 0)","schema":{"type":"number"}}],"responses":{"200":{"description":"Paginated list of fixed routes","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/FixedRouteResponseDto"}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}}}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"List fixed routes for a customer","tags":["Customers"]}},"/v1/customers/{id}/compliance":{"get":{"description":"Verify that you have passed all required compliance information for a customer.\n    \nReturns a merged list of missing requirements plus any active overlays.\nUse this endpoint to check what information is still needed before submitting verification.\n\nNote: When RFIs (Requests for Information) are issued, additional fields may be added to this response.","operationId":"CustomersController_getComplianceStatus_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Customer ID","schema":{"example":"cus_abc123","type":"string"}}],"responses":{"200":{"description":"Customer compliance status","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerComplianceResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get customer compliance requirements","tags":["Customers"]}},"/v1/customers/{id}/capabilities":{"get":{"description":"Returns the capabilities currently available, in review, or unavailable for a customer. Provider-gated capabilities with no active provider path are omitted; customer-status-gated capabilities are omitted when their status requirement is not met.","operationId":"CustomersController_getCapabilities_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Customer ID","schema":{"example":"cus_abc123","type":"string"}}],"responses":{"200":{"description":"Customer capabilities","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerCapabilitiesResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get customer capabilities","tags":["Customers"]}},"/v1/customers/{id}":{"get":{"description":"Retrieve a customer by ID with optional expansion of related resources.\n\nUse the `expand` query parameter to include full objects:\n- `accounts`: Include customer accounts\n- `documents`: Include customer documents\n- `treasury`: Include treasury balances\n- `verificationSessions`: Include verification session summaries\n\nMultiple expansions can be requested: `?expand=accounts,documents`","operationId":"CustomersController_findOne_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"expand","required":false,"in":"query","description":"Fields to expand in the response. Pass as comma-separated values or repeated query params.","schema":{"example":["accounts","documents"],"type":"array","items":{"type":"string","enum":["accounts","documents","treasury","verificationSessions"]}}}],"responses":{"200":{"description":"Customer details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get customer by ID","tags":["Customers"]},"patch":{"operationId":"CustomersController_update_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCustomerDto"}}}},"responses":{"200":{"description":"Customer updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Update customer details","tags":["Customers"]},"delete":{"operationId":"CustomersController_delete_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":"Customer archived successfully"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Archive customer","tags":["Customers"]}},"/v1/customers/{id}/verification/individual":{"post":{"description":"Save complete individual verification data for an INDIVIDUAL customer.\n\nKey features:\n- Submit comprehensive individual verification data\n- Reference previously uploaded identity and supporting documents via document IDs (doc_xxx)\n- Optionally submit the customer for review in the same request via `?submit=true`\n\nData model covers the individual verification payload:\n- Personal info, address, employment, tax ID, government ID, supporting docs\n\nDocument workflow:\n1. Upload documents using POST /documents (with customerId in body)\n2. Confirm each document using POST /documents/:id/confirm\n3. Save the complete verification data to this endpoint using document references (doc_xxx)\n\n**Required for all files**:\n1. Create a minimal customer record first using POST /customers/individuals with basic info (name, email, country code)\n2. Upload documents using POST /documents (with customerId in body) and POST /documents/:id/confirm\n3. Save the complete verification data to this endpoint using document references (doc_xxx)\n","operationId":"CustomersController_submitIndividualVerification_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Customer ID","schema":{"example":"cus_abc123","type":"string"}},{"name":"submit","required":false,"in":"query","description":"If true, submit the customer for review after saving verification data.","schema":{"example":true,"type":"boolean"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitIndividualCustomerVerificationDto"}}}},"responses":{"201":{"description":"Verification submitted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitCustomerVerificationResponseDto"}}}},"400":{"description":"Invalid verification data or customer type mismatch"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Save individual customer verification","tags":["Customers"]}},"/v1/customers/{id}/verification/business":{"post":{"description":"Save complete business verification data for a BUSINESS customer.\n\nKey features:\n- Submit comprehensive business verification data\n- Reference previously uploaded business and supporting documents via document IDs (doc_xxx)\n- Optionally submit the customer for review in the same request via `?submit=true`\n\nData model covers the business verification payload:\n- Legal name, business type, addresses, tax info, UBOs, business docs, regulatory info\n- `associatedEntities` on this payload should contain only individual leaf beneficial owners and control persons\n- If ownership passes through an intermediate business, create that business first via the associated entity endpoints and then create child entities with `parentEntityId` set to that business entity ID\n\nDocument workflow:\n1. Upload documents using POST /documents (with customerId in body)\n2. Confirm each document using POST /documents/:id/confirm\n3. Save the complete verification data to this endpoint using document references (doc_xxx)\n\n**Required for all files**:\n1. Create a minimal customer record first using POST /customers/businesses with basic info (name, email, country code)\n2. Upload documents using POST /documents (with customerId in body) and POST /documents/:id/confirm\n3. Save the complete verification data to this endpoint using document references (doc_xxx)\n","operationId":"CustomersController_submitBusinessVerification_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Customer ID","schema":{"example":"cus_abc123","type":"string"}},{"name":"submit","required":false,"in":"query","description":"If true, submit the customer for review after saving verification data.","schema":{"example":true,"type":"boolean"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitBusinessCustomerVerificationDto"}}}},"responses":{"201":{"description":"Verification submitted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitCustomerVerificationResponseDto"}}}},"400":{"description":"Invalid verification data or customer type mismatch"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Save business customer verification","tags":["Customers"]}},"/v1/customers/{id}/submit":{"post":{"description":"Submit a DRAFT customer for verification review.\n\nThis endpoint is used when you've progressively built up customer data via PATCH requests\nand are ready to submit for verification. The customer must be in DRAFT status.\n\n**Workflow:**\n1. Create customer → customer is in DRAFT status\n2. Add data via PATCH /customers/:id as needed\n3. Call POST /customers/:id/submit to submit for verification\n\nAfter submission, the customer status transitions to IN_REVIEW. Document AI validation runs\nasynchronously; validation results are stored on each document's metadata and returned on internal document responses.\n\nFor RFI (Request for Information) flows:\n1. Customer gets NEED_ACTIONS status with missingRequirements\n2. Add missing data via PATCH /customers/:id\n3. Call POST /customers/:id/submit to re-submit","operationId":"CustomersController_submitCustomer_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Customer ID","schema":{"example":"cus_abc123","type":"string"}}],"responses":{"202":{"description":"Customer accepted for verification; document AI validation may still be running","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerResponseDto"}}}},"400":{"description":"Customer is not in a submittable state or missing required fields"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Submit customer for verification","tags":["Customers"]}},"/v1/customers/{id}/unmatched-deposits":{"get":{"description":"Returns pending deposits that could not be automatically matched to a transfer. These deposits are typically due to: wrong amount sent, multiple partial payments, or deposits to a wallet with no pending transfer. Treasury and transaction wallet deposits are excluded. Contact support to reconcile these deposits with a transfer, or sweep them to a treasury wallet.","operationId":"CustomersController_listUnmatchedDeposits_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Customer ID","schema":{"type":"string"}},{"name":"includeResolved","required":false,"in":"query","description":"Include reconciled and swept deposits (default: false)","schema":{"type":"boolean"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListUnmatchedDepositsResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"List unmatched deposits","tags":["Customers"]}},"/v1/customers/{customerId}/associated_individuals":{"post":{"description":"Create an individual associated entity for a business customer using a flat request body. Use this endpoint for UBOs, control persons, and signers.","operationId":"AssociatedEntitiesController_createIndividual_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","description":"An ID that uniquely identifies a customer resource","schema":{"example":"cus_1234567890abcdef","type":"string"}},{"name":"Idempotency-Key","required":false,"in":"header","description":"Idempotency key for preventing duplicate requests","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"New associated individual to be created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAssociatedIndividualDto"}}}},"responses":{"201":{"description":"Associated individual created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssociatedEntityResponseDto"}}}},"400":{"description":"Invalid input data or business rule violation"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"403":{"description":"Customer belongs to a different organization"},"404":{"description":"Customer not found"}},"security":[{"bearer":[]}],"summary":"Create a new associated individual","tags":["Customers"]}},"/v1/customers/{customerId}/associated_businesses":{"post":{"description":"Create a business associated entity for a business customer using a flat request body. Use this endpoint for intermediate business owners in a nested ownership tree. After creating the business, create its child owners using the associated entity endpoints and set parentEntityId to the returned associated business ID.","operationId":"AssociatedEntitiesController_createBusiness_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","description":"An ID that uniquely identifies a customer resource","schema":{"example":"cus_1234567890abcdef","type":"string"}},{"name":"Idempotency-Key","required":false,"in":"header","description":"Idempotency key for preventing duplicate requests","schema":{"type":"string"}}],"requestBody":{"required":true,"description":"New associated business to be created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAssociatedBusinessDto"}}}},"responses":{"201":{"description":"Associated business created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssociatedEntityResponseDto"}}}},"400":{"description":"Invalid input data or business rule violation"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"403":{"description":"Customer belongs to a different organization"},"404":{"description":"Customer not found"}},"security":[{"bearer":[]}],"summary":"Create a new associated business","tags":["Customers"]}},"/v1/customers/{customerId}/associated_entities/{id}":{"get":{"description":"Retrieve details of a specific associated entity for a customer. If the entity has an active verification session, the `verificationLink` field will be populated.","operationId":"AssociatedEntitiesController_findOne_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","description":"An ID that uniquely identifies a customer resource","schema":{"example":"cus_1234567890abcdef","type":"string"}},{"name":"id","required":true,"in":"path","description":"An ID that uniquely identifies an associated entity resource","schema":{"example":"asp_1234567890abcdef","type":"string"}}],"responses":{"200":{"description":"Associated entity details retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssociatedEntityResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"403":{"description":"Customer belongs to a different organization"},"404":{"description":"Associated entity or customer not found"}},"security":[{"bearer":[]}],"summary":"Get an associated entity by id and customer","tags":["Customers"]},"delete":{"description":"Remove an associated entity from a customer.","operationId":"AssociatedEntitiesController_delete_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","description":"An ID that uniquely identifies a customer resource","schema":{"example":"cus_1234567890abcdef","type":"string"}},{"name":"id","required":true,"in":"path","description":"An ID that uniquely identifies an associated entity resource","schema":{"example":"asp_1234567890abcdef","type":"string"}}],"responses":{"204":{"description":"Associated entity deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"403":{"description":"Customer belongs to a different organization"},"404":{"description":"Associated entity or customer not found"}},"security":[{"bearer":[]}],"summary":"Delete an associated entity","tags":["Customers"]}},"/v1/customers/{customerId}/associated_individuals/{id}":{"patch":{"description":"Update an individual associated entity for a customer without sending polymorphic nested detail objects.","operationId":"AssociatedEntitiesController_updateIndividual_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","description":"An ID that uniquely identifies a customer resource","schema":{"example":"cus_1234567890abcdef","type":"string"}},{"name":"id","required":true,"in":"path","description":"An ID that uniquely identifies an associated entity resource","schema":{"example":"asp_1234567890abcdef","type":"string"}}],"requestBody":{"required":true,"description":"Updated associated individual data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAssociatedIndividualDto"}}}},"responses":{"200":{"description":"Associated individual updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssociatedEntityResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Update an associated individual","tags":["Customers"]}},"/v1/customers/{customerId}/associated_businesses/{id}":{"patch":{"description":"Update a business associated entity for a customer without sending polymorphic nested detail objects.","operationId":"AssociatedEntitiesController_updateBusiness_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","description":"An ID that uniquely identifies a customer resource","schema":{"example":"cus_1234567890abcdef","type":"string"}},{"name":"id","required":true,"in":"path","description":"An ID that uniquely identifies an associated entity resource","schema":{"example":"asp_1234567890abcdef","type":"string"}}],"requestBody":{"required":true,"description":"Updated associated business data","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAssociatedBusinessDto"}}}},"responses":{"200":{"description":"Associated business updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssociatedEntityResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Update an associated business","tags":["Customers"]}},"/v1/customers/{customerId}/associated_entities/{id}/verification-link":{"post":{"description":"Generate a KYC verification link for an existing individual associated entity. If the entity already has an active verification session, the existing link is returned. If the session has expired, the expiry is reset and the refreshed link is returned. Only individual associated entities are supported; business entities will return an error.","operationId":"AssociatedEntitiesController_generateVerificationLink_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","description":"An ID that uniquely identifies a customer resource","schema":{"example":"cus_1234567890abcdef","type":"string"}},{"name":"id","required":true,"in":"path","description":"An ID that uniquely identifies an associated entity resource","schema":{"example":"asp_1234567890abcdef","type":"string"}}],"responses":{"200":{"description":"Verification link generated or retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationLinkDto"}}}},"400":{"description":"Entity is not an individual or other validation error"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"404":{"description":"Associated entity or customer not found"}},"security":[{"bearer":[]}],"summary":"Generate verification link for associated entity","tags":["Customers"]}},"/v1/counterparties":{"post":{"operationId":"CounterpartiesController_create_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCounterpartyDto"}}}},"responses":{"201":{"description":"Counterparty created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CounterpartyResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Create a counterparty","tags":["Counterparties"]},"get":{"description":"Lists counterparties for the organization. Counterparties are organization-scoped and may be linked to many customers through external accounts (many-to-many): the same counterparty can be paid by more than one customer. Use customerId to return only counterparties linked to that customer via an account.","operationId":"CounterpartiesController_list_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return (1-1000). Use with offset for traditional pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of results to skip. Use with limit for traditional pagination.","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"page_size","required":false,"in":"query","description":"Number of results per page (1-1000). Use with starting_after for cursor-based pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"starting_after","required":false,"in":"query","description":"Cursor for pagination. Use the ID of the last item from the previous page to get the next page. Use with page_size for cursor-based pagination.","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","description":"Search counterparties by name","schema":{"example":"Jane","type":"string"}},{"name":"customerId","required":false,"in":"query","description":"Filter to counterparties linked to this customer through an account. Counterparties are organization-scoped and shared across customers — the same counterparty can appear for multiple customers when each has a linked account.","schema":{"example":"cus_abc123","type":"string"}}],"responses":{"200":{"description":"Counterparties retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CounterpartyResponseDto"}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}}}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get all counterparties","tags":["Counterparties"]}},"/v1/counterparties/{id}":{"get":{"operationId":"CounterpartiesController_findOne_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Counterparty retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CounterpartyResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get counterparty by ID","tags":["Counterparties"]},"patch":{"operationId":"CounterpartiesController_update_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCounterpartyDto"}}}},"responses":{"200":{"description":"Counterparty updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CounterpartyResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Update a counterparty","tags":["Counterparties"]},"delete":{"operationId":"CounterpartiesController_delete_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":"Counterparty deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Delete a counterparty","tags":["Counterparties"]}},"/v1/documents":{"post":{"description":"Create an upload request for a document. Returns a signed URL for direct upload to storage.","operationId":"DocumentsController_createUploadRequest_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDocumentDto"}}}},"responses":{"201":{"description":"Upload request created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUploadResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Create document upload request","tags":["Documents"]},"get":{"description":"Get all documents for the organization, optionally filtered by customer or transfer.","operationId":"DocumentsController_listDocuments_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return (1-1000). Use with offset for traditional pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of results to skip. Use with limit for traditional pagination.","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"page_size","required":false,"in":"query","description":"Number of results per page (1-1000). Use with starting_after for cursor-based pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"starting_after","required":false,"in":"query","description":"Cursor for pagination. Use the ID of the last item from the previous page to get the next page. Use with page_size for cursor-based pagination.","schema":{"type":"string"}},{"name":"customerId","required":false,"in":"query","description":"Filter by customer ID","schema":{"example":"cus_abc123","type":"string"}},{"name":"transferId","required":false,"in":"query","description":"Filter by transfer ID","schema":{"example":"txn_xyz789","type":"string"}},{"name":"counterpartyId","required":false,"in":"query","description":"Filter by counterparty ID through linked transfers","schema":{"example":"cp_abc123","type":"string"}},{"name":"includeInternal","required":false,"in":"query","description":"Include internal/system-generated documents","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Documents retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DocumentResponseDto"}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}}}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"List documents","tags":["Documents"]}},"/v1/documents/{id}/confirm":{"post":{"description":"Confirm that a document has been uploaded to the signed URL.","operationId":"DocumentsController_confirmUpload_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmDocumentUploadDto"}}}},"responses":{"200":{"description":"Upload confirmed successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmDocumentUploadResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Confirm document upload","tags":["Documents"]}},"/v1/documents/{id}":{"get":{"description":"Get a specific document with its details and download URL.","operationId":"DocumentsController_getDocument_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"includeInternal","required":false,"in":"query","description":"Include internal/system-generated documents","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Document retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get document by ID","tags":["Documents"]}},"/v1/documents/{id}/archive":{"post":{"description":"Archive a document. Archived documents are not returned in list queries.","operationId":"DocumentsController_archiveDocument_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"string"}}}},"responses":{"200":{"description":"Document archived successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true}}}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Archive document","tags":["Documents"]}},"/v1/organizations/accessible":{"get":{"description":"Paginated, searchable list of organizations the caller can access (self, own subtree, or delegated oversight). Parent orgs use this instead of admin directory endpoints.","operationId":"OrganizationsController_listAccessibleOrganizations_v1","parameters":[{"name":"limit","required":false,"in":"query","description":"Number of results to return (1-1000). Use with offset for traditional pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of results to skip. Use with limit for traditional pagination.","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"page_size","required":false,"in":"query","description":"Number of results per page (1-1000). Use with starting_after for cursor-based pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"starting_after","required":false,"in":"query","description":"Cursor for pagination. Use the ID of the last item from the previous page to get the next page. Use with page_size for cursor-based pagination.","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","description":"Search by organization name, slug, or exact org_ id","schema":{"type":"string"}},{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated list of accessible organizations","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessibleOrganizationsListResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"List organizations in the caller data-access scope","tags":["organizations"]}},"/v1/organizations/{organizationId}/children":{"post":{"description":"Creates a one-level child under a top-level parent. Requires the child-organizations feature flag. Does not add the creator as a member.","operationId":"OrganizationsController_createChildOrganization_v1","parameters":[{"name":"organizationId","required":true,"in":"path","description":"Parent organization ID","schema":{"type":"string"}},{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateChildOrganizationDto"}}}},"responses":{"201":{"description":"Child organization created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Create a child organization","tags":["organizations"]}},"/v1/organizations/current":{"get":{"operationId":"OrganizationsController_getCurrentOrganization_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Current organization details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get current organization details","tags":["organizations"]},"patch":{"operationId":"OrganizationsController_updateCurrentOrganization_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrganizationDto"}}}},"responses":{"200":{"description":"Updated organization details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing JWT token"}},"security":[{"bearer":[]}],"summary":"Update current organization details","tags":["organizations"]}},"/v1/organizations/current/config":{"get":{"description":"Returns the organization configuration including per-network addresses for fee payouts and refunds. Each address includes an isDefault flag indicating if it uses the treasury wallet.","operationId":"OrganizationsController_getOrgConfig_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Organization configuration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgConfigResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get configuration for current organization","tags":["organizations"]},"put":{"description":"Update per-network fee payout addresses and/or refund account IDs. Set a refund account to null or empty string to fall back to the organization treasury wallet.","operationId":"OrganizationsController_updateOrgConfig_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrgConfigDto"}}}},"responses":{"200":{"description":"Updated organization configuration","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgConfigResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Update configuration for current organization","tags":["organizations"]}},"/v1/verification/sessions/{sessionId}/config":{"get":{"operationId":"VerificationController_getSessionConfig_v1","parameters":[{"name":"sessionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Session configuration with document requirements","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionConfigResponse"}}}}},"summary":"Get session configuration","tags":["Verification"]}},"/v1/verification/customers/{customerId}":{"get":{"operationId":"VerificationController_getCustomerVerification_v1","parameters":[{"name":"customerId","required":true,"in":"path","schema":{"type":"string"}},{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerVerificationResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get customer verification status","tags":["Verification"]}},"/v1/verification/initiate":{"post":{"description":"\nCreates a new verification session.\n\nAuthentication:\n- JWT token: Organization inferred from user's authenticated organization\n- API Key: Organization inferred from API key's associated organization\n\nCustomer handling:\n- If customerId is provided: Creates verification for existing customer\n- If customerId is omitted: Checks for existing customer by email. If found, uses existing customer. If not found, creates new customer with provided email/name details.\n\nIdempotency:\n- Customer email must be unique within the organization\n- If an active verification session exists for the customer, returns the existing session\n- If a pending verification session exists for the customer, returns an error","operationId":"VerificationController_initiateVerification_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiateVerificationDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiateVerificationResponseDto"}}}},"400":{"description":"Bad request - Customer has a pending verification session. Please wait for the current verification to be reviewed."},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Initiate a new verification","tags":["Verification"]}},"/v1/transfers":{"post":{"description":"Create a new transfer. Use the Idempotency-Key header to prevent duplicate creation.","operationId":"TransfersController_create_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"Idempotency-Key","required":false,"in":"header","description":"Optional idempotency key (UUID) to prevent duplicate transfers","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTransferDto"}}}},"responses":{"201":{"description":"Transfer created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Create a new transfer","tags":["Transfers"]},"get":{"operationId":"TransfersController_findAll_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return (1-1000). Use with offset for traditional pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of results to skip. Use with limit for traditional pagination.","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"page_size","required":false,"in":"query","description":"Number of results per page (1-1000). Use with starting_after for cursor-based pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"starting_after","required":false,"in":"query","description":"Cursor for pagination. Use the ID of the last item from the previous page to get the next page. Use with page_size for cursor-based pagination.","schema":{"type":"string"}},{"name":"id","required":false,"in":"query","description":"Filter by transfer ID prefix (e.g. tfr_abc123)","schema":{"maxLength":100,"type":"string"}},{"name":"sourceCustomerId","required":false,"in":"query","description":"Filter by source customer ID","schema":{"type":"string"}},{"name":"customerId","required":false,"in":"query","description":"Filter by either source or destination customer ID","schema":{"type":"string"}},{"name":"accountId","required":false,"in":"query","schema":{"type":"string"}},{"name":"counterpartyId","required":false,"in":"query","description":"Filter by counterparty ID","schema":{"type":"string"}},{"name":"clientReferenceId","required":false,"in":"query","description":"Filter by the clientReferenceId supplied at transfer creation. Exact match. Not enforced unique — multiple transfers can share a value, so treat the result as a list.","schema":{"maxLength":256,"example":"order_abc123","type":"string"}},{"name":"flow","required":false,"in":"query","schema":{"type":"string","enum":["CRYPTO_TO_CRYPTO","CRYPTO_TO_FIAT","FIAT_TO_CRYPTO","FIAT_TO_FIAT","FIAT_TO_CRYPTO_TO_FIAT","FX","INTERNAL","FEE_CRYPTO","REFUND_CRYPTO","REFUND_FIAT"]}},{"name":"status","required":false,"in":"query","description":"Filter by transfer status. Transfers that fail after funds are received are treated as IN_REVIEW and excluded from FAILED.","schema":{"type":"string","enum":["DRAFT","PENDING_AUTHORIZATION","IN_REVIEW","PENDING","PROCESSING","COMPLETED","FAILED","CANCELLED","REVERSED"]}},{"name":"startDate","required":false,"in":"query","schema":{"type":"string"}},{"name":"endDate","required":false,"in":"query","schema":{"type":"string"}},{"name":"expand","required":false,"in":"query","description":"Fields to expand in the response. Pass as comma-separated values or repeated query params.","schema":{"example":["counterparty"],"type":"array","items":{"type":"string","enum":["sourceAccount","destinationAccount","sourceCustomer","counterparty","documents"]}}}],"responses":{"200":{"description":"Transfers retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"has_more":{"type":"boolean","description":"Whether there are more results available"},"page_size":{"type":"number","description":"Number of results per page"},"url":{"type":"string","description":"URL for this request"},"data":{"type":"array","items":{"$ref":"#/components/schemas/TransferResponseDto"}},"page_next":{"type":"string","nullable":true,"description":"URL to fetch the next page of results"},"page_prev":{"type":"string","nullable":true,"description":"URL to fetch the previous page of results"}}}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"List transfers","tags":["Transfers"]}},"/v1/transfers/{id}/documents":{"get":{"description":"List customer-visible supporting documents attached to a transfer.","operationId":"TransfersController_findDocuments_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Transfer ID","schema":{"example":"tfr_abc123","type":"string"}}],"responses":{"200":{"description":"Transfer documents retrieved successfully","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DocumentResponseDto"}}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"List transfer documents","tags":["Transfers"]}},"/v1/transfers/{id}":{"get":{"description":"Retrieve a transfer by ID with optional expansion of related resources.\n\nUse the `expand` query parameter to include full objects instead of just IDs:\n- `sourceAccount`: Include full source account details\n- `destinationAccount`: Include full destination account details\n- `counterparty`: Include full counterparty details (for third-party transfers)\n- `documents`: Include document IDs (included by default)\n\nMultiple expansions can be requested: `?expand=sourceAccount,destinationAccount,counterparty`","operationId":"TransfersController_findOne_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"expand","required":false,"in":"query","description":"Fields to expand in the response. Pass as comma-separated values or repeated query params.","schema":{"example":["sourceAccount","destinationAccount"],"type":"array","items":{"type":"string","enum":["sourceAccount","destinationAccount","sourceCustomer","counterparty","documents"]}}},{"name":"includeInternal","required":false,"in":"query","description":"Include internal/system-generated documents","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Transfer retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferDetailResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get transfer by ID","tags":["Transfers"]},"patch":{"description":"Update a DRAFT transfer's details before submission.\n\nOnly transfers in DRAFT status can be updated. Once a transfer is submitted (moves to PENDING),\nit cannot be modified.\n\n**Workflow:**\n1. Create transfer with `confirm: false` (or omit) → transfer is in DRAFT status\n2. Update transfer details via PATCH /transfers/:id as needed\n3. When ready, call POST /transfers/:id/submit to submit for processing\n4. Transfer transitions to PENDING status and begins processing","operationId":"TransfersController_update_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Transfer ID","schema":{"example":"tfr_abc123","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTransferDto"}}}},"responses":{"200":{"description":"Transfer updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferResponseDto"}}}},"400":{"description":"Transfer is not in DRAFT status and cannot be updated"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Update transfer details","tags":["Transfers"]}},"/v1/transfers/{id}/submit":{"post":{"description":"Submit a DRAFT transfer for processing.\n\nThis endpoint is used when you've progressively built up transfer data via PATCH requests\nand are ready to submit for processing. The transfer must be in DRAFT status.\n\n**Workflow:**\n1. Create transfer with `confirm: false` (or omitted) → transfer is in DRAFT status\n2. Update details via PATCH /transfers/:id as needed\n3. Call POST /transfers/:id/submit to submit for processing\n\nAfter submission, the transfer status transitions to PENDING and deposit instructions\nare generated (for deposit-based flows).","operationId":"TransfersController_submitTransfer_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Transfer ID","schema":{"example":"tfr_abc123","type":"string"}}],"responses":{"200":{"description":"Transfer submitted for processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferResponseDto"}}}},"400":{"description":"Transfer is not in a submittable state or missing required fields"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Submit transfer for processing","tags":["Transfers"]}},"/v1/transfers/{id}/cancel":{"post":{"description":"Cancel a transfer that has not received funds. The transfer becomes CANCELLED after the request is processed. If funds have already arrived or started moving, the transfer moves to IN_REVIEW while our operations team handles the unwind. Completed, failed, reversed, or already cancelled transfers cannot be cancelled.","operationId":"TransfersController_cancelTransfer_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelTransferDto"}}}},"responses":{"200":{"description":"Cancellation accepted. The response status is CANCELLED when terminal, IN_REVIEW when funds require an unwind, or the current non-terminal status while cancellation processing completes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferResponseDto"}}}},"400":{"description":"Cancellation cannot be requested because the transfer is already completed, failed, reversed, or cancelled."},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Request transfer cancellation","tags":["Transfers"]}},"/v1/transfers/{id}/fund-from-balance":{"patch":{"description":"Fund a pending transfer from an Infinite Wallet balance. The funding customer does NOT need to be the transfer source customer, as long as they belong to the same organization. This allows for scenarios where one customer funds a transfer on behalf of another (e.g., treasury account funding on behalf of sender). Only crypto transfers awaiting deposit can be funded.","operationId":"TransfersController_fundFromBalance_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FundTransferFromBalanceDto"}}}},"responses":{"200":{"description":"Transfer funded successfully from Infinite Wallet balance.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferResponseDto"}}}},"400":{"description":"Transfer cannot be funded (not pending, not awaiting deposit, not crypto, or insufficient balance)"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Fund transfer from Infinite Wallet balance","tags":["Transfers"]}},"/v1/global-payout-batches":{"post":{"description":"Create a global payout batch. Supports USDT and USDC across their available networks (USDT on Ethereum, Arbitrum, Polygon, Solana, Tron; USDC on Ethereum, Base, Arbitrum, Polygon, Solana). Defaults to DRAFT unless `confirm` is true (PENDING_APPROVAL). Use Idempotency-Key to prevent duplicates.","operationId":"GlobalPayoutBatchesController_create_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"Idempotency-Key","required":false,"in":"header","description":"Optional idempotency key (UUID) to prevent duplicate batch creation","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePayoutBatchDto"}}}},"responses":{"201":{"description":"Global payout batch created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutBatchResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Create a global payout batch","tags":["Global Payout Batches"]},"get":{"operationId":"GlobalPayoutBatchesController_findAll_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return (1-1000). Use with offset for traditional pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of results to skip. Use with limit for traditional pagination.","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"page_size","required":false,"in":"query","description":"Number of results per page (1-1000). Use with starting_after for cursor-based pagination.","schema":{"minimum":1,"maximum":1000,"default":500,"type":"number"}},{"name":"starting_after","required":false,"in":"query","description":"Cursor for pagination. Use the ID of the last item from the previous page to get the next page. Use with page_size for cursor-based pagination.","schema":{"type":"string"}},{"name":"onBehalfOf","required":false,"in":"query","description":"Filter by customer ID (onBehalfOf).","schema":{"example":"cus_abc123","type":"string"}},{"name":"status","required":false,"in":"query","description":"Filter by batch status.","schema":{"type":"string","enum":["DRAFT","PENDING_APPROVAL","PROCESSING","COMPLETED","PARTIALLY_COMPLETED","FAILED","CANCELLED","REJECTED"]}}],"responses":{"200":{"description":"Global payout batches retrieved","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/PayoutBatchResponseDto"}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}}}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"List global payout batches","tags":["Global Payout Batches"]}},"/v1/global-payout-batches/{id}":{"get":{"operationId":"GlobalPayoutBatchesController_findOne_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"example":"pb_abc123","type":"string"}}],"responses":{"200":{"description":"Global payout batch retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutBatchResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get a global payout batch","tags":["Global Payout Batches"]}},"/v1/global-payout-batches/{id}/confirm":{"post":{"description":"Move a DRAFT global payout batch to PENDING_APPROVAL for review.","operationId":"GlobalPayoutBatchesController_confirm_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"example":"pb_abc123","type":"string"}}],"responses":{"200":{"description":"Global payout batch confirmed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutBatchResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Confirm a global payout batch","tags":["Global Payout Batches"]}},"/v1/global-payout-batches/{id}/cancel":{"post":{"description":"Cancel a DRAFT or PENDING_APPROVAL global payout batch. No child transfers are created after cancellation.","operationId":"GlobalPayoutBatchesController_cancel_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"example":"pb_abc123","type":"string"}}],"responses":{"200":{"description":"Global payout batch cancelled","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutBatchResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Cancel a global payout batch","tags":["Global Payout Batches"]}},"/health":{"get":{"description":"Reports whether the platform is currently serving traffic, so callers can route payments elsewhere while we are impaired. Safe to poll — checks are cached for a few seconds and require no authentication. Failover on `status` rather than the HTTP code alone: a `degraded` response is still `200` because reads and account management keep working while payments stall.","operationId":"HealthController_check","parameters":[],"responses":{"200":{"description":"Serving traffic, either fully (`operational`) or partially","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponseDto"}}}},"503":{"description":"Not serving traffic — send payments elsewhere","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponseDto"}}}}},"summary":"Health check","tags":["Health"]}},"/v1/rfis":{"get":{"operationId":"RfisController_findForOrganization_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"search","required":false,"in":"query","description":"Search RFIs by customer name or instructions","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomerRfiResponseDto"}}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"List RFIs","tags":["RFIs"]}},"/v1/customers/{customerId}/rfis":{"get":{"operationId":"RfisController_findForCustomer_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","description":"Customer ID","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","description":"Search RFIs by customer name or instructions","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CustomerRfiResponseDto"}}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"List customer RFIs","tags":["RFIs"]}},"/v1/customers/{customerId}/rfis/{id}":{"get":{"operationId":"RfisController_findOneForCustomer_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"customerId","required":true,"in":"path","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerRfiResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get customer RFI","tags":["RFIs"]}},"/v1/webhooks/messages":{"get":{"description":"Returns webhook messages sent to the organization, newest first. Scope to an endpoint with endpointId for per-endpoint delivery status and status filtering. Paginate with the iterator cursor returned by the previous page. Message history is retained for 90 days.","operationId":"WebhooksController_listMessages_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"endpointId","required":false,"in":"query","description":"Scope results to a single endpoint. Required for status filtering.","schema":{"example":"ep_1234567890abcdef","type":"string"}},{"name":"eventTypes","required":false,"in":"query","description":"Filter by event types (comma-separated)","schema":{"example":"transfer.completed,transfer.failed","type":"array","items":{"type":"string"}}},{"name":"status","required":false,"in":"query","description":"Filter by delivery status. Only applies when endpointId is provided.","schema":{"type":"string","enum":["SUCCESS","PENDING","FAIL","SENDING","CANCELED"]}},{"name":"before","required":false,"in":"query","description":"Only include messages created before this timestamp","schema":{"example":"2026-08-01T00:00:00Z","type":"string"}},{"name":"after","required":false,"in":"query","description":"Only include messages created after this timestamp","schema":{"example":"2026-07-01T00:00:00Z","type":"string"}},{"name":"tag","required":false,"in":"query","description":"Filter by resource tag, e.g. a transfer or customer ID carried on the message","schema":{"example":"tfr_1234567890abcdef","type":"string"}},{"name":"iterator","required":false,"in":"query","description":"Pagination cursor returned by a previous page","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Number of results to return per page","schema":{"minimum":1,"maximum":250,"default":50,"type":"number"}}],"responses":{"200":{"description":"Webhook messages retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookMessageListResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"List webhook messages","tags":["Webhooks"]}},"/v1/webhooks/messages/{messageId}":{"get":{"description":"Returns a webhook message with its payload and per-endpoint delivery attempts. The message ID matches the webhook-id header on the delivery.","operationId":"WebhooksController_getMessage_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"messageId","required":true,"in":"path","description":"The ID of the webhook message","schema":{"example":"msg_1234567890abcdef","type":"string"}}],"responses":{"200":{"description":"Webhook message retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookMessageDetailResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get a webhook message","tags":["Webhooks"]}},"/v1/webhooks/messages/{messageId}/resend":{"post":{"description":"Redelivers an existing webhook message with its original payload. Defaults to every enabled endpoint subscribed to the event type; pass endpointId to target a single endpoint.","operationId":"WebhooksController_resendMessage_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"messageId","required":true,"in":"path","description":"The ID of the webhook message","schema":{"example":"msg_1234567890abcdef","type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendWebhookMessageDto"}}}},"responses":{"201":{"description":"Webhook message resent successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendWebhookMessageResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Resend a webhook message","tags":["Webhooks"]}},"/v1/webhooks/endpoints":{"get":{"description":"Retrieve all webhook endpoints configured for the organization.","operationId":"WebhooksController_getEndpoints_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Webhook endpoints retrieved successfully","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EndpointResponseDto"}}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get all webhook endpoints","tags":["Webhooks"]},"post":{"description":"Create a new webhook endpoint to receive events.","operationId":"WebhooksController_createEndpoint_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEndpointDto"}}}},"responses":{"201":{"description":"Webhook endpoint created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Create a new webhook endpoint","tags":["Webhooks"]}},"/v1/webhooks/endpoints/{endpointId}/recover":{"post":{"description":"Redelivers every failed delivery to the endpoint since a timestamp. Useful after an outage on your receiver. Runs asynchronously in the background.","operationId":"WebhooksController_recoverEndpoint_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"endpointId","required":true,"in":"path","description":"The ID of the webhook endpoint","schema":{"example":"ep_1234567890abcdef","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecoverEndpointDto"}}}},"responses":{"201":{"description":"Replay started successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecoverEndpointResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Replay failed webhook deliveries","tags":["Webhooks"]}},"/v1/webhooks/endpoints/{endpointId}/secret":{"get":{"description":"Returns the signing secret used to verify webhook signatures for this endpoint.","operationId":"WebhooksController_getEndpointSecret_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"endpointId","required":true,"in":"path","description":"The ID of the webhook endpoint","schema":{"example":"ep_1234567890abcdef","type":"string"}}],"responses":{"200":{"description":"Signing secret retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointSecretResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get webhook endpoint signing secret","tags":["Webhooks"]}},"/v1/webhooks/endpoints/{endpointId}/secret/rotate":{"post":{"description":"Generates a new signing secret for the endpoint. The previous secret stays valid for 24 hours so receivers can roll over without dropping deliveries.","operationId":"WebhooksController_rotateEndpointSecret_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"endpointId","required":true,"in":"path","description":"The ID of the webhook endpoint","schema":{"example":"ep_1234567890abcdef","type":"string"}}],"responses":{"201":{"description":"Signing secret rotated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointSecretResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Rotate webhook endpoint signing secret","tags":["Webhooks"]}},"/v1/webhooks/endpoints/{endpointId}":{"put":{"description":"Update an existing webhook endpoint configuration.","operationId":"WebhooksController_updateEndpoint_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"endpointId","required":true,"in":"path","description":"The ID of the webhook endpoint","schema":{"example":"ep_1234567890abcdef","type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEndpointDto"}}}},"responses":{"200":{"description":"Webhook endpoint updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndpointResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Update a webhook endpoint","tags":["Webhooks"]},"delete":{"description":"Delete a webhook endpoint. This action cannot be undone.","operationId":"WebhooksController_deleteEndpoint_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"endpointId","required":true,"in":"path","description":"The ID of the webhook endpoint","schema":{"example":"ep_1234567890abcdef","type":"string"}}],"responses":{"204":{"description":"Webhook endpoint deleted successfully"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Delete a webhook endpoint","tags":["Webhooks"]}},"/v1/quotes":{"post":{"description":"Create a quote. Use the Idempotency-Key header to prevent duplicate creation.","operationId":"QuotesController_create_v1","parameters":[{"name":"Idempotency-Key","required":false,"in":"header","description":"Idempotency key for preventing duplicate requests","schema":{"type":"string"}},{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateQuoteDto"}}}},"responses":{"201":{"description":"Quote created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Create a quote","tags":["Quotes"]}},"/v1/quotes/{id}":{"get":{"operationId":"QuotesController_findOne_v1","parameters":[{"name":"id","required":true,"in":"path","description":"Quote ID","schema":{"type":"string"}},{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Quote retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuoteResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Get a quote by ID","tags":["Quotes"]}},"/v1/tos":{"post":{"description":"Creates a ToS acceptance record with the agreement fields set to false or null. Returns an ID that must be used with the accept endpoint to complete the acceptance. This is the first step in a two-step process: first call initiate to get an ID, then call accept with that ID when the user actually accepts the agreements.","operationId":"TosController_initiate_v1","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiateTosRequestDto"}}}},"responses":{"201":{"description":"ToS acceptance initiated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiateTosResponseDto"}}}}},"summary":"Initiate ToS acceptance","tags":["Terms of Service"]}},"/v1/tos/{id}/accept":{"post":{"description":"Updates an existing ToS acceptance record with the agreement acceptance fields and acceptance timestamp. This is the second step in the two-step process: you must first call initiate to get an ID, then call this endpoint with that ID when the user accepts the agreements. This endpoint captures IP address and user agent for audit purposes.","operationId":"TosController_accept_v1","parameters":[{"name":"id","required":true,"in":"path","description":"ToS acceptance ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptTosRequestDto"}}}},"responses":{"200":{"description":"ToS accepted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptTosResponseDto"}}}}},"summary":"Accept Terms of Service","tags":["Terms of Service"]}},"/v1/tos/{id}":{"get":{"description":"Retrieves the status of a ToS acceptance record.","operationId":"TosController_getById_v1","parameters":[{"name":"id","required":true,"in":"path","description":"ToS acceptance ID","schema":{"type":"string"}}],"responses":{"200":{"description":"ToS acceptance retrieved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TosAcceptanceResponseDto"}}}}},"summary":"Get ToS acceptance status","tags":["Terms of Service"]}},"/v1/sandbox/customers/{id}/status":{"put":{"description":"Set the verification status of a customer to any status for testing purposes. This endpoint is only available in the sandbox environment and allows you to simulate different verification states.","operationId":"SandboxController_setCustomerStatus_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Customer ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxSetCustomerStatusDto"}}}},"responses":{"200":{"description":"Customer status updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerResponseDto"}}}},"400":{"description":"Not in sandbox environment or invalid status"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"404":{"description":"Customer not found"}},"security":[{"bearer":[]}],"summary":"Set customer verification status","tags":["Sandbox"]},"servers":[{"url":"https://sandbox.api.infinite.dev","description":"Sandbox"}]},"/v1/sandbox/customers/{id}/capabilities":{"put":{"description":"Make the requested capabilities READY for a sandbox customer by simulating the underlying approvals, without running real onboarding. The customer must already be ACTIVE (see the customer status endpoint). Emits the same capability webhooks as production.","operationId":"SandboxController_simulateCapabilities_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Customer ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxSimulateCapabilitiesDto"}}}},"responses":{"200":{"description":"Capabilities simulated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerCapabilitiesResponseDto"}}}},"400":{"description":"Not in sandbox environment, customer not ACTIVE, or a capability cannot be simulated"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"404":{"description":"Customer not found"}},"security":[{"bearer":[]}],"summary":"Simulate customer capabilities","tags":["Sandbox"],"x-mint":{"content":"## Testing balance accounts end to end\n\n1. Set the customer status to `ACTIVE` via the customer status endpoint\n2. Simulate `USD_BALANCE` with this endpoint\n3. [Create the balance account](/api-reference/balance-accounts/create-a-balance-account)\n4. Credit it with [account fund-in](/api-reference/sandbox/simulate-account-funding)\n\n<Note>The customer must be `ACTIVE` before capabilities can be simulated. Capabilities that depend on provider-side configuration that cannot be simulated return `400`.</Note>"}},"servers":[{"url":"https://sandbox.api.infinite.dev","description":"Sandbox"}]},"/v1/sandbox/accounts/{id}/fund-in":{"post":{"description":"Simulate inbound funding for a sandbox funding-method account (`vba_` for virtual bank accounts, including USD balance accounts; `vwa_` for virtual wallets; `pba_` for stablecoin balance accounts) using a requested rail.","operationId":"SandboxController_simulateFundIn_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Funding-method account id (`vba_` for virtual bank, `vwa_` for virtual wallet, `pba_` for stablecoin balance)","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxFundInDto"}}}},"responses":{"200":{"description":"Sandbox fund-in simulated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxFundInResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Simulate account funding","tags":["Sandbox"],"x-mint":{"content":"## Account id\n\nPass the funding-method account id returned when the account was created (`vba_…` for a virtual bank account, including a USD balance account; `vwa_…` for a virtual wallet; `pba_…` for a stablecoin balance account). Do not use a top-level `acct_` id.\n\n## Infinite wallets (`inw_`)\n\nThis endpoint does **not** credit Infinite wallets (`inw_…`). That includes treasury vaults and crypto deposit mailboxes created by `POST /v1/fixed-routes/virtual-wallets` (those are `INFINITE_WALLET`, not `vwa_`).\n\nTo credit a treasury vault so you can test withdrawals, pick a route whose sweep target is that vault and [simulate-deposit](/api-reference/sandbox/simulate-a-fixed-route-source-deposit) with that route's source account id (`vba_…` or mailbox `inw_…`). Funds land on the destination, not the source mailbox.\n\n## Stablecoin balance funding\n\nFund a `pba_…` stablecoin balance account with `rail: BLOCKCHAIN` plus the `network` and `currency` the account holds (e.g. `USDT` on `ETHEREUM`). The credit posts immediately and emits a `balance.credited` webhook. Reuse `reference` to make retries idempotent.\n\n## Sandbox settlement timing\n\n<Note>For `ACH` and `WIRE` on provider-simulated bank accounts, sandbox funds do not settle until 5:00 PM ET on weekdays to mirror production timing. Balance-account fund-in credits immediately.</Note>"}},"servers":[{"url":"https://sandbox.api.infinite.dev","description":"Sandbox"}]},"/v1/sandbox/fixed-routes/{id}/simulate-deposit":{"post":{"description":"Sandbox-only: triggers the fixed-route sweep without on-chain funds or provider webhooks. Works for fiat (`vba_`) and crypto (`inw_`) source routes. Does not use account fund-in -- Infinite wallets cannot be credited that way. Idempotent when `reference` is reused.","operationId":"SandboxController_simulateFixedRouteDeposit_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Fixed route source account id (`vba_` for fiat, `inw_` for crypto deposit wallets)","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxSimulateFixedRouteDepositDto"}}}},"responses":{"200":{"description":"Fixed route sweep simulated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxSimulateFixedRouteDepositResponseDto"}}}},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"}},"security":[{"bearer":[]}],"summary":"Simulate a fixed-route source deposit","tags":["Sandbox"],"x-mint":{"content":"## Source account id\n\nPass the fixed route's **source account id** -- `vba_…` for fiat mailboxes, `inw_…` for crypto deposit wallets. This is the public fixed-route id.\n\nThe sweep runs without on-chain funds. Use this to credit a destination Infinite wallet (vault) in sandbox, then create a transfer from that vault to test withdrawals.\n\n`POST /v1/sandbox/accounts/{id}/fund-in` cannot replace this call for `inw_` accounts."}},"servers":[{"url":"https://sandbox.api.infinite.dev","description":"Sandbox"}]},"/v1/sandbox/transfers/{id}/simulate":{"post":{"description":"Advance a sandbox transfer through realistic flow stages, creating legs, updating transfer status, and emitting webhooks/events. Completing the simulation also posts the corresponding balance movements for balance-backed accounts: the source balance is debited and a stablecoin balance destination is credited.","operationId":"SandboxController_simulateTransfer_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"id","required":true,"in":"path","description":"Transfer ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxSimulateTransferDto"}}}},"responses":{"200":{"description":"Transfer simulated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferResponseDto"}}}},"400":{"description":"Invalid target status or simulation precondition failed"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"404":{"description":"Transfer not found"}},"security":[{"bearer":[]}],"summary":"Simulate transfer lifecycle","tags":["Sandbox"]},"servers":[{"url":"https://sandbox.api.infinite.dev","description":"Sandbox"}]},"/v1/sandbox/transfers/{transferId}/legs/{legId}/status":{"put":{"description":"Simulate a transfer leg completing, failing, or progressing. The parent transfer status will automatically update based on leg states. This is useful for testing webhook integrations and transfer state transitions.","operationId":"SandboxController_setLegStatus_v1","parameters":[{"name":"X-API-Key","in":"header","description":"API key","required":false,"schema":{"type":"string"}},{"name":"transferId","required":true,"in":"path","description":"Transfer ID","schema":{"type":"string"}},{"name":"legId","required":true,"in":"path","description":"Transfer leg ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SandboxSetLegStatusDto"}}}},"responses":{"200":{"description":"Leg status updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferResponseDto"}}}},"400":{"description":"Not in sandbox environment or invalid status transition"},"401":{"description":"Unauthorized - Invalid or missing authentication credentials"},"404":{"description":"Transfer or leg not found"}},"security":[{"bearer":[]}],"summary":"Set transfer leg status","tags":["Sandbox"]},"servers":[{"url":"https://sandbox.api.infinite.dev","description":"Sandbox"}]}},"info":{"title":"Infinite API","description":"API for Infinite","version":"1.0","contact":{}},"tags":[{"name":"Accounts","description":"Virtual and external account management"},{"name":"Customers","description":"Customer identity management"},{"name":"Documents","description":"Document upload and management"},{"name":"Fixed Routes","description":"Fixed route management"},{"name":"External Bank Accounts","description":"External bank account management"},{"name":"External Wallets","description":"External wallet management"},{"name":"Infinite Wallets","description":"Infinite Wallet management"},{"name":"Organizations","description":"Organization management"},{"name":"Quotes","description":"Quote creation and management"},{"name":"Transfers","description":"Money movement and transaction tracking"},{"name":"Verification","description":"Identity verification workflows"},{"name":"Terms of Service","description":"Terms of Service acceptance"},{"name":"Health","description":"System health and monitoring"},{"name":"Sandbox","description":"Sandbox utilities"}],"servers":[{"url":"https://sandbox.api.infinite.dev","description":"Sandbox"},{"url":"https://api.infinite.dev","description":"Production"}],"components":{"securitySchemes":{"webhook-signature":{"type":"apiKey","in":"header","name":"X-Provider-Signature"},"api-key":{"type":"apiKey","in":"header","name":"X-API-Key","description":"API Key authentication"},"bearer":{"scheme":"bearer","bearerFormat":"API Key","type":"http","description":"API Key in Bearer format (e.g., Bearer sk_test_...)"}},"schemas":{"FxPairOptionDto":{"type":"object","properties":{"sourceCurrency":{"type":"string","example":"USDC"},"destinationCurrency":{"type":"string","example":"EUR"}},"required":["sourceCurrency","destinationCurrency"]},"FxPairsListResponseDto":{"type":"object","properties":{"pairs":{"description":"FX pairs enabled for the calling organization. The list is the intersection of `OrganizationFxConfig` rows and the platform-wide vendor eligibility matrix, with fiat-destination pairs filtered out when the org lacks `FX_FIAT_PAIRS_ENABLED`. Ordered by `SOURCE:DEST` for stable rendering.","type":"array","items":{"$ref":"#/components/schemas/FxPairOptionDto"}}},"required":["pairs"]},"FxPairDto":{"type":"object","properties":{"sourceCurrency":{"type":"string","example":"USDT"},"sourceNetwork":{"type":"string","description":"Network for crypto source (e.g. BASE, ETHEREUM). Required when source is a crypto asset; must be omitted when source is fiat.","example":"BASE"},"sourceRail":{"type":"string","description":"Rail for fiat source (SEPA, SEPA_INSTANT, FASTER_PAYMENTS). Required when source is fiat; must be omitted when source is crypto. For EUR onramp prefer `SEPA`; `SEPA_INSTANT` remains accepted. Slow EUR rails are not available today.","example":"SEPA"},"destinationCurrency":{"type":"string","example":"USDC"},"destinationNetwork":{"type":"string","description":"Network for crypto destination. Required when destination is a crypto asset; must be omitted when destination is fiat.","example":"BASE"},"destinationRail":{"type":"string","description":"Rail for fiat destination (SEPA, SWIFT, ACH). Required when destination is fiat; must be omitted when destination is crypto.","example":"SEPA"}},"required":["sourceCurrency","destinationCurrency"]},"FxAmountDto":{"type":"object","properties":{"value":{"type":"string","pattern":"^[1-9]\\d*$","description":"Amount in minor units of whichever side is locked. Positive integer string.","example":"10000000"},"side":{"enum":["SOURCE","DESTINATION"],"type":"string","description":"Which amount the customer locked. SOURCE = customer's gross spend; DESTINATION = customer's receivable.","example":"SOURCE"}},"required":["value","side"]},"CreateFxQuoteDto":{"type":"object","properties":{"onBehalfOf":{"type":"string","description":"Customer this quote is for (the customer who will deposit).","example":"cus_abc123"},"pair":{"$ref":"#/components/schemas/FxPairDto"},"amount":{"$ref":"#/components/schemas/FxAmountDto"},"maxSlippageBps":{"type":"number","description":"Per-trade max slippage tolerance on the re-quote step, in basis points (1 bp = 0.01%). Minimum 5, maximum 1000. Optional for stable sources — if omitted, the organization-level default for the pair applies. REQUIRED for volatile sources (e.g. BTC): a quote whose source can move materially across the deposit-confirmation window is rejected when this is omitted, so the tolerance the customer accepts is always explicit.","minimum":5,"maximum":1000,"example":25}},"required":["onBehalfOf","pair","amount"]},"FxQuoteExpectedDepositDetailsDto":{"type":"object","properties":{"kind":{"enum":["CRYPTO_ADDRESS","FIAT_INSTRUCTIONS_ON_ACCEPT"],"type":"string","description":"How the source side will be funded after accepting. CRYPTO_ADDRESS: the deposit address is known now (`address` + `network`). FIAT_INSTRUCTIONS_ON_ACCEPT: bank wire instructions are issued on the trade returned by accepting the quote.","example":"CRYPTO_ADDRESS"},"address":{"type":"string","description":"Deposit address the trade will use. Present only when `kind=CRYPTO_ADDRESS`. NOT active until the trade returned by accepting this quote carries deposit instructions — see `note`.","example":"0xCustomerInfiniteTxWallet..."},"network":{"type":"string","description":"Network of `address`. Present only when `kind=CRYPTO_ADDRESS`.","example":"BASE"},"note":{"type":"string","description":"Pre-accept warning to surface alongside the preview.","example":"Deposit instructions become active only when the trade created by accepting this quote includes them — immediately on accept, or after the fx_trade.deposit_instructions_ready event if the trade starts in PENDING_WALLET_APPROVAL. Funds sent before then cannot be matched to a trade."}},"required":["kind","note"]},"FxQuoteResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"quote_abc123"},"pair":{"$ref":"#/components/schemas/FxPairDto"},"amount":{"$ref":"#/components/schemas/FxAmountDto"},"grossSource":{"type":"string","description":"Source amount, fees included, in source-currency minor units.","example":"10000000"},"displayedDestination":{"type":"string","description":"Destination amount the customer will receive, in destination-currency minor units.","example":"9998500"},"rate":{"type":"string","description":"All-in customer rate (displayedDestination / grossSource).","example":"0.9998500"},"expiresAt":{"type":"string","description":"When the firm quote expires (ISO 8601).","example":"2026-05-26T19:42:00.000Z"},"quoteBinding":{"enum":["PERSISTED","AT_ACCEPT"],"type":"string","description":"How this quote binds to a later trade. `PERSISTED`: the firm price is held and a trade created from this quote replays it, so accepting later (within `expiresAt`) is safe. `AT_ACCEPT`: pricing is finalized when the trade is created, so the price may move between quote and accept.","example":"PERSISTED"},"expectedDepositDetails":{"description":"Preview of the deposit details the trade will carry once this quote is accepted. Omitted when the preview could not be resolved (the quote itself is unaffected — accept normally and use the deposit instructions on the trade).","allOf":[{"$ref":"#/components/schemas/FxQuoteExpectedDepositDetailsDto"}]}},"required":["id","pair","amount","grossSource","displayedDestination","rate","expiresAt"]},"FxNotExecutableLimitsDto":{"type":"object","properties":{"sourceCurrency":{"type":"string","example":"USDC"},"min":{"type":"string","description":"Minimum source amount in minor units.","example":"0"},"max":{"type":"string","description":"Maximum source amount in minor units.","example":"10000000"}},"required":["sourceCurrency","min","max"]},"FxNotExecutableResponseDto":{"type":"object","properties":{"message":{"enum":["fx_quote_capacity_exhausted","fx_quote_amount_too_small","fx_quote_amount_too_large","fx_quote_temporarily_unavailable"],"type":"string","description":"Stable error code.","example":"fx_quote_amount_too_large"},"hint":{"type":"string","description":"Human-readable explanation.","example":"Amount is above the maximum for this corridor."},"limits":{"description":"Per-corridor source-amount bounds. Present only for the `fx_quote_amount_too_small` / `fx_quote_amount_too_large` codes on `POST /v1/fx/quotes`, and only when available.","allOf":[{"$ref":"#/components/schemas/FxNotExecutableLimitsDto"}]},"requested":{"type":"string","description":"The originally requested source amount in minor units. Present only alongside `limits`.","example":"100000000"}},"required":["message","hint"]},"FxRateResponseDto":{"type":"object","properties":{"rate":{"type":"string","description":"Indicative all-in customer rate for `destinationCurrency / sourceCurrency`, post-spread. Not a firm quote — request `POST /v1/fx/quotes` to commit a price.","example":"0.99975"},"asOf":{"type":"string","description":"When the underlying reference rate was sourced (ISO 8601). Rates are cached briefly to stay inside vendor budgets; this is the cache anchor, not a per-request timestamp.","example":"2026-05-26T19:42:00.000Z"},"pairKey":{"type":"string","description":"Canonical SOURCE:DEST pair key (uppercase).","example":"USDT:USDC"},"source":{"type":"string","description":"Always `reference` for this endpoint. Discriminator left open for future indicative-rate sources without changing the response shape.","enum":["reference"],"example":"reference"}},"required":["rate","asOf","pairKey","source"]},"FxPayoutDestinationDto":{"type":"object","properties":{"type":{"enum":["EXTERNAL_WALLET","FIAT_BANK_ACCOUNT"],"type":"string","description":"Destination type. `EXTERNAL_WALLET` for crypto payouts, `FIAT_BANK_ACCOUNT` for fiat payouts.","example":"EXTERNAL_WALLET"},"address":{"type":"string","description":"Recipient wallet address. Required when `type=EXTERNAL_WALLET`.","example":"0xabc123..."},"network":{"type":"string","description":"Network the recipient address lives on. Required when `type=EXTERNAL_WALLET`.","example":"BASE"},"bankAccountId":{"type":"string","description":"Public ID (`eba_…` for bank rails, `epa_…` for proxy rails like PIX) of an existing external account belonging to the receiving customer. Required when `type=FIAT_BANK_ACCOUNT`. The payment rail and beneficiary fields are resolved from the persisted account; create the account first via `POST /v1/external-bank-accounts` (bank details or `aliasType`/`aliasValue`) and pass back its `id` here.","example":"eba_abc123"},"payoutReference":{"type":"string","pattern":"^[A-Z0-9]{1,20}$","description":"Reference forwarded to the bank as the payout memo. Optional, fiat only. Must be 1-20 characters using only uppercase letters A-Z and digits 0-9 (matches the underlying SWIFT/SEPA memo field constraints).","example":"INV20260417"}},"required":["type"]},"CreateFxTradeDto":{"type":"object","properties":{"quoteId":{"type":"string","description":"ID of a PENDING firm quote returned by `POST /v1/fx/quotes`.","example":"quote_abc123"},"payoutDestination":{"$ref":"#/components/schemas/FxPayoutDestinationDto"}},"required":["quoteId","payoutDestination"]},"FxTradeDepositInstructionsDto":{"type":"object","properties":{"address":{"type":"string","description":"Address the customer must send `grossSource` to within the deposit window.","example":"0xCustomerInfiniteTxWallet..."},"network":{"type":"string","example":"BASE"},"amount":{"type":"string","description":"Amount the customer must deposit, in source-currency minor units.","example":"10000000"},"expiresAt":{"type":"string","description":"Customer-facing deposit deadline (ISO 8601). Late deposits are not honored.","example":"2026-05-26T19:54:00.000Z"}},"required":["address","network","amount","expiresAt"]},"FxTradeFundingInstructionsBankDto":{"type":"object","properties":{"name":{"type":"string","example":"Commerzbank AG"},"address":{"type":"string","example":"Mainzer Landstraße 153, 60327 Frankfurt"},"country":{"type":"string","description":"ISO 3166-2.","example":"DE"}}},"FxTradeFundingInstructionsAccountDto":{"type":"object","properties":{"supportedRails":{"description":"Rails this account accepts inbound wires on. Pick the account whose rails include the one used to initiate the wire.","example":["SEPA"],"type":"array","items":{"type":"string"}},"accountHolderName":{"type":"string","example":"Acme Onramp Ltd"},"accountNumber":{"type":"string","example":"12345678"},"iban":{"type":"string","example":"DE89370400440532013000"},"bic":{"type":"string","example":"COBADEFFXXX"},"sortCode":{"type":"string","example":"12-34-56"},"routingNumber":{"type":"string","description":"ABA routing number (US ACH / Fedwire).","example":"021000021"}},"required":["supportedRails"]},"FxTradeFundingInstructionsSwiftBankDto":{"type":"object","properties":{"role":{"enum":["INTERMEDIARY","CORRESPONDENT"],"type":"string"},"bankName":{"type":"string","example":"Citibank N.A."},"bic":{"type":"string","example":"CITIUS33XXX"},"abaRoutingNumber":{"type":"string","example":"021000089"}},"required":["role","bankName","bic"]},"FxTradeFundingInstructionsDto":{"type":"object","properties":{"reference":{"type":"string","description":"Reference the customer must include on their outbound wire so the funds can be attributed to this trade. Customer-visible; renders verbatim in their banking app.","example":"CDX-7K2A9V"},"currency":{"type":"string","description":"ISO 4217.","example":"EUR"},"amount":{"type":"string","description":"Amount the customer must wire, in source-currency minor units.","example":"10000"},"supportedRails":{"description":"Rails accepted for the inbound wire — the customer picks one in their banking app and matches it to the account variant in `accounts` carrying the right identifiers for that rail.","example":["SEPA"],"type":"array","items":{"type":"string"}},"bank":{"$ref":"#/components/schemas/FxTradeFundingInstructionsBankDto"},"accounts":{"description":"One entry per rail-variant receiving account. Pick the entry matching the rail used to initiate the wire.","type":"array","items":{"$ref":"#/components/schemas/FxTradeFundingInstructionsAccountDto"}},"swiftRoutingBanks":{"description":"Correspondent / intermediary banks required when routing via SWIFT. Omitted when the route has no SWIFT correspondents.","type":"array","items":{"$ref":"#/components/schemas/FxTradeFundingInstructionsSwiftBankDto"}},"expiresAt":{"type":"string","description":"Wire-by deadline (ISO 8601).","example":"2026-05-26T19:54:00.000Z"}},"required":["reference","currency","amount","supportedRails","bank","accounts","expiresAt"]},"FxTradeResponseDto":{"type":"object","properties":{"tradeId":{"type":"string","example":"tfr_abc123"},"status":{"enum":["PENDING_WALLET_APPROVAL","AWAITING_DEPOSIT","PROCESSING","COMPLETED","FAILED","CANCELLED","AUTO_CANCELLED","REFUNDED"],"type":"string","description":"Lifecycle status. `PENDING_WALLET_APPROVAL` means accept succeeded but the source wallet is still being verified — `depositInstructions` is omitted until verification clears and the trade transitions to `AWAITING_DEPOSIT` (delivered via the `fx_trade.deposit_instructions_ready` webhook).","example":"AWAITING_DEPOSIT"},"depositInstructions":{"description":"On-chain deposit instructions for crypto-source trades. Present once the trade reaches `AWAITING_DEPOSIT`. Omitted while `status=PENDING_WALLET_APPROVAL` and for fiat-source trades (which return `fundingInstructions` instead).","allOf":[{"$ref":"#/components/schemas/FxTradeDepositInstructionsDto"}]},"fundingInstructions":{"description":"Bank funding instructions for fiat-source trades. Present once the trade reaches `AWAITING_DEPOSIT` on fiat-source pairs (USD / EUR / GBP source) — the customer wires from their bank to the account in this object using `reference` as the wire memo. Mutually exclusive with `depositInstructions`.","allOf":[{"$ref":"#/components/schemas/FxTradeFundingInstructionsDto"}]},"depositDeadline":{"type":"string","description":"Customer-facing deposit deadline (ISO 8601). Present when either `depositInstructions` or `fundingInstructions` is present.","example":"2026-05-26T19:54:00.000Z"},"screeningDeadline":{"type":"string","description":"Deadline by which source-wallet verification must complete (ISO 8601). Present only when `status=PENDING_WALLET_APPROVAL`. If verification has not cleared by this point the trade transitions to `FAILED`.","example":"2026-05-26T19:47:00.000Z"}},"required":["tradeId","status"]},"FxTradeSimulationResponseDto":{"type":"object","properties":{"simulated":{"type":"boolean","description":"Always `true` — the simulation request was accepted.","example":true},"note":{"type":"string","description":"Human-readable note about what happens next. The trade advances asynchronously; poll `GET /v1/fx/trades/{tradeId}` or subscribe to FX trade webhooks to observe the transition.","example":"Deposit simulation accepted. The trade will advance automatically as the simulated funds settle."}},"required":["simulated","note"]},"TransliteratedAddressDto":{"type":"object","properties":{"addressLine1":{"type":"string","minLength":1,"maxLength":1024,"description":"Transliterated address line 1 (Latin characters)","example":"123 Main Street"},"addressLine2":{"type":"string","minLength":1,"maxLength":1024,"description":"Transliterated address line 2 (Latin characters)","example":"Apt 4B"},"city":{"type":"string","minLength":1,"maxLength":256,"description":"Transliterated city (Latin characters)","example":"Beijing"},"state":{"type":"string","minLength":1,"maxLength":256,"description":"Transliterated state/province (Latin characters)","example":"Hebei"}}},"AddressDto":{"type":"object","properties":{"addressLine1":{"type":"string","minLength":1,"maxLength":1024,"description":"Address line 1","example":"123 Main Street"},"addressLine2":{"type":"string","minLength":1,"maxLength":1024,"description":"Address line 2 (apartment, suite, etc.)","example":"Apt 4B"},"city":{"type":"string","minLength":1,"maxLength":256,"description":"City","example":"San Francisco"},"state":{"type":"string","minLength":1,"maxLength":256,"description":"State / Province","example":"CA"},"postalCode":{"type":"string","minLength":1,"maxLength":50,"description":"Postal code / ZIP code. May be empty for countries without a postal-code system, including the United Arab Emirates.","example":"94102"},"country":{"type":"string","description":"Country code (ISO 3166-2)","example":"US","minLength":2,"maxLength":2},"transliterated":{"description":"Transliterated address fields (Latin characters) for non-Latin addresses. Required when address contains non-Latin characters (Chinese, Arabic, Cyrillic, etc.).","allOf":[{"$ref":"#/components/schemas/TransliteratedAddressDto"}]}},"required":["addressLine1","city","postalCode","country"]},"BankAddressDto":{"type":"object","properties":{"addressLine1":{"type":"string","minLength":1,"maxLength":1024,"description":"Address line 1 (optional for bank addresses)","example":"123 Main Street"},"addressLine2":{"type":"string","minLength":1,"maxLength":1024,"description":"Address line 2 (apartment, suite, etc.)","example":"Apt 4B"},"city":{"type":"string","minLength":1,"maxLength":256,"description":"City","example":"San Francisco"},"state":{"type":"string","minLength":1,"maxLength":256,"description":"State / Province","example":"CA"},"postalCode":{"type":"string","minLength":1,"maxLength":50,"description":"Postal code / ZIP code (optional for bank addresses)","example":"94102"},"country":{"type":"string","description":"Country code (ISO 3166-2)","example":"US","minLength":2,"maxLength":2}}},"MoneyOutputDto":{"type":"object","properties":{"currency":{"type":"string","description":"Currency code","example":"USD"},"exponent":{"type":"number","description":"Number of decimal places for this currency (e.g., 2 for USD, 6 for USDC)","example":2},"value":{"type":"string","description":"Amount in smallest unit as a string","example":"12345"},"displayValue":{"type":"string","description":"Human-readable decimal value","example":"123.45"}},"required":["currency","exponent","value","displayValue"]},"AccountBalanceResponseDto":{"type":"object","properties":{"accountId":{"type":"string","description":"Account ID","example":"vba_abc123"},"currency":{"type":"string","description":"Balance currency","example":"USD"},"available":{"description":"Funds available to pay out","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]},"pending":{"nullable":true,"description":"Funds committed to in-flight payouts","type":"object","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]}},"required":["accountId","currency","available"]},"BalanceTransactionDto":{"type":"object","properties":{"id":{"type":"string","description":"Transaction ID","example":"line_abc123"},"amount":{"type":"string","description":"Signed amount in minor units — positive credits the balance, negative debits it","example":"100000"},"currency":{"type":"string","description":"Currency","example":"USD"},"description":{"type":"string","nullable":true,"description":"What the transaction was","example":"Deposit settled"},"postedAt":{"type":"string","nullable":true,"description":"When the transaction posted","example":"2026-09-15T10:30:00Z"}},"required":["id","amount","currency"]},"BalanceTransactionsResponseDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/BalanceTransactionDto"}},"hasMore":{"type":"boolean","description":"Whether more transactions exist"},"nextCursor":{"type":"string","nullable":true,"description":"Cursor for the next page when hasMore is true"}},"required":["data","hasMore"]},"AccountMetadataDto":{"type":"object","properties":{"nickname":{"type":"string","description":"Account nickname","example":"Main Checking Account","maxLength":256},"purpose":{"type":"string","description":"Account purpose","example":"Business operations","maxLength":512},"tags":{"description":"Account tags","example":["primary","operations"],"type":"array","items":{"type":"string"}}}},"IndividualDetailsDto":{"type":"object","properties":{"firstName":{"type":"string","minLength":1,"maxLength":1024,"description":"First name","example":"John"},"lastName":{"type":"string","minLength":1,"maxLength":1024,"description":"Last name","example":"Smith"},"middleName":{"type":"string","minLength":1,"maxLength":1024,"description":"Middle name","example":"Michael"},"transliteratedFirstName":{"type":"string","minLength":1,"maxLength":256,"description":"Transliterated first name (Latin characters).\n\nRequired when firstName contains non-Latin characters (Chinese, Arabic, Cyrillic, etc.).","example":"Li Ming"},"transliteratedMiddleName":{"type":"string","minLength":1,"maxLength":256,"description":"Transliterated middle name (Latin characters).\n\nRequired when middleName contains non-Latin characters.","example":"Wen"},"transliteratedLastName":{"type":"string","minLength":1,"maxLength":256,"description":"Transliterated last name (Latin characters).\n\nRequired when lastName contains non-Latin characters.","example":"Wang"},"dateOfBirth":{"type":"string","description":"Date of birth in ISO 8601 format (YYYY-MM-DD)","example":"1990-01-15"},"nationality":{"type":"string","description":"Nationality (ISO 3166-2)","example":"US"},"phone":{"type":"string","minLength":1,"maxLength":16,"description":"Phone number in E.164 format","example":"+14155551234"},"occupation":{"type":"string","description":"Occupation code","example":"151252"},"employmentStatus":{"enum":["EMPLOYED","SELF_EMPLOYED","UNEMPLOYED","STUDENT","RETIRED","HOMEMAKER"],"type":"string","description":"Employment status"},"sourceOfIncome":{"enum":["COMPANY_FUNDS","ECOMMERCE_RESELLER","GAMBLING_PROCEEDS","GIFTS","GOVERNMENT_BENEFITS","INHERITANCE","INVESTMENTS_LOANS","PENSION_RETIREMENT","SALARY","SALE_OF_ASSETS_REAL_ESTATE","SAVINGS","SOMEONE_ELSES_FUNDS"],"type":"string","description":"Source of income","example":"SALARY"},"sourceOfFundsDescription":{"type":"string","description":"Source of funds description"}}},"BusinessDetailsDto":{"type":"object","properties":{"businessName":{"type":"string","minLength":1,"maxLength":1024,"description":"Legal business name","example":"Acme Corporation"},"businessType":{"enum":["CORPORATION","LLC","PARTNERSHIP","GEN_PARTNERSHIP","LLP","LP","SOLE_PROPRIETORSHIP","NON_PROFIT","TRUST","COOPERATIVE","PRIVATE_LIMITED_COMPANY","SPV","JOINT_VENTURE"],"type":"string","description":"Business legal structure","example":"LLC"},"taxIdentificationNumber":{"type":"string","minLength":1,"maxLength":50,"description":"Tax identification number issued by the tax authority (e.g., EIN in the US, VAT number in EU). This is different from the business registration number.\n\nValidated against country-specific formats when countryCode is provided. Accepts NOT_APPLICABLE when no tax ID is available. If the value does not match the expected format, prefix with OVERRIDE: (e.g. OVERRIDE:12-3456789) to store it as-is. These should be used sparingly; missing or overridden tax IDs may trigger additional customer due diligence.","example":"12-3456789"},"website":{"type":"string","format":"uri","minLength":1,"maxLength":512,"description":"Business website URL","example":"https://acme.com"},"industry":{"type":"string","minLength":6,"maxLength":6,"pattern":"^\\d{6}$","description":"6-digit NAICS industry classification code","example":"522320"},"isCrypto":{"type":"boolean","description":"Set true if the business operates in crypto or digital assets.","example":false},"isRemoteCompany":{"type":"boolean","description":"Set true when the business operates remotely from an owner or director address.","example":false},"industryCryptoSubtype":{"enum":["PROTOCOL","EXCHANGE","INVESTMENT","LENDER","MARKET_MAKER","SAAS","MINER"],"type":"string","description":"Crypto-specific industry subtype. Required when isCrypto is true."},"yearEstablished":{"type":"number","minimum":1800,"description":"Year the business was established","example":2010},"numberOfEmployees":{"type":"number","minimum":0,"description":"Number of employees","example":50},"tradeName":{"type":"string","minLength":0,"maxLength":1024,"description":"Business trade name (DBA). Separate multiple names with semicolons.","example":"Acme Services; Acme Pay"},"description":{"type":"string","minLength":20,"maxLength":2048,"description":"Business description","example":"Cloud software services provider"},"email":{"type":"string","format":"email","minLength":1,"maxLength":255,"description":"Business email address. Use an email on the company domain when available; personal email domains such as Gmail may require additional due diligence.","example":"contact@acme.com"},"phone":{"type":"string","minLength":1,"maxLength":16,"description":"Business phone number in E.164 format","example":"+14155551234"},"registrationDate":{"type":"string","description":"Business registration date in ISO 8601 format (YYYY-MM-DD)","example":"2020-01-15"},"registrationNumber":{"type":"string","minLength":1,"maxLength":50,"description":"Business registration number issued by the state/authority when the business was registered (e.g., LLC filing number, corporation charter number). This is different from the tax identification number.","example":"123456789"},"hasMaterialIntermediaryOwnership":{"type":"boolean","description":"Whether the business has material intermediary ownership (25%+ owned by another entity)","example":false},"accountPurpose":{"enum":["PAYROLL","VENDOR_PAYMENTS","TREASURY","OPERATIONS","CAPITAL_DEPLOYMENT","CROSS_BORDER_PAYMENTS","STABLECOIN_CONVERSION","ECOMMERCE","OTHER"],"type":"string","description":"Purpose of the account","example":"OPERATIONS"},"accountPurposeExplanation":{"type":"string","minLength":1,"maxLength":2048,"description":"Detailed explanation of account purpose","example":"Operating expenses and customer settlements"},"sourceOfFunds":{"enum":["BUSINESS_REVENUE","INVESTMENT","OWNER_CAPITAL","LOAN","GRANTS","EQUITY","INHERITANCE","GIFT","OTHER"],"type":"string","description":"Source of funds for the business","example":"BUSINESS_REVENUE"},"sourceOfFundsDescription":{"type":"string","minLength":1,"maxLength":2048,"description":"Detailed description of source of funds","example":"Revenue from software services"},"estimatedAnnualRevenueUsd":{"enum":["PRE_REVENUE","LESS_THAN_10K","10K_TO_50K","50K_TO_100K","100K_TO_500K","500K_TO_1M","1M_TO_5M","5M_TO_10M","10M_TO_50M","50M_TO_250M","MORE_THAN_250M","LESS_THAN_100K"],"type":"string","description":"Estimated annual revenue in USD"},"expectedMonthlyPaymentsUsd":{"type":"number","minimum":0,"description":"Expected monthly fiat payment volume in USD-equivalent","example":50000},"primaryTargetMarket":{"enum":["RETAIL","COMMERCIAL","GOVERNMENT","OTHER"],"type":"string","description":"Primary target market. RETAIL = B2C (consumers), COMMERCIAL = B2B (businesses), GOVERNMENT = B2G (government entities), OTHER = another market not covered by the standard options.","example":"COMMERCIAL"},"operatesInProhibitedCountries":{"type":"boolean","description":"Whether the business operates in prohibited countries","example":false},"highRiskActivities":{"type":"array","items":{"type":"string","enum":["MONEY_SERVICES","LENDING_BANKING","OTC_FX_CRYPTO_BROKERAGE","HOLD_CLIENT_FUNDS","INVESTMENT_SERVICES","SAFE_DEPOSIT_BOX","PRECIOUS_METALS_STONES_JEWELRY","NICOTINE_TOBACCO","MARIJUANA","PHARMACEUTICALS","THIRD_PARTY_PAYMENT_PROCESSING","ADULT_ENTERTAINMENT","WEAPONS_FIREARMS_EXPLOSIVES","GAMBLING"]},"description":"List of high-risk activities the business engages in","example":["MONEY_SERVICES"]},"highRiskActivitiesExplanation":{"type":"string","minLength":1,"maxLength":2048,"description":"Explanation of high-risk activities","example":"Cryptocurrency exchange services"},"signedAgreementId":{"type":"string","minLength":1,"maxLength":256,"description":"Signed agreement ID","example":"tos_abc123"}}},"VerificationLinkDto":{"type":"object","properties":{"sessionId":{"type":"string","description":"Verification session ID","example":"vsess_abc123"},"verificationUrl":{"type":"string","description":"URL for the UBO to complete their verification","example":"https://verify.infinite.dev/?sessionId=vsess_abc123"},"expiresAt":{"type":"string","description":"When the verification link expires","example":"2026-01-09T10:30:00Z"},"status":{"enum":["PENDING","ACTIVE","IN_PROGRESS","COMPLETED","EXPIRED","CANCELLED","SUBMITTED"],"type":"string","description":"Current status of the verification session","example":"ACTIVE"}},"required":["sessionId","verificationUrl","expiresAt","status"]},"AssociatedEntityResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier","example":"asp_abc123"},"createdAt":{"type":"string","description":"Created timestamp","example":"2026-01-15T10:30:00Z"},"updatedAt":{"type":"string","description":"Last updated timestamp","example":"2026-01-15T10:30:00Z"},"entityType":{"enum":["INDIVIDUAL","BUSINESS"],"type":"string","description":"Type of entity","example":"BUSINESS"},"parentEntityId":{"type":"string","description":"Parent entity ID for nested ownership. Use the associated business entity ID returned from the associated entity endpoints when linking a child owner beneath an intermediate business owner.","example":"asp_parent123"},"details":{"description":"Type-specific details (individual or business)","oneOf":[{"$ref":"#/components/schemas/IndividualEntityDetailsDto"},{"$ref":"#/components/schemas/BusinessEntityDetailsDto"}],"example":{"businessName":"Acme Holdings LLC","registrationNumber":"LLC-12345678","dateOfIncorporation":"2018-06-15","businessAddress":{"addressLine1":"100 Market Street","addressLine2":"Suite 500","city":"San Francisco","state":"CA","postalCode":"94105","country":"US"}}},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","example":"US"},"email":{"type":"string","description":"Email address","example":"contact@acmeholdings.com"},"phone":{"type":"string","description":"Phone number","example":"+14155551234"},"address":{"description":"Address. Use the nested transliterated field for Latin character versions of non-Latin addresses.","allOf":[{"$ref":"#/components/schemas/AddressDto"}]},"hasOwnership":{"type":"boolean","description":"Whether this entity is an owner. For an individual with indirect ownership whose percentage is not quantified, set this to true to identify them as a beneficial owner.","example":true},"hasControl":{"type":"boolean","description":"Has significant control","example":true},"ownershipPercentage":{"type":"number","description":"Ownership percentage","example":51},"isSigner":{"type":"boolean","description":"Has signing authority","example":false},"isDirector":{"type":"boolean","description":"Is a director","example":false},"role":{"enum":["CEO","CFO","COO","PRESIDENT","GENERAL_COUNSEL","MANAGING_MEMBER","TREASURER","OTHER"],"type":"string","description":"Structured role at the company."},"title":{"type":"string","description":"Custom title at the company.","example":"Managing Director"},"documents":{"description":"Array of document IDs","example":["doc_abc123"],"type":"array","items":{"type":"string"}},"attestedOwnershipStructureAt":{"type":"string","description":"Timestamp when ownership structure was attested","example":"2026-01-15T10:30:00Z"},"displayName":{"type":"string","description":"Display name","example":"Acme Holdings LLC"},"verificationLink":{"description":"Verification link for UBO KYC. Present on create (when generateVerificationLink is true) and on single entity GET if there is an active/pending verification session.","allOf":[{"$ref":"#/components/schemas/VerificationLinkDto"}]}},"required":["id","createdAt","updatedAt","entityType","hasOwnership","hasControl"]},"TreasuryBalanceDto":{"type":"object","properties":{"available":{"description":"Available balance for this currency","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]},"pending":{"nullable":true,"description":"Pending balance for this currency","type":"object","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]}},"required":["available"]},"TreasuryFundingMethodDto":{"type":"object","properties":{"id":{"type":"string","description":"Funding method ID","example":"vba_abc123"},"type":{"enum":["BANK_ACCOUNT","CRYPTO_ADDRESS"],"type":"string","description":"Funding method type","example":"BANK_ACCOUNT"},"provider":{"enum":["BRALE","BRIDGE","CAPA","CODEX","EREBOR","FIN","INFINIA","ONE_MONEY","STABLES","TURNKEY","PRIVY","INFINITE","SOCURE","SARDINE"],"type":"string","description":"Provider backing this treasury funding method","example":"INFINITE"},"currency":{"type":"string","description":"Primary currency accepted by this funding method","example":"USD"},"currencyCodes":{"description":"Currencies accepted by this funding method","example":["USDC"],"type":"array","items":{"type":"string"}},"rail":{"type":"string","description":"Inbound payment rail or network","example":"ACH"},"rails":{"description":"Supported inbound payment rails","example":["ACH","WIRE"],"type":"array","items":{"type":"string"}},"bankName":{"type":"string","description":"Bank name for bank funding methods","example":"Infinite Bank"},"beneficiaryName":{"type":"string","description":"Beneficiary name for bank funding methods","example":"Acme Treasury"},"accountNumber":{"type":"string","description":"Bank account number for bank funding methods","example":"1234567890"},"routingNumber":{"type":"string","description":"Routing number for bank funding methods","example":"021000021"},"iban":{"type":"string","description":"IBAN for bank funding methods","example":"GB82WEST12345698765432"},"swiftBic":{"type":"string","description":"SWIFT/BIC code for bank funding methods","example":"CHASUS33"},"address":{"type":"string","description":"Deposit address for crypto funding methods","example":"0x1234567890abcdef1234567890abcdef12345678"},"addressType":{"enum":["EVM","TRON","BITCOIN","SOLANA"],"type":"string","description":"Address type for crypto funding methods","example":"EVM"},"chains":{"type":"array","items":{"type":"string","enum":["ETHEREUM","BASE","POLYGON","SOLANA","TRON","BITCOIN","ARBITRUM"]},"description":"Supported chains for crypto funding methods","example":["ETHEREUM","BASE"]}},"required":["id","type","provider"]},"WalletTokenBalanceDto":{"type":"object","properties":{"currency":{"type":"string","description":"Currency symbol","example":"USDC"},"balance":{"description":"Balance amount","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]},"chain":{"type":"string","description":"Chain name","example":"ETHEREUM"}},"required":["currency","balance","chain"]},"TreasuryWalletDto":{"type":"object","properties":{"address":{"type":"string","description":"Wallet address","example":"0x1234567890abcdef1234567890abcdef12345678"},"addressType":{"enum":["EVM","TRON","BITCOIN","SOLANA"],"type":"string","description":"Address type","example":"EVM"},"balances":{"description":"Token balances on this wallet","type":"array","items":{"$ref":"#/components/schemas/WalletTokenBalanceDto"}}},"required":["address","addressType","balances"]},"TreasuryDto":{"type":"object","properties":{"id":{"type":"string","description":"Treasury ID","example":"trs_abc123"},"name":{"type":"string","nullable":true,"description":"Treasury name","example":"Main Treasury"},"provider":{"enum":["BRALE","BRIDGE","CAPA","CODEX","EREBOR","FIN","INFINIA","ONE_MONEY","STABLES","TURNKEY","PRIVY","INFINITE","SOCURE","SARDINE"],"type":"string","description":"Provider backing this treasury","example":"INFINITE"},"balances":{"type":"object","description":"Balances held in this treasury keyed by currency code","additionalProperties":{"$ref":"#/components/schemas/TreasuryBalanceDto"}},"fundingMethods":{"description":"Funding methods that can pay into this treasury","type":"array","items":{"$ref":"#/components/schemas/TreasuryFundingMethodDto"}},"wallets":{"description":"Wallets in this treasury","type":"array","items":{"$ref":"#/components/schemas/TreasuryWalletDto"}}},"required":["id","balances","fundingMethods","wallets"]},"CustomerTreasuryResponseDto":{"type":"object","properties":{"customerId":{"type":"string","description":"Customer ID","example":"cus_abc123"},"treasuries":{"description":"Customer treasuries with wallet balances","type":"array","items":{"$ref":"#/components/schemas/TreasuryDto"}}},"required":["customerId","treasuries"]},"CustomerVerificationSessionResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"vs_abc123"},"status":{"type":"string","example":"COMPLETED"},"createdAt":{"type":"string","example":"2026-01-15T10:30:00Z"},"completedAt":{"type":"string","nullable":true,"example":"2026-01-15T11:00:00Z"},"progressPercentage":{"type":"number","nullable":true,"example":100}},"required":["id","status","createdAt"]},"CustomerAddressDto":{"type":"object","properties":{"addressLine1":{"type":"string","minLength":1,"maxLength":1024,"description":"Address line 1","example":"123 Main Street"},"addressLine2":{"type":"string","minLength":1,"maxLength":1024,"description":"Address line 2 (apartment, suite, etc.)","example":"Apt 4B"},"city":{"type":"string","minLength":1,"maxLength":256,"description":"City","example":"San Francisco"},"state":{"type":"string","minLength":1,"maxLength":256,"description":"State / Province","example":"CA"},"postalCode":{"type":"string","minLength":1,"maxLength":50,"description":"Postal code / ZIP code. May be empty for countries without a postal-code system, including the United Arab Emirates.","example":"94102"},"country":{"type":"string","description":"Country code (ISO 3166-2)","example":"US","minLength":2,"maxLength":2},"transliterated":{"description":"Transliterated address fields (Latin characters) for non-Latin addresses. Required when address contains non-Latin characters (Chinese, Arabic, Cyrillic, etc.).","allOf":[{"$ref":"#/components/schemas/TransliteratedAddressDto"}]},"label":{"enum":["REGISTERED","OPERATIONAL","US_REGISTERED","HEADQUARTERS","BILLING","SHIPPING","HOME","OFFICE"],"type":"string","description":"Address label/type","example":"HOME"},"isDefault":{"type":"boolean","description":"Whether this is the default/primary address","example":true}},"required":["addressLine1","city","postalCode","country"]},"MissingComplianceRequirementDto":{"type":"object","properties":{"requirementType":{"enum":["FIELD","DOCUMENT"],"type":"string","description":"Requirement category","example":"FIELD"},"key":{"type":"string","description":"Stable requirement key or field path","example":"businessData.legalName"},"displayName":{"type":"string","description":"Human-readable requirement label","example":"Legal Name"},"entityId":{"type":"string","description":"Associated entity ID when the missing requirement belongs to a beneficial owner or control person.","example":"asp_abc123"},"entityDisplayName":{"type":"string","description":"Human-readable associated entity name when the missing requirement belongs to a beneficial owner or control person.","example":"Jane Owner"}},"required":["requirementType","key","displayName"]},"CounterpartyResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"cp_abc123","description":"Counterparty ID"},"name":{"type":"string","example":"Jane Doe","description":"Counterparty legal name"},"beneficiaryType":{"enum":["INDIVIDUAL","BUSINESS"],"type":"string","example":"INDIVIDUAL","description":"Entity type (individual or business)"},"address":{"nullable":true,"description":"Counterparty address","type":"object","allOf":[{"$ref":"#/components/schemas/AddressDto"}]},"createdAt":{"type":"string","description":"Creation timestamp","format":"date-time"},"updatedAt":{"type":"string","description":"Last update timestamp","format":"date-time"}},"required":["id","name","beneficiaryType","createdAt","updatedAt"]},"AccountResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Account ID (vba_xxx for virtual bank, vwa_xxx for virtual wallet, inb_xxx for infinite bank, inw_xxx for infinite wallet, eba_xxx for external bank, ewa_xxx for external wallet, pba_xxx for provider balance)","example":"vba_1234567890abcdef"},"customerId":{"type":"string","description":"Customer ID","example":"cust_abc123"},"type":{"enum":["VIRTUAL_BANK","VIRTUAL_WALLET","INFINITE_BANK","INFINITE_WALLET","EXTERNAL_BANK","EXTERNAL_WALLET","EXTERNAL_PROXY","PROVIDER_BALANCE"],"type":"string","description":"Account type","example":"VIRTUAL_BANK"},"externalReference":{"type":"string","description":"Client-provided external reference for mapping to your system","example":"550e8400-e29b-41d4-a716-446655440000"},"bankDetails":{"type":"object","description":"Bank account details (for bank accounts)","properties":{"accountNumber":{"type":"string","example":"1234567890"},"routingNumber":{"type":"string","example":"021000021"},"iban":{"type":"string","example":"GB82WEST12345698765432"},"swiftCode":{"type":"string","example":"CHASUS33"},"bankName":{"type":"string","example":"JPMorgan Chase Bank"},"bankCountryCode":{"type":"string","example":"US"},"bankAddress":{"type":"object","properties":{"addressLine1":{"type":"string","example":"270 Park Avenue"},"addressLine2":{"type":"string","example":"Floor 10"},"city":{"type":"string","example":"New York"},"state":{"type":"string","example":"NY"},"postalCode":{"type":"string","example":"10017"},"country":{"type":"string","example":"US"}}},"beneficiaryName":{"type":"string","example":"John Smith"},"beneficiaryPhone":{"type":"string","example":"+14155550123"},"beneficiaryAddress":{"type":"object","properties":{"addressLine1":{"type":"string","example":"123 Main Street"},"addressLine2":{"type":"string","example":"Suite 100"},"city":{"type":"string","example":"New York"},"state":{"type":"string","example":"NY"},"postalCode":{"type":"string","example":"10001"},"country":{"type":"string","example":"US"}}},"supportedNetworks":{"type":"array","items":{"type":"string"},"example":["ACH","WIRE"],"description":"Payment rails this account supports for payouts. Reflects the rails stored on the account; the API picks the actual routing provider per customer approvals at transfer time."}}},"walletDetails":{"type":"object","description":"Wallet details (for wallet accounts)","properties":{"walletAddress":{"type":"string","example":"0x1234567890abcdef1234567890abcdef12345678"},"addressType":{"type":"string","enum":["EVM","TRON","BITCOIN","SOLANA"],"example":"EVM"},"chains":{"type":"array","items":{"type":"string"},"example":["ETHEREUM","BASE"]},"walletType":{"type":"string","enum":["TREASURY","TRANSACTION","VIRTUAL"],"example":"TREASURY","description":"Wallet type (for infinite wallets only)"}}},"status":{"enum":["IN_REVIEW","ACTIVE","CLOSED"],"type":"string","description":"Account status","example":"ACTIVE"},"currencyCodes":{"description":"Currency codes supported by this account","example":["USD","USDC"],"type":"array","items":{"type":"string"}},"virtualBankAccount":{"type":"object","description":"Virtual bank account details","properties":{"id":{"type":"string","example":"vba_1234567890abcdef"},"depositInstructions":{"type":"object","properties":{"bankName":{"type":"string","example":"JPMorgan Chase Bank"},"bankAddress":{"type":"object","properties":{"addressLine1":{"type":"string","example":"270 Park Avenue"},"addressLine2":{"type":"string","example":"Floor 10"},"city":{"type":"string","example":"New York"},"state":{"type":"string","example":"NY"},"postalCode":{"type":"string","example":"10017"},"country":{"type":"string","example":"US"}}},"accountNumber":{"type":"string","example":"1234567890"},"routingNumber":{"type":"string","example":"021000021"},"iban":{"type":"string","example":"GB82WEST12345698765432"},"swiftBic":{"type":"string","example":"CHASUS33"},"bankCountryCode":{"type":"string","example":"US"},"beneficiaryName":{"type":"string","example":"John Doe"}}},"developerFeeFixed":{"type":"string","example":"100000"},"developerFeePercent":{"type":"number","example":0.01},"sourceRail":{"type":"string","example":"ACH"},"sourceCurrency":{"type":"string","example":"USD"},"destinationRail":{"type":"string","example":"BASE"},"destinationCurrency":{"type":"string","example":"USDC"},"sweepTargetAccountId":{"type":"string","example":"ewa_1234567890abcdef"},"originCapable":{"type":"boolean","example":true},"originAccountId":{"type":"string","example":"vba_1234567890abcdef"}}},"virtualWallet":{"type":"object","description":"Virtual wallet details (also known as liquidation addresses)","properties":{"id":{"type":"string","example":"vw_1234567890abcdef"},"state":{"type":"string","enum":["ACTIVE","DEACTIVATED"],"example":"ACTIVE"},"destinationCurrency":{"type":"string","example":"USD"},"destinationRail":{"type":"string","example":"ACH"},"sweepTargetAccountId":{"type":"string","example":"eba_1234567890abcdef"},"originCapable":{"type":"boolean","example":false},"originAccountId":{"type":"string","example":"vwa_1234567890abcdef"}}},"proxyDetails":{"type":"object","description":"Proxy account details (for proxy/alias-based accounts like PIX, UPI, PromptPay)","properties":{"aliasType":{"type":"string","enum":["PHONE","EMAIL","NATIONAL_ID","TAX_ID","RANDOM","CORPORATE_ID"],"example":"phone"},"aliasValue":{"type":"string","example":"+5511912345678"},"paymentRail":{"type":"string","example":"pix"},"beneficiaryName":{"type":"string","example":"John Smith"},"beneficiaryType":{"type":"string","enum":["INDIVIDUAL","BUSINESS"],"example":"INDIVIDUAL"}}},"isThirdParty":{"type":"boolean","description":"Is this account owned by a third party?","example":false},"counterpartyId":{"type":"string","nullable":true,"description":"Counterparty ID when this is a third-party recipient account","example":"cp_abc123"},"referenceId":{"type":"string","description":"Client-provided reference ID","example":"550e8400-e29b-41d4-a716-446655440000"},"originCapable":{"type":"boolean","nullable":true,"description":"Whether this account can be used as the canonical transfer origin.","example":true},"originAccountId":{"type":"string","nullable":true,"description":"Canonical origin account ID when this account is a virtual alias.","example":"vba_1234567890abcdef"},"metadata":{"description":"Additional metadata","allOf":[{"$ref":"#/components/schemas/AccountMetadataDto"}]},"createdAt":{"type":"string","description":"Account creation date","format":"date-time","example":"2026-01-15T10:00:00Z"},"updatedAt":{"type":"string","description":"Account last update date","format":"date-time","example":"2026-01-15T10:00:00Z"},"created":{"type":"boolean","description":"Whether this account was newly created in this request. Returns false if an existing account was returned (idempotent behavior).","example":true},"holdsBalance":{"type":"boolean","description":"Present and true when this is a balance account (USD or stablecoin). Deposits credit the account instead of being swept, and the balance can fund transfers. See GET /v1/accounts/{id}/balance.","example":true},"paymentRail":{"type":"string","description":"Payment rail for provider balance accounts (e.g. ETHEREUM). Omitted for other account types.","example":"ETHEREUM"},"lastSentAt":{"type":"string","nullable":true,"description":"Timestamp of the last transfer sent from this account","format":"date-time","example":"2024-01-15T10:30:00Z"},"lastReceivedAt":{"type":"string","nullable":true,"description":"Timestamp of the last transfer received to this account","format":"date-time","example":"2024-01-15T10:30:00Z"},"customer":{"nullable":true,"description":"Expanded customer details (only included when expand=customer)","type":"object","allOf":[{"$ref":"#/components/schemas/CustomerResponseDto"}]},"sweepTargetAccount":{"nullable":true,"description":"Expanded sweep target account details (only included when expand=sweepTargetAccount). For virtual bank accounts and virtual wallets that sweep to an external account.","type":"object","allOf":[{"$ref":"#/components/schemas/AccountResponseDto"}]},"counterparty":{"nullable":true,"description":"Expanded counterparty details (only included when expand=counterparty)","type":"object","allOf":[{"$ref":"#/components/schemas/CounterpartyResponseDto"}]},"screeningStatus":{"type":"string","nullable":true}},"required":["id","customerId","type","status","createdAt","updatedAt"]},"DocumentResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"doc_abc123"},"organizationId":{"type":"string","example":"org_xyz789"},"customerId":{"type":"string","example":"cus_abc123"},"transferId":{"type":"string","nullable":true,"example":"txn_xyz789"},"documentType":{"enum":["IDENTITY","PROOF_OF_ADDRESS","INVOICE","CONTRACT","BANK_STATEMENT","BUSINESS_LICENSE","ARTICLES_OF_INCORPORATION","ARTICLES_OF_ASSOCIATION","CERTIFICATE_OF_FORMATION","CERTIFICATE_OF_INCUMBENCY","OPERATING_AGREEMENT","PARTNERSHIP_AGREEMENT","OWNERSHIP_STRUCTURE","SHAREHOLDER_AGREEMENT","STOCK_CERTIFICATE","TAX_RETURN","FINANCIAL_STATEMENT","MARKETING_MATERIALS","DOMAIN_OWNERSHIP_PROOF","BUSINESS_PLAN","BILL_OF_LADING","AML_POLICY","AML_COMFORT_LETTER","FUNDS_FLOW_DIAGRAM","GOOD_STANDING_CERTIFICATE","TIN_VERIFICATION","MSB_LICENSE","DIRECTORS_REGISTRY","OWNERSHIP_CHART","PROOF_OF_SIGNATORY_AUTHORITY","PROOF_OF_SOURCE_OF_FUNDS","PROOF_OF_ENTITY_NAME_CHANGE","REMOTE_ADDRESS_ATTESTATION","E_SIGNATURE_CERTIFICATE","COMPLIANCE_NOTES","PROOF_OF_SOURCE_OF_WEALTH","TAX_EXEMPT_ENTITY_CONFIRMATION","OTHER"],"type":"string","description":"Document type","example":"INVOICE"},"documentSubtype":{"type":"string","description":"Specific document subtype","example":"BANK_STATEMENT"},"fileName":{"type":"string","example":"invoice-2026-001.pdf"},"contentType":{"type":"string","example":"application/pdf"},"sizeBytes":{"type":"number","example":1024000},"remarks":{"type":"string","nullable":true,"description":"Free-form remarks or notes about the document"},"fileHash":{"type":"string","nullable":true,"description":"SHA-256 hash of file content"},"downloadUrl":{"type":"string","description":"Signed URL to download the document"},"status":{"enum":["PENDING","UPLOADING","UPLOADED","FAILED"],"type":"string","description":"Document status","example":"UPLOADED"},"createdAt":{"format":"date-time","type":"string"},"uploadedAt":{"format":"date-time","type":"string","nullable":true},"associatedEntityId":{"type":"string","nullable":true,"description":"Associated entity ID (e.g., UBO)"}},"required":["id","organizationId","customerId","documentType","fileName","contentType","sizeBytes","status","createdAt"]},"CustomerResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Customer ID"},"customerName":{"type":"string","description":"Customer name"},"organizationId":{"type":"string","description":"Organization ID"},"type":{"enum":["INDIVIDUAL","BUSINESS"],"type":"string","description":"Customer type"},"status":{"enum":["DRAFT","IN_REVIEW","NEED_ACTIONS","REJECTED","ACTIVE","INACTIVE","SUSPENDED"],"type":"string","description":"Customer status"},"email":{"type":"string","description":"Customer email address"},"countryCode":{"type":"string","description":"Country code (ISO 3166-2)","enum":["AD","AE","AF","AG","AI","AL","AM","AO","AR","AS","AT","AU","AW","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BR","BS","BT","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","EU","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HN","HR","HT","HU","ID","IE","IL","IM","IN","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SY","SZ","TC","TD","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","ZA","ZM","ZW"]},"imageUrl":{"type":"string","description":"Customer image URL"},"requestedCapabilities":{"nullable":true,"type":"array","items":{"type":"string","enum":["USD_ACH_PAYIN","USD_ACH_PAYOUT","USD_WIRE_PAYIN","USD_WIRE_PAYOUT","USD_BALANCE","USD_YIELD","SWIFT_PAYIN","SWIFT_PAYOUT","STABLECOIN_PAYIN","STABLECOIN_PAYOUT","STABLECOIN_SWAPS","AED_FX_PAYOUT","AUD_FX_PAYOUT","BHD_FX_PAYOUT","BOB_FX_PAYOUT","BRL_FX_PAYOUT","CLP_FX_PAYOUT","CNY_FX_PAYOUT","COP_FX_PAYOUT","DOP_FX_PAYOUT","EGP_FX_PAYOUT","EUR_FX_PAYOUT","GBP_FX_PAYOUT","HKD_FX_PAYOUT","IDR_FX_PAYOUT","INR_FX_PAYOUT","JPY_FX_PAYOUT","KRW_FX_PAYOUT","KWD_FX_PAYOUT","MXN_FX_PAYOUT","MYR_FX_PAYOUT","PEN_FX_PAYOUT","PHP_FX_PAYOUT","PYG_FX_PAYOUT","QAR_FX_PAYOUT","SAR_FX_PAYOUT","SGD_FX_PAYOUT","THB_FX_PAYOUT","TRY_FX_PAYOUT","TWD_FX_PAYOUT","USD_FX_PAYOUT","VND_FX_PAYOUT"]},"description":"Capabilities requested by the customer"},"createdAt":{"type":"string","description":"Customer creation date","format":"date-time","example":"2026-01-15T10:00:00Z"},"updatedAt":{"type":"string","description":"Customer last update date","format":"date-time","example":"2026-01-15T10:00:00Z"},"customerDetails":{"description":"Customer details with transliteration support.\n\nFor INDIVIDUAL customers:\n- firstName, lastName, middleName\n- transliteratedFirstName, transliteratedMiddleName, transliteratedLastName\n- dateOfBirth, phone, occupation, sourceOfIncome\n\nFor BUSINESS customers:\n- businessName, tradeName, businessType, taxIdentificationNumber\n- website, industry, email, phone\n\nVerification and EDD-specific fields are submitted separately through the verification endpoints.","oneOf":[{"$ref":"#/components/schemas/IndividualDetailsDto"},{"$ref":"#/components/schemas/BusinessDetailsDto"}]},"associatedEntities":{"description":"Associated entities (beneficial owners and control persons) for business customers.","type":"array","items":{"$ref":"#/components/schemas/AssociatedEntityResponseDto"}},"addresses":{"description":"Customer addresses.\n\nEach address must include addressLine1, city, postalCode, and country.","type":"array","items":{"$ref":"#/components/schemas/CustomerAddressDto"}},"missingRequirements":{"description":"Merged list of missing fields and documents required for full verification. Only populated when customer data is incomplete.","example":[{"requirementType":"FIELD","key":"businessData.taxIdentificationNumber","displayName":"Tax Identification Number"},{"requirementType":"DOCUMENT","key":"ownership.ownership_structure","displayName":"Ownership Information"}],"type":"array","items":{"$ref":"#/components/schemas/MissingComplianceRequirementDto"}},"accounts":{"type":"array","items":{"required":false,"description":"Customer accounts (only included when expand=accounts). Returns all accounts for this customer.","type":"array","items":{"$ref":"#/components/schemas/AccountResponseDto"}}},"documents":{"description":"Customer documents (only included when expand=documents). Returns all documents for this customer.","type":"array","items":{"$ref":"#/components/schemas/DocumentResponseDto"}},"treasury":{"description":"Treasury balances (only included when expand=treasury). Returns treasury wallet balances grouped by treasury.","allOf":[{"$ref":"#/components/schemas/CustomerTreasuryResponseDto"}]},"verificationSessions":{"description":"Verification sessions (only included when expand=verificationSessions). Returns verification session summaries.","type":"array","items":{"$ref":"#/components/schemas/CustomerVerificationSessionResponseDto"}}},"required":["id","customerName","organizationId","type","status","createdAt","updatedAt","accounts"]},"CreateStablecoinBalanceAccountDto":{"type":"object","properties":{"customerId":{"type":"string","description":"Customer ID","example":"cus_abc123"},"currency":{"type":"string","description":"Balance stablecoin. Supported: USDT, USDC.","enum":["USDT","USDC"],"example":"USDT"},"paymentRail":{"type":"string","description":"Balance network. Supported per currency: USDT on Ethereum, Arbitrum, Polygon, Solana, Tron; USDC on Ethereum, Base, Arbitrum, Polygon, Solana.","enum":["ETHEREUM","BASE","ARBITRUM","POLYGON","SOLANA","TRON"],"example":"ETHEREUM"}},"required":["customerId","currency","paymentRail"]},"CreateBalanceAccountDto":{"type":"object","properties":{"customerId":{"type":"string","description":"Customer ID","example":"cus_abc123"},"product":{"type":"string","description":"Balance product. STANDARD holds fiat USD. YIELD holds a reserve-backed token that can earn configurable yield. Defaults to STANDARD.","enum":["STANDARD","YIELD"],"example":"STANDARD"},"externalReference":{"type":"string","description":"Client-provided external reference","example":"550e8400-e29b-41d4-a716-446655440000"},"metadata":{"description":"Additional metadata","example":{"nickname":"Operating balance"},"allOf":[{"$ref":"#/components/schemas/AccountMetadataDto"}]}},"required":["customerId"]},"AllowedSenderBankDto":{"type":"object","properties":{"bankName":{"type":"string","maxLength":200,"description":"Sender bank name. Matched ignoring case, whitespace, and punctuation.","example":"JPMorgan Chase"},"routingNumber":{"type":"string","pattern":"^[0-9\\s-]{4,20}$","description":"Sender bank routing number (e.g. US ABA). Matched on digits only.","example":"021000021"},"swiftBic":{"type":"string","description":"Sender bank SWIFT/BIC code (8 or 11 characters)","example":"CHASUS33"}}},"CreateVbaFixedRouteDto":{"type":"object","properties":{"correspondentBankName":{"type":"string","maxLength":200,"description":"Correspondent/intermediary bank name","example":"Bank of America"},"correspondentBankSwiftCode":{"type":"string","description":"Correspondent/intermediary bank SWIFT/BIC code (8 or 11 characters)","example":"IRVTUS3NXXX"},"correspondentAccountNumber":{"type":"string","maxLength":64,"description":"Correspondent/intermediary account number","example":"9876543210"},"customerId":{"type":"string","description":"Customer ID","example":"cus_abc123"},"braleAutomationId":{"type":"string","description":"Optional. Existing Brale automation id (admin / advanced). When omitted, the API creates a wire onramp automation after registering the settlement wallet on Brale."},"onrampSettlementInwAccountId":{"type":"string","description":"Optional. TRANSACTION Infinite Wallet for on-chain settlement (Ethereum). When omitted, one is created or reused for the customer."},"onrampPayoutTreasuryInwAccountId":{"type":"string","description":"Optional. TRANSACTION Infinite Wallet on the receive chain for post-settlement payout when the receive chain is not Ethereum. When omitted, one is created or reused.","example":"inw_tron_tx"},"sweepTargetAccountId":{"type":"string","description":"Sweep / destination account id. For FIAT_TO_CRYPTO: a crypto wallet, or an ACTIVE provider-balance account (USDT on Ethereum) when the organization is enabled for provider-balance onramps (developer fees are not supported on that target).","example":"ewa_abc123"},"sourceRail":{"type":"string","enum":["ACH","ACH_SAME_DAY","WIRE","FED_NOW","RTP","EREBOR","EREBOR_RAIL","BALANCE","SWIFT","SEPA","SEPA_INSTANT","TIPS","FASTER_PAYMENTS","BACS","CHAPS","ELIXIR","NICS","EFT","INTERAC","NPP","BECS","UPI","IMPS","IMPS_WITH_FIRC","NEFT","RTGS","BI_FAST","ARTAJASA","PIX","TED","TEF","SPEI","COELSA","SINPE","CIPS","CFXPS","CHATS","ZENGIN","KFTC","FAST_SG","MEPS","DUITNOW","PROMPTPAY","INSTAPAY","PESONET","NAPAS","BEFTN","SLIPS","ZAHAV","GHIPSS","NIBSS","PESALINK","RTC_ZA","TZS_RTGS","EGP_ACH","JOD_ACH","NPSS","MADA","QPS","DOP_ACH","GTQ_ACH","HNL_ACH","PEN_ACH","JMD_ACH","USD_ACH_SV","USD_ACH_EC","CLP_TEF","PSE","COP_ACH","BOB_RTGS","PYG_ACH","CERTIS","DKK_TIPS","SENT","NKS","BANKGIROT","HKD_FPS","IBFT","TRY_FAST","ETHEREUM","BASE","POLYGON","SOLANA","TRON","BITCOIN","ARBITRUM"],"description":"Source rail - payment rail for incoming deposits","example":"ACH"},"sourceCurrency":{"type":"string","description":"Source currency for deposits","example":"USD"},"destinationRail":{"type":"string","enum":["ACH","ACH_SAME_DAY","WIRE","FED_NOW","RTP","EREBOR","EREBOR_RAIL","BALANCE","SWIFT","SEPA","SEPA_INSTANT","TIPS","FASTER_PAYMENTS","BACS","CHAPS","ELIXIR","NICS","EFT","INTERAC","NPP","BECS","UPI","IMPS","IMPS_WITH_FIRC","NEFT","RTGS","BI_FAST","ARTAJASA","PIX","TED","TEF","SPEI","COELSA","SINPE","CIPS","CFXPS","CHATS","ZENGIN","KFTC","FAST_SG","MEPS","DUITNOW","PROMPTPAY","INSTAPAY","PESONET","NAPAS","BEFTN","SLIPS","ZAHAV","GHIPSS","NIBSS","PESALINK","RTC_ZA","TZS_RTGS","EGP_ACH","JOD_ACH","NPSS","MADA","QPS","DOP_ACH","GTQ_ACH","HNL_ACH","PEN_ACH","JMD_ACH","USD_ACH_SV","USD_ACH_EC","CLP_TEF","PSE","COP_ACH","BOB_RTGS","PYG_ACH","CERTIS","DKK_TIPS","SENT","NKS","BANKGIROT","HKD_FPS","IBFT","TRY_FAST","ETHEREUM","BASE","POLYGON","SOLANA","TRON","BITCOIN","ARBITRUM"],"description":"Destination rail - chain/network for crypto sweep","example":"BASE"},"destinationCurrency":{"type":"string","description":"Destination currency to convert to","example":"USDC"},"developerFeeFixed":{"type":"string","description":"Fixed fee in minor units of source currency","example":"100000"},"developerFeePercent":{"type":"number","minimum":0,"maximum":0.1,"description":"Variable fee as decimal percentage (0.01 = 1%)","example":0.01},"externalReference":{"type":"string","description":"Client-provided external reference","example":"550e8400-e29b-41d4-a716-446655440000"},"metadata":{"description":"Additional metadata","example":{"nickname":"USD to Base deposits"},"allOf":[{"$ref":"#/components/schemas/AccountMetadataDto"}]},"allowedSenderBanks":{"description":"Allowed sender banks for deposits into this route. When set, deposits from sender banks not on this list are held for review instead of being processed automatically. Each entry must include at least one identifier.","type":"array","items":{"$ref":"#/components/schemas/AllowedSenderBankDto"}}},"required":["customerId","sweepTargetAccountId"]},"BankDepositInstructions":{"type":"object","properties":{"bankName":{"type":"string","example":"JPMorgan Chase Bank"},"bankAddress":{"$ref":"#/components/schemas/BankAddressDto"},"accountNumber":{"type":"string","example":"1234567890"},"routingNumber":{"type":"string","example":"021000021"},"iban":{"type":"string","example":"GB82WEST12345698765432"},"swiftBic":{"type":"string","example":"CHASUS33"},"bankCountryCode":{"type":"string","example":"US"},"reference":{"type":"string","example":"REF-123456"},"depositMessage":{"type":"string","example":"FFC Acme Holdings LLC 1234567890"},"beneficiaryName":{"type":"string","example":"John Doe"},"beneficiaryAddress":{"$ref":"#/components/schemas/BankAddressDto"}},"required":["accountNumber"]},"SourceAccountDto":{"type":"object","properties":{"id":{"type":"string","example":"vba_abc123"},"type":{"enum":["VIRTUAL_BANK","VIRTUAL_WALLET","INFINITE_BANK","INFINITE_WALLET","EXTERNAL_BANK","EXTERNAL_WALLET","EXTERNAL_PROXY","PROVIDER_BALANCE"],"type":"string","example":"VIRTUAL_BANK"},"metadata":{"description":"Custom metadata for the source account, including nickname","allOf":[{"$ref":"#/components/schemas/AccountMetadataDto"}]},"depositInstructions":{"$ref":"#/components/schemas/BankDepositInstructions"},"sourceCurrency":{"type":"string","example":"USD"},"sourceRail":{"type":"string","example":"ACH"},"walletAddress":{"type":"string","example":"0x742d35Cc6529Cf6c6D06E4C8a4c07583F5C6C2d8"},"addressType":{"type":"string","example":"EVM"},"chains":{"example":["ETHEREUM","BASE"],"type":"array","items":{"type":"string"}},"walletType":{"enum":["TREASURY","TRANSACTION","VIRTUAL"],"type":"string","description":"Infinite wallet subtype when source is INFINITE_WALLET (e.g. VIRTUAL for dedicated offramp deposit wallets)"}},"required":["id","type"]},"SweepTargetAccountDto":{"type":"object","properties":{"id":{"type":"string","example":"ewa_abc123"},"type":{"enum":["VIRTUAL_BANK","VIRTUAL_WALLET","INFINITE_BANK","INFINITE_WALLET","EXTERNAL_BANK","EXTERNAL_WALLET","EXTERNAL_PROXY","PROVIDER_BALANCE"],"type":"string","example":"EXTERNAL_WALLET"},"metadata":{"description":"Custom metadata for the sweep target account, including nickname","allOf":[{"$ref":"#/components/schemas/AccountMetadataDto"}]},"walletAddress":{"type":"string","example":"0x742d35Cc6529Cf6c6D06E4C8a4c07583F5C6C2d8"},"addressType":{"type":"string","example":"EVM"},"chains":{"example":["ETHEREUM","BASE"],"type":"array","items":{"type":"string"}},"accountNumber":{"type":"string","example":"****7890"},"routingNumber":{"type":"string","example":"021000021"},"bankName":{"type":"string","example":"Bank of America"}},"required":["id","type"]},"FixedRouteCorrespondentBankDto":{"type":"object","properties":{"name":{"type":"string","nullable":true,"description":"Bank name"},"swiftCode":{"type":"string","nullable":true,"description":"SWIFT/BIC code","example":"IRVTUS3NXXX"},"accountNumber":{"type":"string","nullable":true,"description":"Account number","example":"9876543210"}}},"FixedRouteResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Fixed route ID (same as source account ID)","example":"vba_abc123"},"customerId":{"type":"string","example":"cus_abc123"},"type":{"enum":["FIAT_TO_CRYPTO","CRYPTO_TO_FIAT","CRYPTO_TO_CRYPTO","FIAT_TO_CRYPTO_TO_FIAT"],"type":"string","example":"FIAT_TO_CRYPTO"},"status":{"type":"string","example":"ACTIVE"},"enabled":{"type":"boolean","description":"Whether the fixed route is enabled. When false, deposits land but do not auto-sweep.","example":true},"metadata":{"description":"Custom metadata for the fixed route account, including nickname","allOf":[{"$ref":"#/components/schemas/AccountMetadataDto"}]},"sourceAccount":{"$ref":"#/components/schemas/SourceAccountDto"},"destinationCurrency":{"type":"string","example":"USDC"},"destinationRail":{"type":"string","example":"BASE"},"sweepTargetAccountId":{"type":"string","description":"ID of the account funds are swept to","example":"ewa_abc123"},"sweepTargetAccount":{"description":"Sweep target account details (only when expand=sweepTargetAccount)","allOf":[{"$ref":"#/components/schemas/SweepTargetAccountDto"}]},"developerFeeFixed":{"type":"string","nullable":true,"description":"Fixed fee in minor units of source currency","example":"100000"},"developerFeePercent":{"type":"number","nullable":true,"description":"Variable fee as decimal percentage (0.01 = 1%)","example":0.01},"refundAccountId":{"type":"string","nullable":true,"description":"Customer wallet account ID (inw_xxx or ewa_xxx) for refunds on failed transfers or when fees exceed deposit","example":"inw_abc123"},"correspondentBank":{"nullable":true,"description":"Correspondent/intermediary bank details (when applicable)","type":"object","allOf":[{"$ref":"#/components/schemas/FixedRouteCorrespondentBankDto"}]},"allowedSenderBanks":{"nullable":true,"description":"Allowed sender banks for deposits into this route. When set, deposits from sender banks not on this list are held for review instead of being processed automatically.","type":"array","items":{"$ref":"#/components/schemas/AllowedSenderBankDto"}},"minimumAmount":{"description":"Minimum deposit amount for this route. Deposits below this floor are held instead of swept. This is a preview based on the stored route configuration; the validate endpoint returns the authoritative floor at submission time.","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]},"sharesBalanceAccountCoordinates":{"type":"boolean","description":"Whether this route's deposit coordinates are shared with a USD balance account. When true, the route and a balance account are mutually exclusive for the customer — one must be closed/disabled before the other can be created or re-enabled. Only bank pay-in routes on the balance-account provider qualify (ACH, WIRE, or SWIFT); crypto routes and payout routes are always false.","example":false},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","customerId","type","status","enabled","sourceAccount","sweepTargetAccountId","sharesBalanceAccountCoordinates","createdAt","updatedAt"]},"CreateVirtualWalletFixedRouteDto":{"type":"object","properties":{"correspondentBankName":{"type":"string","maxLength":200,"description":"Correspondent/intermediary bank name","example":"Bank of America"},"correspondentBankSwiftCode":{"type":"string","description":"Correspondent/intermediary bank SWIFT/BIC code (8 or 11 characters)","example":"IRVTUS3NXXX"},"correspondentAccountNumber":{"type":"string","maxLength":64,"description":"Correspondent/intermediary account number","example":"9876543210"},"customerId":{"type":"string","description":"Customer ID","example":"cus_abc123"},"sweepTargetAccountId":{"type":"string","description":"Target account for sweep. Must be an EXTERNAL_BANK (for crypto→fiat) or EXTERNAL_WALLET/INFINITE_WALLET (for crypto→crypto) that belongs to the same customer. Virtual accounts are not valid destinations.","example":"eba_xyz789"},"chainType":{"enum":["EVM","TRON","BITCOIN","SOLANA"],"type":"string","description":"Chain type for the wallet address","example":"EVM"},"sourceRail":{"type":"string","enum":["ACH","ACH_SAME_DAY","WIRE","FED_NOW","RTP","EREBOR","EREBOR_RAIL","BALANCE","SWIFT","SEPA","SEPA_INSTANT","TIPS","FASTER_PAYMENTS","BACS","CHAPS","ELIXIR","NICS","EFT","INTERAC","NPP","BECS","UPI","IMPS","IMPS_WITH_FIRC","NEFT","RTGS","BI_FAST","ARTAJASA","PIX","TED","TEF","SPEI","COELSA","SINPE","CIPS","CFXPS","CHATS","ZENGIN","KFTC","FAST_SG","MEPS","DUITNOW","PROMPTPAY","INSTAPAY","PESONET","NAPAS","BEFTN","SLIPS","ZAHAV","GHIPSS","NIBSS","PESALINK","RTC_ZA","TZS_RTGS","EGP_ACH","JOD_ACH","NPSS","MADA","QPS","DOP_ACH","GTQ_ACH","HNL_ACH","PEN_ACH","JMD_ACH","USD_ACH_SV","USD_ACH_EC","CLP_TEF","PSE","COP_ACH","BOB_RTGS","PYG_ACH","CERTIS","DKK_TIPS","SENT","NKS","BANKGIROT","HKD_FPS","IBFT","TRY_FAST","ETHEREUM","BASE","POLYGON","SOLANA","TRON","BITCOIN","ARBITRUM"],"description":"Source rail - chain where deposits are received","example":"BASE"},"sourceCurrency":{"type":"string","description":"Source currency accepted for deposits","example":"USDC"},"destinationRail":{"type":"string","enum":["ACH","ACH_SAME_DAY","WIRE","FED_NOW","RTP","EREBOR","EREBOR_RAIL","BALANCE","SWIFT","SEPA","SEPA_INSTANT","TIPS","FASTER_PAYMENTS","BACS","CHAPS","ELIXIR","NICS","EFT","INTERAC","NPP","BECS","UPI","IMPS","IMPS_WITH_FIRC","NEFT","RTGS","BI_FAST","ARTAJASA","PIX","TED","TEF","SPEI","COELSA","SINPE","CIPS","CFXPS","CHATS","ZENGIN","KFTC","FAST_SG","MEPS","DUITNOW","PROMPTPAY","INSTAPAY","PESONET","NAPAS","BEFTN","SLIPS","ZAHAV","GHIPSS","NIBSS","PESALINK","RTC_ZA","TZS_RTGS","EGP_ACH","JOD_ACH","NPSS","MADA","QPS","DOP_ACH","GTQ_ACH","HNL_ACH","PEN_ACH","JMD_ACH","USD_ACH_SV","USD_ACH_EC","CLP_TEF","PSE","COP_ACH","BOB_RTGS","PYG_ACH","CERTIS","DKK_TIPS","SENT","NKS","BANKGIROT","HKD_FPS","IBFT","TRY_FAST","ETHEREUM","BASE","POLYGON","SOLANA","TRON","BITCOIN","ARBITRUM"],"description":"Destination rail - payment network or chain for sweep","example":"ACH"},"destinationCurrency":{"type":"string","description":"Destination currency to convert to","example":"USD"},"destinationAchReference":{"type":"string","description":"Reference message for ACH transactions (max 10 characters)","example":"PAY123","maxLength":10},"destinationWireMessage":{"type":"string","description":"Message for wire transfers (max 140 characters)","example":"Payment for services","maxLength":140},"destinationSepaReference":{"type":"string","description":"Reference for SEPA transactions (6-140 characters)","example":"Invoice-2024-001","minLength":6,"maxLength":140},"destinationSpeiReference":{"type":"string","description":"Reference for SPEI transactions (max 40 characters)","example":"Payment123","maxLength":40},"developerFeeFixed":{"type":"string","description":"Fixed fee in minor units of source currency","example":"100000"},"developerFeePercent":{"type":"number","minimum":0,"maximum":0.1,"description":"Variable fee as decimal percentage (0.01 = 1%)","example":0.01},"refundAccountId":{"type":"string","description":"Customer wallet account ID (inw_xxx or ewa_xxx) for refunds on failed transfers or when fees exceed deposit. Must have a wallet address; validated at request time. Falls back to org config if not set.","example":"inw_abc123"},"externalReference":{"type":"string","description":"Client-provided external reference","example":"550e8400-e29b-41d4-a716-446655440000"},"metadata":{"description":"Additional metadata","example":{"nickname":"Base USDC deposits"},"allOf":[{"$ref":"#/components/schemas/AccountMetadataDto"}]}},"required":["customerId","sweepTargetAccountId","chainType"]},"UpdateFixedRouteDto":{"type":"object","properties":{"correspondentBankName":{"type":"string","maxLength":200,"description":"Correspondent/intermediary bank name","example":"Bank of America"},"correspondentBankSwiftCode":{"type":"string","description":"Correspondent/intermediary bank SWIFT/BIC code (8 or 11 characters)","example":"IRVTUS3NXXX"},"correspondentAccountNumber":{"type":"string","maxLength":64,"description":"Correspondent/intermediary account number","example":"9876543210"},"developerFeeFixed":{"type":"string","description":"Fixed fee in minor units of source currency","example":"100000"},"developerFeePercent":{"type":"number","minimum":0,"maximum":0.1,"description":"Variable fee as decimal percentage (0.01 = 1%). Max 10%.","example":0.01},"refundAccountId":{"type":"string","description":"Customer wallet account ID (inw_xxx or ewa_xxx) for refunds on failed transfers or when fees exceed deposit. Must have a wallet address; validated at request time.","example":"inw_abc123"},"enabled":{"type":"boolean","description":"Whether the fixed route is enabled. When false, deposits land but do not auto-sweep.","example":true},"metadata":{"description":"Optional metadata for the fixed route account (e.g., nickname)","example":{"nickname":"USD to Base deposits"},"allOf":[{"$ref":"#/components/schemas/AccountMetadataDto"}]},"allowedSenderBanks":{"description":"Allowed sender banks for deposits into this route (fiat pay-in routes only). When set, deposits from sender banks not on this list are held for review instead of being processed automatically. Each entry must include at least one identifier. Set to an empty array to remove the restriction.","type":"array","items":{"$ref":"#/components/schemas/AllowedSenderBankDto"}}}},"ValidateFixedRouteDto":{"type":"object","properties":{"sweepTargetAccountId":{"type":"string","description":"The destination account ID for the fixed route","example":"ewa_abc123"},"fixedRouteType":{"enum":["FIAT_TO_CRYPTO","CRYPTO_TO_FIAT","CRYPTO_TO_CRYPTO","FIAT_TO_CRYPTO_TO_FIAT"],"type":"string","description":"The type of fixed route to create","example":"FIAT_TO_CRYPTO"},"sourceRail":{"type":"string","description":"Source rail - payment rail for incoming deposits (e.g., ACH, WIRE, SEPA)","example":"ACH"},"sourceCurrency":{"type":"string","description":"Source currency for deposits (e.g., USD, EUR)","example":"USD"},"destinationRail":{"type":"string","description":"Destination rail - chain/network for outgoing sweep (e.g., BASE, ETHEREUM)","example":"BASE"},"destinationCurrency":{"type":"string","description":"Destination currency to convert to (e.g., USDC, USDT)","example":"USDC"},"braleAutomationId":{"type":"string","description":"Bound Brale wire automation ID for legacy onramp routes. Omit for new standby-pool routes (Solana SBC intermediary)."}},"required":["sweepTargetAccountId","fixedRouteType"]},"ValidateFixedRouteResponseDto":{"type":"object","properties":{"valid":{"type":"boolean","description":"Whether the fixed route configuration is valid","example":true},"error":{"type":"string","description":"Error message if validation failed","example":"FIAT_TO_CRYPTO route requires a wallet as sweep target"},"minimumAmount":{"description":"Minimum deposit amount for this route. Deposits below this floor are not swept.","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]}},"required":["valid"]},"CreateExternalWalletDto":{"type":"object","properties":{"customerId":{"type":"string","description":"Customer ID","example":"cust_abc123"},"counterpartyId":{"type":"string","description":"Existing counterparty ID for third-party recipient wallets. If not provided, we'll upsert a new counterparty.","example":"cp_abc123"},"walletAddress":{"type":"string","description":"Wallet address","example":"0x1234567890abcdef1234567890abcdef12345678"},"chains":{"type":"array","items":{"type":"string","enum":["ETHEREUM","BASE","POLYGON","SOLANA","TRON","BITCOIN","ARBITRUM"]},"description":"Supported chains","example":["ETHEREUM","BASE"]},"currencies":{"description":"Supported currencies","example":["USDC","USDT"],"type":"array","items":{"type":"string"}},"externalReference":{"type":"string","description":"Client-provided external reference for mapping to your system (UUID v4 or CUID recommended)","example":"550e8400-e29b-41d4-a716-446655440000"},"isThirdParty":{"type":"boolean","description":"Whether this account belongs to a third party (not the customer). Defaults to false.","example":false},"custodyType":{"enum":["SELF_HOSTED","ANCHORAGE","BINANCE","BITGO","CIRCLE","COINBASE","FIREBLOCKS","GEMINI","KRAKEN","ROBINHOOD","OTHER_EXCHANGE"],"type":"string","description":"Wallet custody type used for provider custodian mapping. Defaults to SELF_HOSTED.","example":"SELF_HOSTED"},"metadata":{"description":"Custom metadata for your application","example":{"nickname":"Primary USDC Wallet"},"allOf":[{"$ref":"#/components/schemas/AccountMetadataDto"}]},"beneficiaryType":{"enum":["INDIVIDUAL","BUSINESS"],"type":"string","description":"Beneficiary type for third-party recipients. Required when creating a new third-party counterparty.","example":"INDIVIDUAL"},"beneficiaryName":{"type":"string","description":"Beneficiary legal name for third-party recipients. Required when creating a new third-party counterparty.","example":"Jane Doe"},"beneficiaryAddress":{"description":"Beneficiary address for third-party recipient wallets. Required when creating a new third-party counterparty.","allOf":[{"$ref":"#/components/schemas/AddressDto"}]}},"required":["customerId","walletAddress"]},"ExternalWalletResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Account ID","example":"ewa_1234567890abcdef"},"customerId":{"type":"string","description":"Customer ID","example":"cust_abc123"},"counterpartyId":{"type":"string","nullable":true,"description":"Counterparty ID when this is a third-party recipient wallet","example":"cp_abc123"},"type":{"type":"string","enum":["EXTERNAL_WALLET"],"description":"Account type","example":"EXTERNAL_WALLET"},"status":{"enum":["IN_REVIEW","ACTIVE","CLOSED"],"type":"string","description":"Account status","example":"IN_REVIEW"},"metadata":{"description":"Custom metadata for your application, including account nickname","allOf":[{"$ref":"#/components/schemas/AccountMetadataDto"}]},"walletAddress":{"type":"string","description":"Wallet address","example":"0x1234567890abcdef1234567890abcdef12345678"},"addressType":{"enum":["EVM","TRON","BITCOIN","SOLANA"],"type":"string","description":"Wallet address type","example":"EVM"},"chains":{"type":"array","items":{"type":"string","enum":["ETHEREUM","BASE","POLYGON","SOLANA","TRON","BITCOIN","ARBITRUM"]},"description":"Supported blockchain chains","example":["ETHEREUM","BASE"]},"currencies":{"type":"array","items":{"required":false,"description":"Supported currencies","example":["USDC","USDT"],"type":"array","items":{"type":"string"}}},"custodyType":{"enum":["SELF_HOSTED","ANCHORAGE","BINANCE","BITGO","CIRCLE","COINBASE","FIREBLOCKS","GEMINI","KRAKEN","ROBINHOOD","OTHER_EXCHANGE"],"type":"string","description":"Wallet custody type used for provider custodian mapping.","example":"SELF_HOSTED"},"createdAt":{"type":"string","description":"Account creation date","format":"date-time","example":"2026-01-15T10:00:00Z"},"updatedAt":{"type":"string","description":"Account last update date","format":"date-time","example":"2026-01-15T10:00:00Z"},"created":{"type":"boolean","description":"Whether this account was newly created in this request or returned from an existing match","example":true}},"required":["id","customerId","type","status","walletAddress","addressType","currencies","createdAt","updatedAt"]},"UpdateExternalWalletDto":{"type":"object","properties":{"chains":{"type":"array","items":{"type":"string","enum":["ETHEREUM","BASE","POLYGON","SOLANA","TRON","BITCOIN","ARBITRUM"]},"description":"Supported chains","example":["ETHEREUM","BASE"]},"currencies":{"description":"Supported currencies","example":["USDC","USDT"],"type":"array","items":{"type":"string"}},"metadata":{"description":"Optional metadata for the account (e.g., nickname)","example":{"nickname":"Primary USDC Wallet"},"allOf":[{"$ref":"#/components/schemas/AccountMetadataDto"}]}}},"CreateExternalBankAccountDto":{"type":"object","properties":{"correspondentBankName":{"type":"string","maxLength":200,"description":"Correspondent/intermediary bank name","example":"Bank of America"},"correspondentBankSwiftCode":{"type":"string","description":"Correspondent/intermediary bank SWIFT/BIC code (8 or 11 characters)","example":"IRVTUS3NXXX"},"correspondentAccountNumber":{"type":"string","maxLength":64,"description":"Correspondent/intermediary account number","example":"9876543210"},"customerId":{"type":"string","description":"Customer ID","example":"cust_abc123"},"counterpartyId":{"type":"string","description":"Existing counterparty ID. When provided for a third-party bank account, known counterparty data can be reused.","example":"cp_abc123"},"beneficiaryName":{"type":"string","maxLength":100,"description":"Full legal name of the account holder","example":"John Smith"},"paymentRails":{"type":"array","items":{"type":"string","enum":["ACH","ACH_SAME_DAY","WIRE","FED_NOW","RTP","EREBOR","EREBOR_RAIL","BALANCE","SWIFT","SEPA","SEPA_INSTANT","TIPS","FASTER_PAYMENTS","BACS","CHAPS","ELIXIR","NICS","EFT","INTERAC","NPP","BECS","UPI","IMPS","IMPS_WITH_FIRC","NEFT","RTGS","BI_FAST","ARTAJASA","PIX","TED","TEF","SPEI","COELSA","SINPE","CIPS","CFXPS","CHATS","ZENGIN","KFTC","FAST_SG","MEPS","DUITNOW","PROMPTPAY","INSTAPAY","PESONET","NAPAS","BEFTN","SLIPS","ZAHAV","GHIPSS","NIBSS","PESALINK","RTC_ZA","TZS_RTGS","EGP_ACH","JOD_ACH","NPSS","MADA","QPS","DOP_ACH","GTQ_ACH","HNL_ACH","PEN_ACH","JMD_ACH","USD_ACH_SV","USD_ACH_EC","CLP_TEF","PSE","COP_ACH","BOB_RTGS","PYG_ACH","CERTIS","DKK_TIPS","SENT","NKS","BANKGIROT","HKD_FPS","IBFT","TRY_FAST"]},"description":"Payment rails this account supports.\n\n**Bank rails**: ACH, SWIFT, SEPA, WIRE, FASTER_PAYMENTS, IMPS, NEFT, SPEI, etc.\n\n**Proxy rails**: PIX, UPI, PROMPTPAY, DUITNOW (require aliasType + aliasValue)\n\nCompatible bank rails can be combined (e.g., a US account can support [\"ach\", \"ach_same_day\", \"wire\"]).","example":["ACH","WIRE"]},"beneficiaryType":{"enum":["INDIVIDUAL","BUSINESS"],"type":"string","description":"Beneficiary type (individual or business)","example":"INDIVIDUAL"},"isThirdParty":{"type":"boolean","description":"Whether the account holder differs from the customer (third-party payment). May require additional compliance checks.","example":false},"metadata":{"description":"Custom metadata for your application","example":{"nickname":"Primary Business Account"},"allOf":[{"$ref":"#/components/schemas/AccountMetadataDto"}]},"aliasType":{"enum":["PHONE","EMAIL","NATIONAL_ID","TAX_ID","RANDOM","CORPORATE_ID"],"type":"string","description":"**Required for proxy rails.** The type of alias identifier.\n\nSupported alias types vary by rail:\n- **PIX** (Brazil): phone, email, tax_id (CPF/CNPJ), random\n- **UPI** (India): phone, random (VPA)\n- **PromptPay** (Thailand): phone, national_id, tax_id\n- **DuitNow** (Malaysia): phone, national_id (NRIC), corporate_id\n- **GhIPSS** (Ghana): phone\n- **SINPE** (Costa Rica): phone\n\n**Note**: Both aliasType and aliasValue must be provided together.","example":"TAX_ID"},"aliasValue":{"type":"string","description":"**Required for proxy rails.** The alias value. Format depends on aliasType:\n- **phone**: E.164 format (+5511912345678)\n- **email**: Standard email format\n- **tax_id**: Country-specific (Brazil CPF: 11 digits, CNPJ: 14 digits)\n- **national_id**: Country-specific (Thailand: 13 digits, Malaysia NRIC: 12 digits)\n- **random**: UUID format or provider-assigned key (e.g., UPI VPA like \"user@upi\")\n\n**Note**: Both aliasType and aliasValue must be provided together.\n\n**Normalization**: The value is normalized to lowercase and trimmed before storage. While some identifiers (e.g., UPI VPAs, emails) may display with mixed case, payment rails typically treat them as case-insensitive for routing.","example":"12345678901"},"beneficiaryAddress":{"description":"Beneficiary address.\n\nRequired for SWIFT and most international transfers. Optional for US ACH, same-day ACH, RTP, FedNow, and domestic wire at account create.","allOf":[{"$ref":"#/components/schemas/AddressDto"}]},"beneficiaryPhone":{"type":"string","description":"Beneficiary phone number in E.164 format","example":"+14155551234"},"beneficiaryDateOfBirth":{"type":"string","description":"Account holder's date of birth. Required at payout time for individual beneficiaries on supported corridors.","example":"1990-01-31","format":"date"},"bankName":{"type":"string","maxLength":200,"description":"Bank name. Auto-enriched from routing codes (SWIFT/BIC, IFSC, sort code, etc.) if not provided. Required if enrichment is unavailable.","example":"JPMorgan Chase Bank"},"bankAddress":{"description":"Bank address. Auto-enriched from routing codes (SWIFT/BIC, IFSC, sort code, etc.) if not provided. Required if enrichment is unavailable.","allOf":[{"$ref":"#/components/schemas/BankAddressDto"}]},"swiftBic":{"type":"string","description":"SWIFT/BIC code (8 or 11 characters).\n- **SWIFT transfers**: Always required\n- **SEPA**: Optional (IBAN-only supported)","example":"CHASUS33"},"iban":{"type":"string","description":"IBAN (International Bank Account Number).\n- **SWIFT to EU/UK**: Required (with swiftBic)\n- **SEPA/SEPA Instant**: Required (swiftBic optional)","example":"DE89370400440532013000"},"accountNumber":{"type":"string","description":"Bank account number or equivalent. Usage varies by country:\n- **US** (ACH/Wire): Account number (with 9-digit routingNumber)\n- **UK** (Faster Payments): 8-digit account (with 6-digit sort code in routingNumber)\n- **India** (IMPS/NEFT): Account number (with 11 char IFSC in routingNumber)\n- **Mexico** (SPEI): 18-digit CLABE (routingNumber not needed)\n- **Argentina** (COELSA): 22-digit CBU (routingNumber not needed)\n- **Brazil** (TED): Account number (with bank code in routingNumber)","example":"1234567890"},"routingNumber":{"type":"string","description":"Bank routing code. This field adapts to country-specific identifiers:\n- **US**: 9-digit ABA routing number\n- **CA**: 8-9 digits (transit + institution)\n- **AU**: 6-digit BSB\n- **UK**: 6-digit sort code\n- **India**: 11 character IFSC code","example":"021000021"},"branchCode":{"type":"string","description":"Bank branch code. Required for countries that use separate bank and branch identifiers:\n- **Japan**: 3-digit branch code (used with 4-digit bank code)\n- **Brazil**: 4-5 digit agency/branch number\n- **South Africa**: 6-digit branch code\n- **New Zealand**: 4-digit branch code\n- **Bolivia**: 3-letter branch city code (e.g. LPZ, SCZ)","example":"001"},"beneficiaryDocumentType":{"type":"string","maxLength":10,"description":"Type of the beneficiary's national/tax identification document. Required for payouts on rails whose clearing system carries the beneficiary document — the valid codes are rail-specific:\n- **Colombia (ACH)**: CC, NIT, CE, PA, PPT, TI, RC, TE, DIE, ND\n- **Chile (TEF)**: RUT, RUN, PAS, CE\n- **Paraguay (SIPAP)**: CI, PAS, CRP, CRC, RUC, DNI\n- **Peru (ACH)**: RUC, DNI, PAS, CE\n\nBrazil (TED) and Bolivia take only `beneficiaryDocumentNumber` (Brazil infers CPF vs CNPJ from the digit count). Optional at creation; payouts on these rails fail without it.","example":"CC"},"beneficiaryDocumentNumber":{"type":"string","maxLength":30,"pattern":"^[A-Za-z0-9.-]+$","description":"The beneficiary's national/tax identification document number (e.g. CPF/CNPJ digits for Brazil, cédula number for Colombia/Paraguay, RUT for Chile). Format is validated per rail at payout time. Optional at creation; payouts on rails that require it fail without it.","example":"12345678901"},"beneficiaryStateProvince":{"type":"string","maxLength":64,"description":"The beneficiary's state/department/province, for rails whose clearing system requires it on payouts (Peru ACH, e.g. LIMA). Optional at creation; payouts on those rails fail without it.","example":"LIMA"},"bankAccountType":{"enum":["checking","savings"],"type":"string","description":"Bank account type (checking vs savings). Required for US ACH, and for payouts on rails whose clearing system carries it (e.g. Brazil TED, Colombia ACH, Chile TEF, Peru ACH) — accounts on those rails cannot receive payouts without it.","example":"checking"},"currencyCodes":{"description":"ISO 4217 currency codes this account can receive. If omitted, inferred from the payment rails. Can only be specified for Hong Kong (CHATS) or SWIFT payment rails.","example":["USD"],"type":"array","items":{"type":"string"}}},"required":["customerId","beneficiaryName","paymentRails"]},"ExternalAccountResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Account ID","example":"eba_1234567890abcdef"},"customerId":{"type":"string","description":"Customer ID","example":"cust_abc123"},"counterpartyId":{"type":"string","nullable":true,"description":"Counterparty ID when this is a third-party recipient account","example":"cp_abc123"},"type":{"type":"string","enum":["EXTERNAL_BANK","EXTERNAL_PROXY"],"description":"Account type","example":"EXTERNAL_BANK"},"status":{"enum":["IN_REVIEW","ACTIVE","CLOSED"],"type":"string","description":"Account status","example":"IN_REVIEW"},"beneficiaryType":{"enum":["INDIVIDUAL","BUSINESS"],"type":"string","description":"Beneficiary type","example":"INDIVIDUAL"},"beneficiaryName":{"type":"string","description":"Beneficiary name","example":"John Smith"},"metadata":{"description":"Custom metadata for your application, including account nickname","allOf":[{"$ref":"#/components/schemas/AccountMetadataDto"}]},"paymentRail":{"enum":["ACH","ACH_SAME_DAY","WIRE","FEDWIRE","FED_NOW","RTP","EREBOR","EREBOR_RAIL","BALANCE","SWIFT","SEPA","SEPA_INSTANT","TIPS","FASTER_PAYMENTS","BACS","CHAPS","ELIXIR","NICS","EFT","INTERAC","NPP","BECS","UPI","IMPS","IMPS_WITH_FIRC","NEFT","RTGS","BI_FAST","ARTAJASA","PIX","TED","TEF","SPEI","COELSA","SINPE","CIPS","CFXPS","CHATS","ZENGIN","KFTC","FAST_SG","MEPS","DUITNOW","PROMPTPAY","INSTAPAY","PESONET","NAPAS","BEFTN","SLIPS","ZAHAV","GHIPSS","NIBSS","PESALINK","RTC_ZA","TZS_RTGS","EGP_ACH","JOD_ACH","NPSS","MADA","QPS","DOP_ACH","GTQ_ACH","HNL_ACH","PEN_ACH","JMD_ACH","USD_ACH_SV","USD_ACH_EC","CLP_TEF","PSE","COP_ACH","BOB_RTGS","PYG_ACH","CERTIS","DKK_TIPS","SENT","NKS","BANKGIROT","HKD_FPS","IBFT","TRY_FAST"],"type":"string","description":"Primary payment rail for this account","example":"SWIFT"},"paymentRails":{"type":"array","items":{"type":"string","enum":["ACH","ACH_SAME_DAY","WIRE","FEDWIRE","FED_NOW","RTP","EREBOR","EREBOR_RAIL","BALANCE","SWIFT","SEPA","SEPA_INSTANT","TIPS","FASTER_PAYMENTS","BACS","CHAPS","ELIXIR","NICS","EFT","INTERAC","NPP","BECS","UPI","IMPS","IMPS_WITH_FIRC","NEFT","RTGS","BI_FAST","ARTAJASA","PIX","TED","TEF","SPEI","COELSA","SINPE","CIPS","CFXPS","CHATS","ZENGIN","KFTC","FAST_SG","MEPS","DUITNOW","PROMPTPAY","INSTAPAY","PESONET","NAPAS","BEFTN","SLIPS","ZAHAV","GHIPSS","NIBSS","PESALINK","RTC_ZA","TZS_RTGS","EGP_ACH","JOD_ACH","NPSS","MADA","QPS","DOP_ACH","GTQ_ACH","HNL_ACH","PEN_ACH","JMD_ACH","USD_ACH_SV","USD_ACH_EC","CLP_TEF","PSE","COP_ACH","BOB_RTGS","PYG_ACH","CERTIS","DKK_TIPS","SENT","NKS","BANKGIROT","HKD_FPS","IBFT","TRY_FAST"]},"description":"All payment rails this account supports (bank accounts only)","example":["ACH","ACH_SAME_DAY","WIRE"]},"beneficiaryAddress":{"type":"object","nullable":true,"description":"Beneficiary address (bank accounts only)","properties":{"addressLine1":{"type":"string","example":"123 Main Street"},"addressLine2":{"type":"string","example":"Suite 100"},"city":{"type":"string","example":"New York"},"state":{"type":"string","example":"NY"},"postalCode":{"type":"string","example":"10001"},"country":{"type":"string","example":"US"}}},"beneficiaryPhone":{"type":"string","nullable":true,"description":"Beneficiary phone number","example":"+12125551234"},"beneficiaryDateOfBirth":{"type":"string","description":"Account holder's date of birth","example":"1990-01-31","format":"date"},"bankName":{"type":"string","nullable":true,"description":"Bank name (bank accounts only)","example":"JPMorgan Chase Bank"},"bankAddress":{"type":"object","nullable":true,"description":"Bank address (bank accounts only)","properties":{"addressLine1":{"type":"string","example":"270 Park Avenue"},"addressLine2":{"type":"string","example":"Floor 10"},"city":{"type":"string","example":"New York"},"state":{"type":"string","example":"NY"},"postalCode":{"type":"string","example":"10017"},"country":{"type":"string","example":"US"}}},"swiftBic":{"type":"string","nullable":true,"description":"SWIFT/BIC code (bank accounts only)","example":"CHASUS33"},"iban":{"type":"string","nullable":true,"description":"IBAN (bank accounts only)","example":"GB82WEST12345698765432"},"accountNumber":{"type":"string","nullable":true,"description":"Bank account number (bank accounts only)","example":"1234567890"},"routingNumber":{"type":"string","nullable":true,"description":"Bank routing code (ABA routing number, sort code, BSB, IFSC, etc.)","example":"021000021"},"branchCode":{"type":"string","nullable":true,"description":"Bank branch code (for countries like Japan, Brazil, South Africa that use separate branch identifiers)","example":"001"},"beneficiaryDocumentType":{"type":"string","description":"Type of the beneficiary's national/tax identification document (rail-specific codes, e.g. CC/NIT for Colombia, RUT for Chile)","example":"CC"},"beneficiaryDocumentNumber":{"type":"string","description":"The beneficiary's national/tax identification document number","example":"12345678901"},"beneficiaryStateProvince":{"type":"string","description":"The beneficiary's state/department/province (rails that require it on payouts, e.g. Peru ACH)","example":"LIMA"},"correspondentBankName":{"type":"string","nullable":true,"description":"Correspondent/intermediary bank name (SWIFT)","example":"Bank of America"},"correspondentBankSwiftCode":{"type":"string","nullable":true,"description":"Correspondent/intermediary bank SWIFT/BIC code (SWIFT)","example":"IRVTUS3NXXX"},"correspondentAccountNumber":{"type":"string","nullable":true,"description":"Correspondent/intermediary account number (SWIFT)","example":"9876543210"},"bankAccountType":{"nullable":true,"enum":["checking","savings"],"type":"string","description":"Bank account type (bank accounts only)","example":"checking"},"currencyCodes":{"nullable":true,"description":"Supported currency codes","example":["USD","EUR"],"type":"array","items":{"type":"string"}},"aliasType":{"nullable":true,"enum":["PHONE","EMAIL","NATIONAL_ID","TAX_ID","RANDOM","CORPORATE_ID"],"type":"string","description":"Type of proxy alias (proxy accounts only)","example":"TAX_ID"},"aliasValue":{"type":"string","nullable":true,"description":"The proxy alias value (proxy accounts only)","example":"12345678901"},"createdAt":{"type":"string","description":"Account creation date","format":"date-time","example":"2026-01-15T10:00:00Z"},"updatedAt":{"type":"string","description":"Account last update date","format":"date-time","example":"2026-01-15T10:00:00Z"},"created":{"type":"boolean","description":"Whether this account was newly created in this request or returned from an existing match","example":true}},"required":["id","customerId","type","status","beneficiaryType","beneficiaryName","paymentRail","createdAt","updatedAt"]},"UpdateExternalBankAccountDto":{"type":"object","properties":{"beneficiaryType":{"enum":["INDIVIDUAL","BUSINESS"],"type":"string","description":"Beneficiary type","example":"INDIVIDUAL"},"beneficiaryName":{"type":"string","maxLength":100,"description":"Beneficiary full name","example":"John Smith"},"beneficiaryAddress":{"description":"Beneficiary structured address","allOf":[{"$ref":"#/components/schemas/AddressDto"}]},"beneficiaryPhone":{"type":"string","description":"Beneficiary phone number","example":"+1234567890"},"beneficiaryDateOfBirth":{"type":"string","description":"Account holder's date of birth","example":"1990-01-31","format":"date"},"bankName":{"type":"string","maxLength":200,"description":"Bank name","example":"JPMorgan Chase Bank"},"bankAddress":{"description":"Bank structured address","allOf":[{"$ref":"#/components/schemas/BankAddressDto"}]},"paymentRails":{"type":"array","minItems":1,"items":{"type":"string","enum":["ACH","ACH_SAME_DAY","WIRE","FED_NOW","RTP","EREBOR","EREBOR_RAIL","BALANCE","SWIFT","SEPA","SEPA_INSTANT","TIPS","FASTER_PAYMENTS","BACS","CHAPS","ELIXIR","NICS","EFT","INTERAC","NPP","BECS","UPI","IMPS","IMPS_WITH_FIRC","NEFT","RTGS","BI_FAST","ARTAJASA","PIX","TED","TEF","SPEI","COELSA","SINPE","CIPS","CFXPS","CHATS","ZENGIN","KFTC","FAST_SG","MEPS","DUITNOW","PROMPTPAY","INSTAPAY","PESONET","NAPAS","BEFTN","SLIPS","ZAHAV","GHIPSS","NIBSS","PESALINK","RTC_ZA","TZS_RTGS","EGP_ACH","JOD_ACH","NPSS","MADA","QPS","DOP_ACH","GTQ_ACH","HNL_ACH","PEN_ACH","JMD_ACH","USD_ACH_SV","USD_ACH_EC","CLP_TEF","PSE","COP_ACH","BOB_RTGS","PYG_ACH","CERTIS","DKK_TIPS","SENT","NKS","BANKGIROT","HKD_FPS","IBFT","TRY_FAST"]},"description":"Adds compatible payment rails to this account. Send the full resulting list (existing rails plus any to add). Existing rails cannot be removed.\n\nRails must be compatible with each other and with the account's stored bank details (e.g. add RTP to a US ACH/WIRE account; do not mix SEPA with a US routing-number account).","example":["ACH","WIRE","RTP"]},"currencyCodes":{"description":"Currency codes supported by this account. Only updatable for accounts with Hong Kong (CHATS) or SWIFT payment rails.","example":["USD","EUR","GBP"],"type":"array","items":{"type":"string"}},"bankAccountType":{"enum":["checking","savings"],"type":"string","description":"Bank account type (checking or savings)","example":"checking"},"metadata":{"description":"Optional metadata for the account (e.g., nickname)","example":{"nickname":"Primary Business Account"},"allOf":[{"$ref":"#/components/schemas/AccountMetadataDto"}]}}},"ValidateBankCodeDto":{"type":"object","properties":{"paymentNetwork":{"type":"string","description":"Payment rail/network to validate the bank code for","enum":["ACH","ACH_SAME_DAY","WIRE","FED_NOW","RTP","EREBOR","EREBOR_RAIL","BALANCE","SWIFT","SEPA","SEPA_INSTANT","TIPS","FASTER_PAYMENTS","BACS","CHAPS","ELIXIR","NICS","EFT","INTERAC","NPP","BECS","UPI","IMPS","IMPS_WITH_FIRC","NEFT","RTGS","BI_FAST","ARTAJASA","PIX","TED","TEF","SPEI","COELSA","SINPE","CIPS","CFXPS","CHATS","ZENGIN","KFTC","FAST_SG","MEPS","DUITNOW","PROMPTPAY","INSTAPAY","PESONET","NAPAS","BEFTN","SLIPS","ZAHAV","GHIPSS","NIBSS","PESALINK","RTC_ZA","TZS_RTGS","EGP_ACH","JOD_ACH","NPSS","MADA","QPS","DOP_ACH","GTQ_ACH","HNL_ACH","PEN_ACH","JMD_ACH","USD_ACH_SV","USD_ACH_EC","CLP_TEF","PSE","COP_ACH","BOB_RTGS","PYG_ACH","CERTIS","DKK_TIPS","SENT","NKS","BANKGIROT","HKD_FPS","IBFT","TRY_FAST"],"example":"ACH"},"code":{"type":"string","description":"The bank code value to validate and enrich (routing number, sort code, IFSC, BIC, IBAN, etc.)","example":"021000021"}},"required":["paymentNetwork","code"]},"BankCodeEnrichmentResponseDto":{"type":"object","properties":{"found":{"type":"boolean","description":"Whether the bank code was found and enriched","example":true},"code":{"type":"string","description":"The bank code that was looked up","example":"021000021"},"paymentNetwork":{"type":"string","description":"The payment network the code was validated for","enum":["ACH","ACH_SAME_DAY","WIRE","FEDWIRE","FED_NOW","RTP","EREBOR","EREBOR_RAIL","BALANCE","SWIFT","SEPA","SEPA_INSTANT","TIPS","FASTER_PAYMENTS","BACS","CHAPS","ELIXIR","NICS","EFT","INTERAC","NPP","BECS","UPI","IMPS","IMPS_WITH_FIRC","NEFT","RTGS","BI_FAST","ARTAJASA","PIX","TED","TEF","SPEI","COELSA","SINPE","CIPS","CFXPS","CHATS","ZENGIN","KFTC","FAST_SG","MEPS","DUITNOW","PROMPTPAY","INSTAPAY","PESONET","NAPAS","BEFTN","SLIPS","ZAHAV","GHIPSS","NIBSS","PESALINK","RTC_ZA","TZS_RTGS","EGP_ACH","JOD_ACH","NPSS","MADA","QPS","DOP_ACH","GTQ_ACH","HNL_ACH","PEN_ACH","JMD_ACH","USD_ACH_SV","USD_ACH_EC","CLP_TEF","PSE","COP_ACH","BOB_RTGS","PYG_ACH","CERTIS","DKK_TIPS","SENT","NKS","BANKGIROT","HKD_FPS","IBFT","TRY_FAST"],"example":"ACH"},"bankName":{"type":"string","description":"Bank name","example":"JPMorgan Chase Bank"},"branch":{"type":"string","description":"Branch name","example":"Main Branch"},"address":{"description":"Bank address details","allOf":[{"$ref":"#/components/schemas/BankAddressDto"}]}},"required":["found","code","paymentNetwork"]},"CustomerAddressInputDto":{"type":"object","properties":{"addressLine1":{"type":"string","minLength":1,"maxLength":1024,"description":"Address line 1","example":"123 Main Street"},"addressLine2":{"type":"string","minLength":1,"maxLength":1024,"description":"Address line 2 (apartment, suite, etc.)","example":"Apt 4B"},"city":{"type":"string","minLength":1,"maxLength":256,"description":"City","example":"San Francisco"},"state":{"type":"string","minLength":1,"maxLength":256,"description":"State / Province","example":"CA"},"postalCode":{"type":"string","minLength":1,"maxLength":50,"description":"Postal code / ZIP code. May be empty for countries without a postal-code system, including the United Arab Emirates.","example":"94102"},"country":{"type":"string","description":"Country code (ISO 3166-2)","example":"US","minLength":2,"maxLength":2},"transliterated":{"description":"Transliterated address fields (Latin characters) for non-Latin addresses. Required when address contains non-Latin characters (Chinese, Arabic, Cyrillic, etc.).","allOf":[{"$ref":"#/components/schemas/TransliteratedAddressDto"}]},"label":{"enum":["REGISTERED","OPERATIONAL","US_REGISTERED","HEADQUARTERS","BILLING","SHIPPING","HOME","OFFICE"],"type":"string","description":"Address label/type","example":"HOME"},"isDefault":{"type":"boolean","description":"Whether this is the default/primary address","example":true}},"required":["addressLine1","city","postalCode","country"]},"OrganizationResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Organization ID"},"workosOrganizationId":{"type":"string","description":"WorkOS Organization ID"},"slug":{"type":"string","description":"Organization slug"},"name":{"type":"string","description":"Organization name"},"logoUrl":{"type":"string","nullable":true,"description":"Organization logo URL"},"domains":{"description":"Organization domains","type":"array","items":{"type":"string"}},"status":{"type":"string","description":"Organization status"},"allowProfilesOutsideOrganization":{"type":"boolean","description":"Allow profiles outside organization"},"enableMinimalRequirements":{"type":"boolean","description":"Whether reduced individual verification requirements are enabled"},"bankPartnerRoutesEnabled":{"type":"boolean","description":"Whether banking-partner route capabilities are enabled"},"customerId":{"type":"string","nullable":true,"description":"Customer ID for the organization"},"slackChannelId":{"type":"string","nullable":true,"description":"Slack channel ID bound to this organization"},"slackOpsChannelId":{"type":"string","nullable":true,"description":"Slack channel ID for ops/compliance notifications. Falls back to slackChannelId when not set."},"complianceEmail":{"type":"string","nullable":true,"description":"Email address for compliance communications"},"metadata":{"type":"object","description":"Organization metadata","additionalProperties":{}},"createdAt":{"type":"string","description":"Organization creation date","format":"date-time","example":"2026-01-15T10:00:00Z"},"updatedAt":{"type":"string","description":"Organization last update date","format":"date-time","example":"2026-01-15T10:00:00Z"}},"required":["id","workosOrganizationId","slug","name","logoUrl","domains","status","allowProfilesOutsideOrganization","enableMinimalRequirements","bankPartnerRoutesEnabled","customerId","metadata","createdAt","updatedAt"]},"DocumentUploadResponseDto":{"type":"object","properties":{"documentId":{"type":"string","description":"Document ID","example":"doc_abc123"},"uploadUrl":{"type":"string","description":"Signed URL for uploading the document","example":"https://storage.googleapis.com/..."},"expiresAt":{"format":"date-time","type":"string","description":"When the upload URL expires","example":"2026-01-01T12:00:00Z"},"existingDocumentId":{"type":"string","description":"If a duplicate was found, returns existing document ID instead","example":"doc_existing123"}},"required":["documentId","uploadUrl","expiresAt"]},"SelectOption":{"type":"object","properties":{"group":{"type":"string","nullable":true},"value":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"},"disabled":{"type":"boolean"},"isExclusive":{"type":"boolean"}},"required":["value","label"]},"FieldDependency":{"type":"object","properties":{"fieldPath":{"type":"string"},"value":{"nullable":true,"oneOf":[{"type":"boolean"},{"type":"string"},{"type":"number"},{"type":"array","items":{"type":"string"}}]},"hasValue":{"type":"boolean","nullable":true}},"required":["fieldPath"]},"RequiredField":{"type":"object","properties":{"fieldPath":{"type":"string"},"displayName":{"type":"string"},"dataType":{"type":"string"},"required":{"type":"boolean"},"validationPattern":{"type":"string","nullable":true},"validationMessage":{"type":"string","nullable":true},"allowedValues":{"nullable":true,"type":"array","items":{"type":"string"}},"exampleValue":{"type":"string","nullable":true},"uiTag":{"type":"string","nullable":true},"infoBox":{"type":"string","nullable":true},"options":{"nullable":true,"type":"array","items":{"$ref":"#/components/schemas/SelectOption"}},"isMultiSelect":{"type":"boolean","nullable":true},"stepId":{"type":"string","nullable":true},"subject":{"type":"string","nullable":true},"entityScope":{"type":"string","nullable":true,"description":"Stable customer or associated-entity ID targeted by this field"},"countryCode":{"type":"string","nullable":true,"description":"Country code used for country-specific input validation"},"allowNoTinPlaceholder":{"type":"boolean","description":"Whether an all-zeros placeholder satisfies this tax ID field (nationals or residents of countries that do not issue TINs)"},"sourcePackage":{"type":"string","nullable":true},"dependsOn":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/FieldDependency"}]},"minLength":{"type":"number","nullable":true},"maxLength":{"type":"number","nullable":true}},"required":["fieldPath","displayName","dataType","required","validationPattern","validationMessage","allowedValues"]},"RequiredDocument":{"type":"object","properties":{"requirementId":{"type":"string","nullable":true,"description":"Stable identifier that distinguishes custom document requirements"},"documentType":{"enum":["IDENTITY","PROOF_OF_ADDRESS","INVOICE","CONTRACT","BANK_STATEMENT","BUSINESS_LICENSE","ARTICLES_OF_INCORPORATION","ARTICLES_OF_ASSOCIATION","CERTIFICATE_OF_FORMATION","CERTIFICATE_OF_INCUMBENCY","OPERATING_AGREEMENT","PARTNERSHIP_AGREEMENT","OWNERSHIP_STRUCTURE","SHAREHOLDER_AGREEMENT","STOCK_CERTIFICATE","TAX_RETURN","FINANCIAL_STATEMENT","MARKETING_MATERIALS","DOMAIN_OWNERSHIP_PROOF","BUSINESS_PLAN","BILL_OF_LADING","AML_POLICY","AML_COMFORT_LETTER","FUNDS_FLOW_DIAGRAM","GOOD_STANDING_CERTIFICATE","TIN_VERIFICATION","MSB_LICENSE","DIRECTORS_REGISTRY","OWNERSHIP_CHART","PROOF_OF_SIGNATORY_AUTHORITY","PROOF_OF_SOURCE_OF_FUNDS","PROOF_OF_ENTITY_NAME_CHANGE","REMOTE_ADDRESS_ATTESTATION","E_SIGNATURE_CERTIFICATE","COMPLIANCE_NOTES","PROOF_OF_SOURCE_OF_WEALTH","TAX_EXEMPT_ENTITY_CONFIRMATION","OTHER"],"type":"string"},"documentSubtype":{"enum":["GOVERNMENT_ID_FRONT","GOVERNMENT_ID_BACK","SELFIE","UTILITY_BILL","LEASE_AGREEMENT"],"type":"string","nullable":true},"displayName":{"type":"string"},"required":{"type":"boolean"},"acceptedFormats":{"type":"array","items":{"type":"string"}},"requiredSides":{"type":"array","items":{"type":"string"}},"maxSizeBytes":{"type":"number"},"infoBox":{"type":"string","nullable":true},"stepId":{"type":"string"},"subject":{"type":"string","nullable":true},"entityScope":{"type":"string","nullable":true},"documentFieldPath":{"type":"string","nullable":true,"description":"Verification field path for document ID writeback (e.g. businessData.associatedEntities[0].governmentId.frontImage)"},"minimumFileCount":{"type":"number","nullable":true},"sourcePackage":{"type":"string","nullable":true},"dependsOn":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/FieldDependency"}]}},"required":["documentType","displayName","required","acceptedFormats","requiredSides","maxSizeBytes","stepId"]},"TreasuryLiquidityCreditLineDto":{"type":"object","properties":{"creditLimit":{"type":"string","description":"Credit limit in minor units"},"remainingCredit":{"type":"string","description":"Remaining available credit in minor units"},"borrowedAmount":{"type":"string","description":"Your outstanding drawn principal in minor units. Fees are quoted at payback and are not included."},"transactionsOpen":{"type":"number","description":"Your positions awaiting repayment"},"maximumDrawAmount":{"type":"string","description":"Maximum amount allowed for a single draw, minor units"},"fundingFeeBpsPerHour":{"type":"number","description":"Funding fee in basis points per hour"},"feeCapHours":{"type":"number","description":"Fee accrual cap in hours"},"asOf":{"type":"string","description":"When this snapshot was fetched (ISO)"}},"required":["creditLimit","remainingCredit","borrowedAmount","transactionsOpen","maximumDrawAmount","fundingFeeBpsPerHour","feeCapHours","asOf"]},"TreasuryLiquidityPayoutTreasuryDto":{"type":"object","properties":{"id":{"type":"string","description":"Treasury id","example":"trs_abc123"},"name":{"type":"string","nullable":true,"description":"Treasury display name"}},"required":["id","name"]},"TreasuryLiquidityFacilityDto":{"type":"object","properties":{"currency":{"type":"string","example":"USDC"},"network":{"type":"string","example":"SOLANA"},"creditLine":{"$ref":"#/components/schemas/TreasuryLiquidityCreditLineDto"},"payoutTreasuryId":{"type":"string","nullable":true,"description":"Configured Solana payout treasury id. Null when no Solana treasury exists.","example":"trs_abc123"},"payoutTreasuries":{"description":"Org-owned Solana treasuries eligible as payout destinations","type":"array","items":{"$ref":"#/components/schemas/TreasuryLiquidityPayoutTreasuryDto"}}},"required":["currency","network","creditLine","payoutTreasuryId","payoutTreasuries"]},"UpdateTreasuryLiquidityFacilityDto":{"type":"object","properties":{"payoutTreasuryId":{"type":"string","pattern":"^trs_[a-z0-9]+$","description":"Solana payout treasury id that should receive credit draws","example":"trs_abc123"}},"required":["payoutTreasuryId"]},"TreasuryLiquidityPositionDto":{"type":"object","properties":{"id":{"type":"string"},"drawnAmount":{"type":"string","description":"Principal drawn, minor units"},"outstandingAmount":{"type":"string","description":"Outstanding principal, minor units"},"feePaid":{"type":"string","nullable":true,"description":"Fee paid after repayment, minor units"},"status":{"enum":["PENDING","OPEN","REPAYING","REPAY_FAILED","CLOSED","FAILED"],"type":"string"},"destinationLabel":{"type":"string","description":"Human-readable destination label (no account ids)"},"drawnAt":{"type":"string","nullable":true,"description":"When the draw opened (ISO), null if pending"},"closedAt":{"type":"string","nullable":true,"description":"When the position closed (ISO)"}},"required":["id","drawnAmount","outstandingAmount","feePaid","status","destinationLabel","drawnAt","closedAt"]},"ListTreasuryLiquidityPositionsResponseDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/TreasuryLiquidityPositionDto"}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}},"required":["data","total","limit","offset"]},"DrawTreasuryLiquidityDto":{"type":"object","properties":{"amount":{"type":"string","pattern":"^[1-9]\\d*$","description":"Amount to draw in USDC minor units (6dp)","example":"1000000000"}},"required":["amount"]},"DrawTreasuryLiquidityResponseDto":{"type":"object","properties":{"position":{"$ref":"#/components/schemas/TreasuryLiquidityPositionDto"}},"required":["position"]},"PaybackTreasuryLiquidityResponseDto":{"type":"object","properties":{"position":{"$ref":"#/components/schemas/TreasuryLiquidityPositionDto"},"workflowId":{"type":"string","description":"Idempotent repay workflow id"}},"required":["position","workflowId"]},"IndividualAddressInputDto":{"type":"object","properties":{"addressLine1":{"type":"string","minLength":1,"maxLength":1024,"description":"Address line 1","example":"123 Main Street"},"addressLine2":{"type":"string","minLength":1,"maxLength":1024,"description":"Address line 2 (apartment, suite, etc.)","example":"Apt 4B"},"city":{"type":"string","minLength":1,"maxLength":256,"description":"City","example":"San Francisco"},"state":{"type":"string","minLength":1,"maxLength":256,"description":"State / Province","example":"CA"},"postalCode":{"type":"string","minLength":1,"maxLength":50,"description":"Postal code / ZIP code. May be empty for countries without a postal-code system, including the United Arab Emirates.","example":"94102"},"country":{"type":"string","description":"Country code (ISO 3166-2)","example":"US","minLength":2,"maxLength":2},"transliterated":{"description":"Transliterated address fields (Latin characters) for non-Latin addresses. Required when address contains non-Latin characters (Chinese, Arabic, Cyrillic, etc.).","allOf":[{"$ref":"#/components/schemas/TransliteratedAddressDto"}]}},"required":["addressLine1","city","postalCode","country"]},"GovernmentIdDto":{"type":"object","properties":{"type":{"enum":["PASSPORT","DRIVERS_LICENSE","NATIONAL_ID","MILITARY_ID","PERMANENT_RESIDENCY_ID","STATE_OR_PROVINCIAL_ID"],"type":"string","description":"Type of government-issued ID","example":"PASSPORT"},"countryCode":{"type":"string","description":"Country of issuance (ISO 3166-2)","example":"US"},"number":{"type":"string","minLength":1,"maxLength":50,"description":"ID number","example":"A12345678"},"issuanceDate":{"type":"string","description":"Issuance date (YYYY-MM-DD)","example":"2020-01-15"},"expirationDate":{"type":"string","nullable":true,"description":"Expiration date (YYYY-MM-DD), or null for non-expiring IDs","example":"2030-01-15"},"frontImage":{"type":"string","description":"Front image document ID reference (`doc_xxx`). Upload the file with `POST /documents`, confirm it, then pass the resulting document ID here.","example":"doc_abc123"},"backImage":{"type":"string","description":"Back image document ID reference (`doc_xxx`). Required for non-passport IDs."},"selfie":{"type":"string","description":"Selfie document ID reference (`doc_xxx`). Required for individual customer verification. Upload the file with `POST /documents`, confirm it, then pass the resulting document ID here."}},"required":["type","countryCode","number","issuanceDate","frontImage"]},"DocumentUploadDto":{"type":"object","properties":{"requirementId":{"type":"string","description":"Stable identifier for the custom document requirement this upload satisfies"},"type":{"enum":["IDENTITY","PROOF_OF_ADDRESS","INVOICE","CONTRACT","BANK_STATEMENT","BUSINESS_LICENSE","ARTICLES_OF_INCORPORATION","ARTICLES_OF_ASSOCIATION","CERTIFICATE_OF_FORMATION","CERTIFICATE_OF_INCUMBENCY","OPERATING_AGREEMENT","PARTNERSHIP_AGREEMENT","OWNERSHIP_STRUCTURE","SHAREHOLDER_AGREEMENT","STOCK_CERTIFICATE","TAX_RETURN","FINANCIAL_STATEMENT","MARKETING_MATERIALS","DOMAIN_OWNERSHIP_PROOF","BUSINESS_PLAN","BILL_OF_LADING","AML_POLICY","AML_COMFORT_LETTER","FUNDS_FLOW_DIAGRAM","GOOD_STANDING_CERTIFICATE","TIN_VERIFICATION","MSB_LICENSE","DIRECTORS_REGISTRY","OWNERSHIP_CHART","PROOF_OF_SIGNATORY_AUTHORITY","PROOF_OF_SOURCE_OF_FUNDS","PROOF_OF_ENTITY_NAME_CHANGE","REMOTE_ADDRESS_ATTESTATION","E_SIGNATURE_CERTIFICATE","COMPLIANCE_NOTES","PROOF_OF_SOURCE_OF_WEALTH","TAX_EXEMPT_ENTITY_CONFIRMATION","OTHER"],"type":"string","description":"General document category. Optional for context-specific uploads where the field already implies the document type.","example":"PROOF_OF_ADDRESS"},"subtype":{"enum":["GOVERNMENT_ID_FRONT","GOVERNMENT_ID_BACK","SELFIE","UTILITY_BILL","LEASE_AGREEMENT"],"type":"string","description":"Specific document type. Optional for generic uploads when the subtype is not material to processing.","example":"UTILITY_BILL"},"description":{"type":"string","description":"Description of the document","example":"Passport issued in 2020"},"remarks":{"type":"string","minLength":1,"maxLength":1000,"description":"Free-form remarks or notes about the document","example":"Uploaded to support proof of business address"},"file":{"type":"string","description":"Document ID reference (`doc_xxx`) created via the document upload flow. Upload the file with `POST /documents`, confirm it, then pass the resulting document ID here.","example":"doc_abc123"}},"required":["file"]},"VerificationAssociatedEntityGovernmentIdDto":{"type":"object","properties":{"type":{"enum":["PASSPORT","DRIVERS_LICENSE","NATIONAL_ID","MILITARY_ID","PERMANENT_RESIDENCY_ID","STATE_OR_PROVINCIAL_ID"],"type":"string"},"countryCode":{"type":"string","description":"Country of issuance (ISO 3166-1 alpha-2)"},"number":{"type":"string","minLength":1,"maxLength":50,"description":"ID number"},"issuanceDate":{"type":"string","description":"Issuance date (YYYY-MM-DD)"},"expirationDate":{"type":"string","nullable":true,"description":"Expiration date (YYYY-MM-DD), or null for non-expiring IDs"},"frontImage":{"type":"string","description":"Front image document ID reference"},"backImage":{"type":"string","description":"Back image document ID reference"},"selfie":{"type":"string","description":"Selfie document ID reference"}}},"ProofOfAddressDto":{"type":"object","properties":{"type":{"enum":["UTILITY_BILL","BANK_STATEMENT","LEASE_AGREEMENT","GOVERNMENT_LETTER","OTHER"],"type":"string","description":"Type of proof of address document","example":"UTILITY_BILL"},"countryCode":{"enum":["AD","AE","AF","AG","AI","AL","AM","AO","AR","AS","AT","AU","AW","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BR","BS","BT","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","EU","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HN","HR","HT","HU","ID","IE","IL","IM","IN","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SY","SZ","TC","TD","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","ZA","ZM","ZW"],"type":"string","description":"Country code (ISO 3166-2)","example":"US"},"issueDate":{"type":"string","description":"Issue date of the document (YYYY-MM-DD). Must be within the last 90 days.","example":"2026-10-01"},"file":{"type":"string","description":"Proof of address document ID reference (`doc_xxx`). Upload the file with `POST /documents`, confirm it, then pass the resulting document ID here. Accepted formats for the uploaded file are PDF, JPEG, PNG, and WEBP.","example":"doc_abc123"}},"required":["type","countryCode","issueDate","file"]},"VerificationAssociatedEntityDto":{"type":"object","properties":{"associatedEntityId":{"type":"string","description":"Stable associated entity identifier","example":"asp_abc123"},"entityType":{"enum":["INDIVIDUAL","BUSINESS"],"type":"string","description":"Type of entity - INDIVIDUAL (person) or BUSINESS (company)","example":"BUSINESS","default":"INDIVIDUAL"},"parentEntityId":{"type":"string","description":"Parent entity ID for nested ownership. Use the associated business entity ID returned from the associated entity endpoints when linking a child owner beneath an intermediate business owner.","example":"asp_abc123"},"firstName":{"type":"string","minLength":1,"maxLength":1024,"description":"First name (required for INDIVIDUAL)"},"lastName":{"type":"string","minLength":2,"maxLength":1024,"description":"Last name (required for INDIVIDUAL)"},"middleName":{"type":"string","minLength":1,"maxLength":1024,"description":"Middle name"},"nickname":{"type":"string","minLength":1,"maxLength":1024,"description":"Nickname"},"dateOfBirth":{"type":"string","description":"Date of birth (YYYY-MM-DD) - required for INDIVIDUAL","example":"1990-01-15"},"taxIdentificationNumber":{"type":"string","minLength":1,"maxLength":50,"description":"Tax identification number (e.g., SSN for individuals, EIN for businesses). Required for US nationals or US residents and validated against country-specific formats when provided. Accepts NOT_APPLICABLE when no tax ID is available, except for US nationals or residents, who must provide a real SSN/ITIN. Nationals or residents of countries that do not issue personal tax IDs (e.g. the Cayman Islands) may record an all-zeros placeholder. If the value does not match the expected format, prefix with OVERRIDE:. These should be used sparingly — missing or overridden tax IDs may trigger additional customer due diligence."},"taxIdentificationDocumentType":{"type":"string","minLength":1,"maxLength":50,"description":"Tax identification document type when the issuing country supports multiple tax ID types.","example":"UTR"},"transliteratedFirstName":{"type":"string","minLength":1,"maxLength":256,"description":"Transliterated first name"},"transliteratedMiddleName":{"type":"string","minLength":1,"maxLength":256,"description":"Transliterated middle name"},"transliteratedLastName":{"type":"string","minLength":1,"maxLength":256,"description":"Transliterated last name"},"businessName":{"type":"string","minLength":1,"maxLength":1024,"description":"Business name (required for BUSINESS)"},"registrationNumber":{"type":"string","minLength":1,"maxLength":256,"description":"Business registration number"},"dateOfIncorporation":{"type":"string","description":"Date of incorporation (YYYY-MM-DD)","example":"2020-01-15"},"businessAddress":{"description":"Business address","allOf":[{"$ref":"#/components/schemas/AddressDto"}]},"countryCode":{"enum":["AD","AE","AF","AG","AI","AL","AM","AO","AR","AS","AT","AU","AW","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BR","BS","BT","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","EU","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HN","HR","HT","HU","ID","IE","IL","IM","IN","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SY","SZ","TC","TD","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","ZA","ZM","ZW"],"type":"string","description":"Country code (ISO 3166-1 alpha-2). Nationality for individuals, country of incorporation for businesses.","example":"US"},"email":{"type":"string","format":"email","minLength":1,"maxLength":1024,"description":"Email address. Required when generateVerificationLink is true."},"phone":{"type":"string","minLength":1,"maxLength":1024,"description":"Phone number"},"address":{"description":"Address. Use the nested transliterated field for Latin character versions of non-Latin addresses.","allOf":[{"$ref":"#/components/schemas/AddressDto"}]},"hasOwnership":{"type":"boolean","description":"Whether this entity is an owner. For an individual with indirect ownership whose percentage is not quantified, set this to true to identify them as a beneficial owner."},"hasControl":{"type":"boolean","description":"Has significant control"},"ownershipPercentage":{"type":"number","minimum":0,"maximum":100,"description":"Ownership percentage"},"isSigner":{"type":"boolean","description":"Has signing authority"},"isDirector":{"type":"boolean","description":"Is a director"},"role":{"enum":["CEO","CFO","COO","PRESIDENT","GENERAL_COUNSEL","MANAGING_MEMBER","TREASURER","OTHER"],"type":"string","description":"Structured role at the company."},"governmentId":{"description":"Government ID (for INDIVIDUAL)","allOf":[{"$ref":"#/components/schemas/VerificationAssociatedEntityGovernmentIdDto"}]},"proofOfAddress":{"description":"Proof of address document (for INDIVIDUAL). Required for recipients using the SWIFT overlay, not for the SWIFT transfer itself. Acceptable documents: utility bill, bank statement, or lease agreement dated within the last 3 months.","allOf":[{"$ref":"#/components/schemas/ProofOfAddressDto"}]},"supportingDocuments":{"description":"Supporting documents","type":"array","items":{"$ref":"#/components/schemas/DocumentUploadDto"}},"attestedOwnershipStructureAt":{"type":"string","description":"Timestamp when ownership structure was attested","example":"2026-06-01T10:45:05Z"},"relationshipDate":{"type":"string","description":"Date when the relationship with this entity was established (YYYY-MM-DD). For individuals, this is when they became an owner/director. For businesses, this is when the ownership structure was established.","example":"2020-01-15"},"generateVerificationLink":{"type":"boolean","description":"When true, generates a verification link for this UBO to complete their KYC. The link will be returned in the response. Requires entityType to be INDIVIDUAL, firstName, lastName, and email to be provided.","example":true},"sendInvite":{"type":"boolean","description":"When true (and generateVerificationLink is also true), sends an email invitation to the UBO to complete their KYC verification. The email includes the verification link and expiration details.","example":true}},"required":["countryCode","hasOwnership","hasControl"]},"CommunicationPreferencesDto":{"type":"object","properties":{"email":{"type":"boolean","description":"Allow email communications","example":true},"sms":{"type":"boolean","description":"Allow SMS communications","example":true},"phone":{"type":"boolean","description":"Allow phone communications","example":true}}},"NotificationPreferencesDto":{"type":"object","properties":{"invoices":{"type":"boolean","description":"Send invoice notifications","example":true},"payments":{"type":"boolean","description":"Send payment notifications","example":true},"statements":{"type":"boolean","description":"Send statement notifications","example":true}}},"CustomerPreferencesDto":{"type":"object","properties":{"communicationPreferences":{"description":"Communication preferences","allOf":[{"$ref":"#/components/schemas/CommunicationPreferencesDto"}]},"language":{"type":"string","minLength":1,"maxLength":5,"description":"Language code (ISO 639-1)","example":"en"},"timezone":{"type":"string","minLength":1,"maxLength":256,"description":"Timezone (IANA timezone identifier)","example":"America/New_York"},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"Currency code (ISO 4217)","example":"USD"},"notifications":{"description":"Notification preferences","allOf":[{"$ref":"#/components/schemas/NotificationPreferencesDto"}]}}},"CustomerCapabilityStateDto":{"type":"object","properties":{"capability":{"enum":["USD_ACH_PAYIN","USD_ACH_PAYOUT","USD_WIRE_PAYIN","USD_WIRE_PAYOUT","USD_BALANCE","USD_YIELD","SWIFT_PAYIN","SWIFT_PAYOUT","STABLECOIN_PAYIN","STABLECOIN_PAYOUT","STABLECOIN_SWAPS","AED_FX_PAYOUT","AUD_FX_PAYOUT","BHD_FX_PAYOUT","BOB_FX_PAYOUT","BRL_FX_PAYOUT","CLP_FX_PAYOUT","CNY_FX_PAYOUT","COP_FX_PAYOUT","DOP_FX_PAYOUT","EGP_FX_PAYOUT","EUR_FX_PAYOUT","GBP_FX_PAYOUT","HKD_FX_PAYOUT","IDR_FX_PAYOUT","INR_FX_PAYOUT","JPY_FX_PAYOUT","KRW_FX_PAYOUT","KWD_FX_PAYOUT","MXN_FX_PAYOUT","MYR_FX_PAYOUT","PEN_FX_PAYOUT","PHP_FX_PAYOUT","PYG_FX_PAYOUT","QAR_FX_PAYOUT","SAR_FX_PAYOUT","SGD_FX_PAYOUT","THB_FX_PAYOUT","TRY_FX_PAYOUT","TWD_FX_PAYOUT","USD_FX_PAYOUT","VND_FX_PAYOUT"],"type":"string","example":"USD_WIRE_PAYIN"},"status":{"enum":["READY","IN_REVIEW","UNAVAILABLE"],"type":"string","example":"READY"}},"required":["capability","status"]},"CustomerCapabilitiesResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Customer ID","example":"cus_abc123"},"capabilities":{"type":"array","items":{"$ref":"#/components/schemas/CustomerCapabilityStateDto"}}},"required":["id","capabilities"]},"CreateIndividualCustomerDto":{"type":"object","properties":{"customerName":{"type":"string","description":"Customer name"},"email":{"type":"string","format":"email","description":"Customer email address. For business customers, use an email on the company domain when available; personal email domains such as Gmail may require additional due diligence."},"countryCode":{"type":"string","description":"Country code (ISO 3166-2)","enum":["AD","AE","AF","AG","AI","AL","AM","AO","AR","AS","AT","AU","AW","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BR","BS","BT","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","EU","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HN","HR","HT","HU","ID","IE","IL","IM","IN","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SY","SZ","TC","TD","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","ZA","ZM","ZW"]},"requestedCapabilities":{"type":"array","items":{"type":"string","enum":["USD_ACH_PAYIN","USD_ACH_PAYOUT","USD_WIRE_PAYIN","USD_WIRE_PAYOUT","USD_BALANCE","USD_YIELD","SWIFT_PAYIN","SWIFT_PAYOUT","STABLECOIN_PAYIN","STABLECOIN_PAYOUT","STABLECOIN_SWAPS","AED_FX_PAYOUT","AUD_FX_PAYOUT","BHD_FX_PAYOUT","BOB_FX_PAYOUT","BRL_FX_PAYOUT","CLP_FX_PAYOUT","CNY_FX_PAYOUT","COP_FX_PAYOUT","DOP_FX_PAYOUT","EGP_FX_PAYOUT","EUR_FX_PAYOUT","GBP_FX_PAYOUT","HKD_FX_PAYOUT","IDR_FX_PAYOUT","INR_FX_PAYOUT","JPY_FX_PAYOUT","KRW_FX_PAYOUT","KWD_FX_PAYOUT","MXN_FX_PAYOUT","MYR_FX_PAYOUT","PEN_FX_PAYOUT","PHP_FX_PAYOUT","PYG_FX_PAYOUT","QAR_FX_PAYOUT","SAR_FX_PAYOUT","SGD_FX_PAYOUT","THB_FX_PAYOUT","TRY_FX_PAYOUT","TWD_FX_PAYOUT","USD_FX_PAYOUT","VND_FX_PAYOUT"]},"description":"Capabilities requested by the customer"},"firstName":{"type":"string","minLength":1,"maxLength":1024,"description":"First name","example":"John"},"lastName":{"type":"string","minLength":1,"maxLength":1024,"description":"Last name","example":"Smith"},"middleName":{"type":"string","minLength":1,"maxLength":1024,"description":"Middle name","example":"Michael"},"transliteratedFirstName":{"type":"string","minLength":1,"maxLength":256,"description":"Transliterated first name (Latin characters).\n\nRequired when firstName contains non-Latin characters (Chinese, Arabic, Cyrillic, etc.).","example":"Li Ming"},"transliteratedMiddleName":{"type":"string","minLength":1,"maxLength":256,"description":"Transliterated middle name (Latin characters).\n\nRequired when middleName contains non-Latin characters.","example":"Wen"},"transliteratedLastName":{"type":"string","minLength":1,"maxLength":256,"description":"Transliterated last name (Latin characters).\n\nRequired when lastName contains non-Latin characters.","example":"Wang"},"dateOfBirth":{"type":"string","description":"Date of birth in ISO 8601 format (YYYY-MM-DD)","example":"1990-01-15"},"nationality":{"type":"string","description":"Nationality (ISO 3166-2)","example":"US"},"phone":{"type":"string","minLength":1,"maxLength":16,"description":"Phone number in E.164 format","example":"+14155551234"},"occupation":{"type":"string","description":"Occupation code","example":"151252"},"employmentStatus":{"enum":["EMPLOYED","SELF_EMPLOYED","UNEMPLOYED","STUDENT","RETIRED","HOMEMAKER"],"type":"string","description":"Employment status"},"sourceOfIncome":{"enum":["COMPANY_FUNDS","ECOMMERCE_RESELLER","GAMBLING_PROCEEDS","GIFTS","GOVERNMENT_BENEFITS","INHERITANCE","INVESTMENTS_LOANS","PENSION_RETIREMENT","SALARY","SALE_OF_ASSETS_REAL_ESTATE","SAVINGS","SOMEONE_ELSES_FUNDS"],"type":"string","description":"Source of income","example":"SALARY"},"sourceOfFundsDescription":{"type":"string","description":"Source of funds description"},"enableMinimalRequirements":{"type":"boolean","description":"Use the organization-enabled minimal verification requirements for this customer"}},"required":["customerName"]},"CreateBusinessCustomerDto":{"type":"object","properties":{"customerName":{"type":"string","description":"Customer name"},"email":{"type":"string","format":"email","minLength":1,"maxLength":255,"description":"Business email address. Use an email on the company domain when available; personal email domains such as Gmail may require additional due diligence.","example":"contact@acme.com"},"countryCode":{"type":"string","description":"Country code (ISO 3166-2)","enum":["AD","AE","AF","AG","AI","AL","AM","AO","AR","AS","AT","AU","AW","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BR","BS","BT","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","EU","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HN","HR","HT","HU","ID","IE","IL","IM","IN","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SY","SZ","TC","TD","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","ZA","ZM","ZW"]},"requestedCapabilities":{"type":"array","items":{"type":"string","enum":["USD_ACH_PAYIN","USD_ACH_PAYOUT","USD_WIRE_PAYIN","USD_WIRE_PAYOUT","USD_BALANCE","USD_YIELD","SWIFT_PAYIN","SWIFT_PAYOUT","STABLECOIN_PAYIN","STABLECOIN_PAYOUT","STABLECOIN_SWAPS","AED_FX_PAYOUT","AUD_FX_PAYOUT","BHD_FX_PAYOUT","BOB_FX_PAYOUT","BRL_FX_PAYOUT","CLP_FX_PAYOUT","CNY_FX_PAYOUT","COP_FX_PAYOUT","DOP_FX_PAYOUT","EGP_FX_PAYOUT","EUR_FX_PAYOUT","GBP_FX_PAYOUT","HKD_FX_PAYOUT","IDR_FX_PAYOUT","INR_FX_PAYOUT","JPY_FX_PAYOUT","KRW_FX_PAYOUT","KWD_FX_PAYOUT","MXN_FX_PAYOUT","MYR_FX_PAYOUT","PEN_FX_PAYOUT","PHP_FX_PAYOUT","PYG_FX_PAYOUT","QAR_FX_PAYOUT","SAR_FX_PAYOUT","SGD_FX_PAYOUT","THB_FX_PAYOUT","TRY_FX_PAYOUT","TWD_FX_PAYOUT","USD_FX_PAYOUT","VND_FX_PAYOUT"]},"description":"Capabilities requested by the customer"},"businessName":{"type":"string","minLength":1,"maxLength":1024,"description":"Legal business name","example":"Acme Corporation"},"businessType":{"enum":["CORPORATION","LLC","PARTNERSHIP","GEN_PARTNERSHIP","LLP","LP","SOLE_PROPRIETORSHIP","NON_PROFIT","TRUST","COOPERATIVE","PRIVATE_LIMITED_COMPANY","SPV","JOINT_VENTURE"],"type":"string","description":"Business legal structure","example":"LLC"},"taxIdentificationNumber":{"type":"string","minLength":1,"maxLength":50,"description":"Tax identification number issued by the tax authority (e.g., EIN in the US, VAT number in EU). This is different from the business registration number.\n\nValidated against country-specific formats when countryCode is provided. Accepts NOT_APPLICABLE when no tax ID is available. If the value does not match the expected format, prefix with OVERRIDE: (e.g. OVERRIDE:12-3456789) to store it as-is. These should be used sparingly; missing or overridden tax IDs may trigger additional customer due diligence.","example":"12-3456789"},"website":{"type":"string","format":"uri","minLength":1,"maxLength":512,"description":"Business website URL","example":"https://acme.com"},"industry":{"type":"string","minLength":6,"maxLength":6,"pattern":"^\\d{6}$","description":"6-digit NAICS industry classification code","example":"522320"},"isCrypto":{"type":"boolean","description":"Set true if the business operates in crypto or digital assets.","example":false},"isRemoteCompany":{"type":"boolean","description":"Set true when the business operates remotely from an owner or director address.","example":false},"industryCryptoSubtype":{"enum":["PROTOCOL","EXCHANGE","INVESTMENT","LENDER","MARKET_MAKER","SAAS","MINER"],"type":"string","description":"Crypto-specific industry subtype. Required when isCrypto is true."},"yearEstablished":{"type":"number","minimum":1800,"description":"Year the business was established","example":2010},"numberOfEmployees":{"type":"number","minimum":0,"description":"Number of employees","example":50},"tradeName":{"type":"string","minLength":0,"maxLength":1024,"description":"Business trade name (DBA). Separate multiple names with semicolons.","example":"Acme Services; Acme Pay"},"description":{"type":"string","minLength":20,"maxLength":2048,"description":"Business description","example":"Cloud software services provider"},"phone":{"type":"string","minLength":1,"maxLength":16,"description":"Business phone number in E.164 format","example":"+14155551234"},"registrationDate":{"type":"string","description":"Business registration date in ISO 8601 format (YYYY-MM-DD)","example":"2020-01-15"},"registrationNumber":{"type":"string","minLength":1,"maxLength":50,"description":"Business registration number issued by the state/authority when the business was registered (e.g., LLC filing number, corporation charter number). This is different from the tax identification number.","example":"123456789"},"hasMaterialIntermediaryOwnership":{"type":"boolean","description":"Whether the business has material intermediary ownership (25%+ owned by another entity)","example":false},"accountPurpose":{"enum":["PAYROLL","VENDOR_PAYMENTS","TREASURY","OPERATIONS","CAPITAL_DEPLOYMENT","CROSS_BORDER_PAYMENTS","STABLECOIN_CONVERSION","ECOMMERCE","OTHER"],"type":"string","description":"Purpose of the account","example":"OPERATIONS"},"accountPurposeExplanation":{"type":"string","minLength":1,"maxLength":2048,"description":"Detailed explanation of account purpose","example":"Operating expenses and customer settlements"},"sourceOfFunds":{"enum":["BUSINESS_REVENUE","INVESTMENT","OWNER_CAPITAL","LOAN","GRANTS","EQUITY","INHERITANCE","GIFT","OTHER"],"type":"string","description":"Source of funds for the business","example":"BUSINESS_REVENUE"},"sourceOfFundsDescription":{"type":"string","minLength":1,"maxLength":2048,"description":"Detailed description of source of funds","example":"Revenue from software services"},"estimatedAnnualRevenueUsd":{"enum":["PRE_REVENUE","LESS_THAN_10K","10K_TO_50K","50K_TO_100K","100K_TO_500K","500K_TO_1M","1M_TO_5M","5M_TO_10M","10M_TO_50M","50M_TO_250M","MORE_THAN_250M","LESS_THAN_100K"],"type":"string","description":"Estimated annual revenue in USD"},"expectedMonthlyPaymentsUsd":{"type":"number","minimum":0,"description":"Expected monthly fiat payment volume in USD-equivalent","example":50000},"primaryTargetMarket":{"enum":["RETAIL","COMMERCIAL","GOVERNMENT","OTHER"],"type":"string","description":"Primary target market. RETAIL = B2C (consumers), COMMERCIAL = B2B (businesses), GOVERNMENT = B2G (government entities), OTHER = another market not covered by the standard options.","example":"COMMERCIAL"},"operatesInProhibitedCountries":{"type":"boolean","description":"Whether the business operates in prohibited countries","example":false},"highRiskActivities":{"type":"array","items":{"type":"string","enum":["MONEY_SERVICES","LENDING_BANKING","OTC_FX_CRYPTO_BROKERAGE","HOLD_CLIENT_FUNDS","INVESTMENT_SERVICES","SAFE_DEPOSIT_BOX","PRECIOUS_METALS_STONES_JEWELRY","NICOTINE_TOBACCO","MARIJUANA","PHARMACEUTICALS","THIRD_PARTY_PAYMENT_PROCESSING","ADULT_ENTERTAINMENT","WEAPONS_FIREARMS_EXPLOSIVES","GAMBLING"]},"description":"List of high-risk activities the business engages in","example":["MONEY_SERVICES"]},"highRiskActivitiesExplanation":{"type":"string","minLength":1,"maxLength":2048,"description":"Explanation of high-risk activities","example":"Cryptocurrency exchange services"},"signedAgreementId":{"type":"string","minLength":1,"maxLength":256,"description":"Signed agreement ID","example":"tos_abc123"}},"required":["customerName"]},"EnhancedDiligenceComplianceDto":{"type":"object","properties":{"requiredFields":{"type":"array","items":{"$ref":"#/components/schemas/RequiredField"}},"requiredDocuments":{"type":"array","items":{"$ref":"#/components/schemas/RequiredDocument"}},"missingRequirements":{"type":"array","items":{"$ref":"#/components/schemas/MissingComplianceRequirementDto"}}},"required":["requiredFields","requiredDocuments","missingRequirements"]},"CustomerComplianceResponseDto":{"type":"object","properties":{"customerId":{"type":"string","description":"Customer ID","example":"cus_abc123"},"updatedAt":{"type":"string","description":"Last updated timestamp","example":"2026-01-15T10:30:00Z"},"missingRequirements":{"description":"Merged list of missing fields and documents required for compliance","example":[{"requirementType":"FIELD","key":"businessData.legalName","displayName":"Legal Name"},{"requirementType":"DOCUMENT","key":"compliance.aml_policy","displayName":"AML / BSA Policy"}],"type":"array","items":{"$ref":"#/components/schemas/MissingComplianceRequirementDto"}},"enhancedDiligence":{"$ref":"#/components/schemas/EnhancedDiligenceComplianceDto"},"validationErrors":{"description":"Validation errors that would block submission (e.g. ownership requirements)","example":["At least one beneficial owner must be identified."],"type":"array","items":{"type":"string"}}},"required":["customerId","updatedAt","missingRequirements","enhancedDiligence","validationErrors"]},"UpdateCustomerDto":{"type":"object","properties":{"email":{"type":"string","format":"email","description":"Customer email address"},"countryCode":{"type":"string","description":"Country code (ISO 3166-2)","enum":["AD","AE","AF","AG","AI","AL","AM","AO","AR","AS","AT","AU","AW","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BR","BS","BT","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","EU","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HN","HR","HT","HU","ID","IE","IL","IM","IN","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SY","SZ","TC","TD","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","ZA","ZM","ZW"]},"requestedCapabilities":{"type":"array","items":{"type":"string","enum":["USD_ACH_PAYIN","USD_ACH_PAYOUT","USD_WIRE_PAYIN","USD_WIRE_PAYOUT","USD_BALANCE","USD_YIELD","SWIFT_PAYIN","SWIFT_PAYOUT","STABLECOIN_PAYIN","STABLECOIN_PAYOUT","STABLECOIN_SWAPS","AED_FX_PAYOUT","AUD_FX_PAYOUT","BHD_FX_PAYOUT","BOB_FX_PAYOUT","BRL_FX_PAYOUT","CLP_FX_PAYOUT","CNY_FX_PAYOUT","COP_FX_PAYOUT","DOP_FX_PAYOUT","EGP_FX_PAYOUT","EUR_FX_PAYOUT","GBP_FX_PAYOUT","HKD_FX_PAYOUT","IDR_FX_PAYOUT","INR_FX_PAYOUT","JPY_FX_PAYOUT","KRW_FX_PAYOUT","KWD_FX_PAYOUT","MXN_FX_PAYOUT","MYR_FX_PAYOUT","PEN_FX_PAYOUT","PHP_FX_PAYOUT","PYG_FX_PAYOUT","QAR_FX_PAYOUT","SAR_FX_PAYOUT","SGD_FX_PAYOUT","THB_FX_PAYOUT","TRY_FX_PAYOUT","TWD_FX_PAYOUT","USD_FX_PAYOUT","VND_FX_PAYOUT"]},"description":"Capabilities requested by the customer"},"customerDetails":{"description":"Customer details with transliteration support.\n\nFor INDIVIDUAL customers:\n- firstName, lastName, middleName\n- transliteratedFirstName, transliteratedMiddleName, transliteratedLastName\n- dateOfBirth, phone, occupation, sourceOfIncome\n\nFor BUSINESS customers:\n- businessName, tradeName, businessType, taxIdentificationNumber\n- website, industry, email, phone\n\nVerification and EDD-specific fields are submitted separately through the verification endpoints.","oneOf":[{"$ref":"#/components/schemas/IndividualDetailsDto"},{"$ref":"#/components/schemas/BusinessDetailsDto"}]},"addresses":{"description":"Customer addresses.\n\nEach address must include addressLine1, city, postalCode, and country.","type":"array","items":{"$ref":"#/components/schemas/CustomerAddressInputDto"}},"preferences":{"description":"Customer preferences and settings","allOf":[{"$ref":"#/components/schemas/CustomerPreferencesDto"}]}}},"SubmitIndividualCustomerVerificationDto":{"type":"object","properties":{"metadata":{"type":"object","description":"Additional metadata","example":{"source":"mobile_app","referrer":"partner_xyz"},"additionalProperties":true},"hasAgreedToTos":{"type":"boolean","description":"Set to true to indicate the customer has agreed to the Terms of Service and Privacy Policy. When true, a TOS acceptance record will be automatically created. This is a convenience for API-based integrations - alternatively, you can use the /v1/tos endpoints to create a TOS acceptance record and pass the ID in metadata.infiniteTosAcceptanceId.","example":true},"firstName":{"type":"string","minLength":1,"maxLength":100,"description":"First name","example":"John"},"middleName":{"type":"string","minLength":1,"maxLength":100,"description":"Middle name","example":"Michael"},"nickname":{"type":"string","minLength":1,"maxLength":100,"description":"Nickname","example":"Johnny"},"lastName":{"type":"string","minLength":1,"maxLength":100,"description":"Last name","example":"Doe"},"transliteratedFirstName":{"type":"string","minLength":1,"maxLength":100,"description":"Transliterated first name (required if firstName has non-Latin-1 chars)","example":"Zhang"},"transliteratedMiddleName":{"type":"string","minLength":1,"maxLength":100,"description":"Transliterated middle name (required if middleName has non-Latin-1 chars)"},"transliteratedLastName":{"type":"string","minLength":1,"maxLength":100,"description":"Transliterated last name (required if lastName has non-Latin-1 chars)","example":"San"},"email":{"type":"string","format":"email","minLength":1,"maxLength":255,"description":"Email address","example":"john.doe@example.com"},"phone":{"type":"string","description":"Phone number in E.164 format","example":"+14155551234"},"dateOfBirth":{"type":"string","description":"Date of birth (YYYY-MM-DD)","example":"1990-01-15"},"address":{"description":"Current residential address. Use the nested transliterated field for Latin character versions of non-Latin addresses.","allOf":[{"$ref":"#/components/schemas/IndividualAddressInputDto"}]},"nationality":{"type":"string","description":"Nationality (ISO 3166-2)","example":"US"},"taxIdentificationNumber":{"type":"string","minLength":1,"maxLength":50,"description":"Tax/identity number (e.g., SSN in US, NINO in UK). This is the number only - for physical ID documents (passport, driver's license, state ID), use the governmentId field.\n\nValidated against country-specific formats when nationality is provided. Accepts NOT_APPLICABLE when no tax ID is available, except for US nationals, who must provide a real SSN/ITIN. If the value does not match the expected format, prefix with OVERRIDE: (e.g. OVERRIDE:123-45-6789) to store it as-is. These should be used sparingly — missing or overridden tax IDs may trigger additional customer due diligence.","example":"123-45-6789"},"occupation":{"type":"string","description":"Current occupation as an occupation code","example":"151252"},"employmentStatus":{"enum":["EMPLOYED","SELF_EMPLOYED","UNEMPLOYED","STUDENT","RETIRED","HOMEMAKER"],"type":"string","description":"Employment status"},"accountPurpose":{"enum":["PERSONAL_EXPENSES","BUSINESS_OPERATIONS","INVESTMENT","SAVINGS","OTHER"],"type":"string","description":"Purpose of account"},"requestedCapabilities":{"type":"array","items":{"type":"string","enum":["USD_ACH_PAYIN","USD_ACH_PAYOUT","USD_WIRE_PAYIN","USD_WIRE_PAYOUT","USD_BALANCE","USD_YIELD","SWIFT_PAYIN","SWIFT_PAYOUT","STABLECOIN_PAYIN","STABLECOIN_PAYOUT","STABLECOIN_SWAPS","AED_FX_PAYOUT","AUD_FX_PAYOUT","BHD_FX_PAYOUT","BOB_FX_PAYOUT","BRL_FX_PAYOUT","CLP_FX_PAYOUT","CNY_FX_PAYOUT","COP_FX_PAYOUT","DOP_FX_PAYOUT","EGP_FX_PAYOUT","EUR_FX_PAYOUT","GBP_FX_PAYOUT","HKD_FX_PAYOUT","IDR_FX_PAYOUT","INR_FX_PAYOUT","JPY_FX_PAYOUT","KRW_FX_PAYOUT","KWD_FX_PAYOUT","MXN_FX_PAYOUT","MYR_FX_PAYOUT","PEN_FX_PAYOUT","PHP_FX_PAYOUT","PYG_FX_PAYOUT","QAR_FX_PAYOUT","SAR_FX_PAYOUT","SGD_FX_PAYOUT","THB_FX_PAYOUT","TRY_FX_PAYOUT","TWD_FX_PAYOUT","USD_FX_PAYOUT","VND_FX_PAYOUT"]},"description":"Capabilities requested by the customer"},"accountPurposeExplanation":{"type":"string","description":"Account purpose explanation (required if purpose is other)"},"sourceOfFunds":{"enum":["COMPANY_FUNDS","ECOMMERCE_RESELLER","GAMBLING_PROCEEDS","GIFTS","GOVERNMENT_BENEFITS","INHERITANCE","INVESTMENTS_LOANS","PENSION_RETIREMENT","SALARY","SALE_OF_ASSETS_REAL_ESTATE","SAVINGS","SOMEONE_ELSES_FUNDS"],"type":"string","description":"Source of funds"},"sourceOfFundsDescription":{"type":"string","description":"Source of funds description"},"expectedMonthlyPaymentsUsd":{"type":"number","description":"Expected monthly payment volume in USD","example":5000},"actingAsIntermediary":{"type":"boolean","description":"Acting as intermediary for others","example":false},"governmentId":{"description":"Physical government-issued ID document (e.g., passport, driver's license, state ID). Includes document type, ID number, and front/back images. For tax/identity numbers like SSN, use taxIdentificationNumber instead.","allOf":[{"$ref":"#/components/schemas/GovernmentIdDto"}]},"proofOfAddress":{"description":"Proof of address document. Required for individual customers residing outside the US. Acceptable documents: utility bill, bank statement, lease agreement, or government letter dated within the last 90 days.","allOf":[{"$ref":"#/components/schemas/DocumentUploadDto"}]},"supportingDocuments":{"description":"Supporting documents","type":"array","items":{"$ref":"#/components/schemas/DocumentUploadDto"}},"proofOfSourceOfFunds":{"description":"Proof of source of funds documents for individual EDD flows.","type":"array","items":{"$ref":"#/components/schemas/DocumentUploadDto"}},"signedAgreementId":{"type":"string","minLength":1,"maxLength":256,"description":"Signed terms of service agreement ID. Use POST /v1/tos/generate to create a TOS agreement and obtain the ID. See Terms of Service documentation for details.","example":"tos_abc123"},"ipAddress":{"type":"string","description":"Client IP address for fraud detection","example":"192.168.1.1"},"providerSpecificData":{"type":"object"}}},"SubmitCustomerVerificationResponseDto":{"type":"object","properties":{"customerId":{"type":"string","description":"Customer ID","example":"cus_abc123"},"status":{"type":"string","description":"Customer status after saving verification data","example":"DRAFT"},"submittedAt":{"type":"string","description":"Submission timestamp when the customer has actually been submitted for review.","example":"2026-09-15T10:30:00Z"},"documentIds":{"description":"Document IDs uploaded","example":["doc_abc123","doc_xyz789"],"type":"array","items":{"type":"string"}},"missingRequirements":{"description":"Merged list of missing fields and documents for full verification (data is saved but customer remains in DRAFT)","example":[{"requirementType":"FIELD","key":"metadata.infiniteTosAcceptanceId","displayName":"Infinite Terms of Service & Privacy Policy"},{"requirementType":"DOCUMENT","key":"identity.government_id_front","displayName":"Government ID"}],"type":"array","items":{"$ref":"#/components/schemas/MissingComplianceRequirementDto"}},"reviewWarnings":{"description":"Document validation warnings that did not block submission and should be manually reviewed.","example":["businessData.businessAddressProof[0] failed AI proof-of-address validation (confidence 0.62): The address appears similar but the issue date is unclear."],"type":"array","items":{"type":"string"}}},"required":["customerId","status","documentIds"]},"SubmitBusinessCustomerVerificationDto":{"type":"object","properties":{"metadata":{"type":"object","description":"Additional metadata","example":{"source":"mobile_app","referrer":"partner_xyz"},"additionalProperties":true},"hasAgreedToTos":{"type":"boolean","description":"Set to true to indicate the customer has agreed to the Terms of Service and Privacy Policy. When true, a TOS acceptance record will be automatically created. This is a convenience for API-based integrations - alternatively, you can use the /v1/tos endpoints to create a TOS acceptance record and pass the ID in metadata.infiniteTosAcceptanceId.","example":true},"legalName":{"type":"string","minLength":1,"maxLength":1024,"description":"Legal name of business","example":"Acme Corporation Inc."},"transliteratedLegalName":{"type":"string","minLength":1,"maxLength":1024,"description":"Transliterated legal name"},"tradeName":{"type":"string","minLength":1,"maxLength":1024,"description":"Trade name / DBA. Separate multiple names with semicolons.","example":"Acme; Acme Pay"},"transliteratedTradeName":{"type":"string","minLength":1,"maxLength":1024,"description":"Transliterated trade name"},"businessType":{"enum":["CORPORATION","LLC","PARTNERSHIP","GEN_PARTNERSHIP","LLP","LP","SOLE_PROPRIETORSHIP","NON_PROFIT","TRUST","COOPERATIVE","PRIVATE_LIMITED_COMPANY","SPV","JOINT_VENTURE"],"type":"string","description":"Business type","example":"LLC"},"description":{"type":"string","minLength":20,"maxLength":10000,"description":"Brief business description","example":"Software development and consulting services"},"industry":{"type":"string","pattern":"^\\d{6}$","description":"6-digit NAICS industry classification code","example":"522320","minLength":6,"maxLength":6},"industryCryptoSubtype":{"enum":["PROTOCOL","EXCHANGE","INVESTMENT","LENDER","MARKET_MAKER","SAAS","MINER"],"type":"string","description":"Crypto-specific industry subtype. Required when isCrypto is true."},"industryFinancialServicesSubtype":{"enum":["GAMING","CROWD_FUNDING","BANK","FUND","INSURANCE","RIA","INVESTMENT_MANAGER","MSB","NBFI","PAYMENT_PROCESSOR","VASP"],"type":"string","description":"Financial-services-specific industry subtype"},"industryExplanation":{"type":"string","minLength":1,"maxLength":1024,"description":"Additional industry explanation"},"isCrypto":{"type":"boolean","description":"Set true if the business operates in crypto or digital assets.","example":false},"email":{"type":"string","format":"email","minLength":1,"maxLength":255,"description":"Business email address. Use an email on the company domain when available; personal email domains such as Gmail may require additional due diligence.","example":"contact@acme.com"},"phone":{"type":"string","description":"Business phone number in E.164 format","example":"+14155551234"},"website":{"type":"string","format":"uri","minLength":1,"maxLength":1024,"description":"Primary website","example":"https://acme.com"},"otherWebsites":{"description":"Other websites and social media","type":"array","items":{"type":"string"}},"registeredAddress":{"description":"Registered address. Use the nested transliterated field for Latin character versions of non-Latin addresses.","allOf":[{"$ref":"#/components/schemas/AddressDto"}]},"physicalAddress":{"description":"Physical business address where business actually operates. Use the nested transliterated field for Latin character versions.\n\n⚠️ IMPORTANT RESTRICTIONS:\n• Cannot be a virtual address or registered agent address\n• Cannot be a PO Box\n• Wyoming and Delaware addresses will be flagged for additional review\n• If business operates remotely, provide the residential address of the control person\n• Proof of address may be required if location signals are inconsistent","allOf":[{"$ref":"#/components/schemas/AddressDto"}]},"isRemoteCompany":{"type":"boolean","description":"Set true when the business operates remotely from an owner or director address.","example":false},"registrationDate":{"type":"string","description":"Date of business registration (YYYY-MM-DD)","example":"2015-06-01"},"registrationNumber":{"type":"string","minLength":1,"maxLength":50,"description":"Business registration number issued by the state/authority when the business was registered (e.g., LLC filing number, corporation charter number). This is different from the tax identification number.","example":"123456789"},"taxIdentificationNumber":{"type":"string","minLength":1,"maxLength":50,"description":"Tax identification number issued by the tax authority (e.g., EIN in the US, VAT number in EU). This is different from the business registration number.\n\nValidated against country-specific formats when countryCode is provided. Accepts NOT_APPLICABLE when no tax ID is available. If the value does not match the expected format, prefix with OVERRIDE: (e.g. OVERRIDE:12-3456789) to store it as-is. These should be used sparingly — missing or overridden tax IDs may trigger additional customer due diligence.","example":"12-3456789"},"accountPurpose":{"enum":["PAYROLL","VENDOR_PAYMENTS","TREASURY","OPERATIONS","CAPITAL_DEPLOYMENT","CROSS_BORDER_PAYMENTS","STABLECOIN_CONVERSION","ECOMMERCE","OTHER"],"type":"string","description":"Purpose of account"},"requestedCapabilities":{"type":"array","items":{"type":"string","enum":["USD_ACH_PAYIN","USD_ACH_PAYOUT","USD_WIRE_PAYIN","USD_WIRE_PAYOUT","USD_BALANCE","USD_YIELD","SWIFT_PAYIN","SWIFT_PAYOUT","STABLECOIN_PAYIN","STABLECOIN_PAYOUT","STABLECOIN_SWAPS","AED_FX_PAYOUT","AUD_FX_PAYOUT","BHD_FX_PAYOUT","BOB_FX_PAYOUT","BRL_FX_PAYOUT","CLP_FX_PAYOUT","CNY_FX_PAYOUT","COP_FX_PAYOUT","DOP_FX_PAYOUT","EGP_FX_PAYOUT","EUR_FX_PAYOUT","GBP_FX_PAYOUT","HKD_FX_PAYOUT","IDR_FX_PAYOUT","INR_FX_PAYOUT","JPY_FX_PAYOUT","KRW_FX_PAYOUT","KWD_FX_PAYOUT","MXN_FX_PAYOUT","MYR_FX_PAYOUT","PEN_FX_PAYOUT","PHP_FX_PAYOUT","PYG_FX_PAYOUT","QAR_FX_PAYOUT","SAR_FX_PAYOUT","SGD_FX_PAYOUT","THB_FX_PAYOUT","TRY_FX_PAYOUT","TWD_FX_PAYOUT","USD_FX_PAYOUT","VND_FX_PAYOUT"]},"description":"Capabilities requested by the customer"},"accountPurposeExplanation":{"type":"string","description":"Account purpose explanation (required if other)"},"sourceOfFunds":{"enum":["BUSINESS_REVENUE","INVESTMENT","OWNER_CAPITAL","LOAN","GRANTS","EQUITY","INHERITANCE","GIFT","OTHER"],"type":"string","description":"Source of funds"},"sourceOfFundsDescription":{"type":"string","description":"Source of funds description"},"estimatedAnnualRevenueUsd":{"enum":["PRE_REVENUE","LESS_THAN_10K","10K_TO_50K","50K_TO_100K","100K_TO_500K","500K_TO_1M","1M_TO_5M","5M_TO_10M","10M_TO_50M","50M_TO_250M","MORE_THAN_250M","LESS_THAN_100K"],"type":"string","description":"Estimated annual revenue in USD"},"expectedMonthlyPaymentsUsd":{"type":"number","description":"Expected monthly fiat payment volume in USD-equivalent","example":50000},"expectedCounterpartyCountries":{"description":"Expected counterparty countries","example":["US","CA"],"type":"array","items":{"type":"string"}},"expectedCryptoMonthlyVolume":{"type":"number","description":"Expected monthly crypto volume in USD-equivalent","example":250000},"expectedMonthlyAch":{"type":"number","description":"Expected monthly ACH volume in USD-equivalent","example":100000},"expectedMonthlyWire":{"type":"number","description":"Expected monthly wire volume in USD-equivalent","example":500000},"primaryTargetMarket":{"enum":["RETAIL","COMMERCIAL","GOVERNMENT","OTHER"],"type":"string","description":"Primary target market. RETAIL = B2C (consumers), COMMERCIAL = B2B (businesses), GOVERNMENT = B2G (government entities), OTHER = another market not covered by the standard options."},"moneyServicesDescription":{"type":"string","description":"Money services description. Collected through enhanced diligence when required."},"complianceScreeningExplanation":{"type":"string","description":"Compliance screening explanation. Collected through enhanced diligence when required."},"operatesInProhibitedCountries":{"type":"boolean","description":"Operates in prohibited countries","example":false},"highRiskActivities":{"type":"array","items":{"type":"string","enum":["MONEY_SERVICES","LENDING_BANKING","OTC_FX_CRYPTO_BROKERAGE","HOLD_CLIENT_FUNDS","INVESTMENT_SERVICES","SAFE_DEPOSIT_BOX","PRECIOUS_METALS_STONES_JEWELRY","NICOTINE_TOBACCO","MARIJUANA","PHARMACEUTICALS","THIRD_PARTY_PAYMENT_PROCESSING","ADULT_ENTERTAINMENT","WEAPONS_FIREARMS_EXPLOSIVES","GAMBLING"]},"description":"High risk activities the business engages in"},"highRiskActivitiesExplanation":{"type":"string","description":"Explanation of high risk activities (required if high risk activities present)"},"hasMaterialIntermediaryOwnership":{"type":"boolean","description":"Has intermediate legal entity ownership (25%+)"},"ownershipThreshold":{"type":"number","minimum":0,"maximum":100,"description":"Ownership threshold percentage (0-100, default 25)","example":25},"associatedEntities":{"description":"Associated entities (UBOs, control persons). Required for full KYB verification. Submit only individual leaf beneficial owners and control persons here. If ownership passes through an intermediate business, create that business first via the associated entity endpoints and then create its child entities with parentEntityId set to that business entity ID.","type":"array","items":{"$ref":"#/components/schemas/VerificationAssociatedEntityDto"}},"supportingDocuments":{"description":"Supporting documents (business formation, ownership info, license/regulatory registration if applicable). Required for full KYB verification.","type":"array","items":{"$ref":"#/components/schemas/DocumentUploadDto"}},"businessFormationDocuments":{"description":"Business formation documents such as articles of incorporation or an operating agreement.","type":"array","items":{"$ref":"#/components/schemas/DocumentUploadDto"}},"ownershipInformationDocuments":{"description":"Ownership information documents such as a cap table, shareholder registry, or trust deed.","type":"array","items":{"$ref":"#/components/schemas/DocumentUploadDto"}},"businessAddressProof":{"description":"Business address proof documents for business EDD.","type":"array","items":{"$ref":"#/components/schemas/DocumentUploadDto"}},"amlPolicy":{"description":"AML / BSA policy documents for money services businesses.","type":"array","items":{"$ref":"#/components/schemas/DocumentUploadDto"}},"directorsRegistry":{"description":"Directors registry documents for business EDD.","type":"array","items":{"$ref":"#/components/schemas/DocumentUploadDto"}},"proofOfSignatoryAuthority":{"description":"Proof of signatory authority documents such as a board resolution or certificate of incumbency.","type":"array","items":{"$ref":"#/components/schemas/DocumentUploadDto"}},"msbLicense":{"description":"MSB license documents when applicable.","type":"array","items":{"$ref":"#/components/schemas/DocumentUploadDto"}},"bankStatements":{"description":"Bank statements covering the last 3 months. Required for business EDD.","type":"array","items":{"$ref":"#/components/schemas/DocumentUploadDto"}},"signedAgreementId":{"type":"string","minLength":1,"maxLength":256,"description":"Signed terms of service agreement ID. Use POST /v1/tos/generate to create a TOS agreement and obtain the ID. See Terms of Service documentation for details.","example":"tos_abc123"},"ipAddress":{"type":"string","description":"Client IP address for fraud detection","example":"192.168.1.1"},"publiclyTraded":{"type":"boolean"},"sourceOfWealth":{"type":"string"},"providerSpecificData":{"type":"object"}}},"UnmatchedDepositDto":{"type":"object","properties":{"id":{"type":"string","description":"Deposit ID","example":"udep_abc123"},"txHash":{"type":"string","description":"Transaction hash"},"chain":{"type":"string","description":"Chain where the deposit was received","enum":["ETHEREUM","BASE","POLYGON","SOLANA","TRON","BITCOIN","ARBITRUM"]},"currency":{"type":"string","description":"Currency code","example":"USDC"},"amount":{"type":"string","description":"Total deposit amount in smallest unit","example":"50000000000"},"allocatedAmount":{"type":"string","description":"Amount already allocated to transfers (in smallest unit). Remaining available = amount - allocatedAmount.","example":"20000000000"},"fromAddress":{"type":"string","description":"Sender address"},"walletAddress":{"type":"string","description":"Receiving wallet address"},"provider":{"type":"string","description":"Provider that reported the unmatched deposit","example":"INFINITE"},"providerEventId":{"type":"string","nullable":true,"description":"Provider webhook/event ID when available"},"providerResourceId":{"type":"string","nullable":true,"description":"Provider transfer/resource ID when available"},"status":{"enum":["PENDING","RECONCILED","SWEPT"],"type":"string","description":"Deposit status"},"createdAt":{"format":"date-time","type":"string","description":"When the deposit was detected"}},"required":["id","txHash","chain","currency","amount","allocatedAmount","fromAddress","walletAddress","provider","status","createdAt"]},"UnmatchedDepositTotalDto":{"type":"object","properties":{"chain":{"type":"string","description":"Chain name","example":"base"},"currency":{"type":"string","description":"Currency code","example":"USDC"},"amount":{"type":"string","description":"Total amount in smallest unit","example":"5000000"}},"required":["chain","currency","amount"]},"ListUnmatchedDepositsResponseDto":{"type":"object","properties":{"deposits":{"type":"array","items":{"$ref":"#/components/schemas/UnmatchedDepositDto"}},"totals":{"description":"Totals grouped by chain and currency","type":"array","items":{"$ref":"#/components/schemas/UnmatchedDepositTotalDto"}},"count":{"type":"number","description":"Total number of deposits"}},"required":["deposits","totals","count"]},"IndividualEntityDetailsDto":{"type":"object","properties":{"firstName":{"type":"string","example":"John"},"nickname":{"type":"string","example":"Johnny"},"lastName":{"type":"string","example":"Doe"},"middleName":{"type":"string","example":"Michael"},"dateOfBirth":{"type":"string","example":"1985-03-15"},"transliteratedFirstName":{"type":"string"},"transliteratedMiddleName":{"type":"string"},"transliteratedLastName":{"type":"string"},"taxIdentificationDocumentType":{"type":"string","example":"UTR"}}},"BusinessEntityDetailsDto":{"type":"object","properties":{"businessName":{"type":"string","example":"Acme Holdings LLC"},"registrationNumber":{"type":"string","example":"LLC-12345678"},"dateOfIncorporation":{"type":"string","example":"2018-06-15"},"businessAddress":{"$ref":"#/components/schemas/AddressDto"}}},"CreateAssociatedIndividualDto":{"type":"object","properties":{"parentEntityId":{"type":"string","description":"Parent entity ID for nested ownership. Use the associated business entity ID returned from the associated entity endpoints when linking a child owner beneath an intermediate business owner.","example":"asp_abc123"},"countryCode":{"enum":["AD","AE","AF","AG","AI","AL","AM","AO","AR","AS","AT","AU","AW","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BR","BS","BT","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","EU","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HN","HR","HT","HU","ID","IE","IL","IM","IN","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SY","SZ","TC","TD","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","ZA","ZM","ZW"],"type":"string","description":"Country code (ISO 3166-1 alpha-2). Nationality for individuals, country of incorporation for businesses.","example":"US"},"email":{"type":"string","format":"email","minLength":1,"maxLength":1024,"description":"Email address. Required when generateVerificationLink is true."},"phone":{"type":"string","minLength":1,"maxLength":1024,"description":"Phone number"},"address":{"description":"Address. Use the nested transliterated field for Latin character versions of non-Latin addresses.","allOf":[{"$ref":"#/components/schemas/AddressDto"}]},"hasOwnership":{"type":"boolean","description":"Whether this entity is an owner. For an individual with indirect ownership whose percentage is not quantified, set this to true to identify them as a beneficial owner."},"hasControl":{"type":"boolean","description":"Has significant control"},"ownershipPercentage":{"type":"number","minimum":0,"maximum":100,"description":"Ownership percentage"},"isSigner":{"type":"boolean","description":"Has signing authority"},"isDirector":{"type":"boolean","description":"Is a director"},"role":{"enum":["CEO","CFO","COO","PRESIDENT","GENERAL_COUNSEL","MANAGING_MEMBER","TREASURER","OTHER"],"type":"string","description":"Structured role at the company."},"attestedOwnershipStructureAt":{"type":"string","description":"Timestamp when ownership structure was attested","example":"2026-06-01T10:45:05Z"},"relationshipDate":{"type":"string","description":"Date when the relationship with this entity was established (YYYY-MM-DD).","example":"2020-01-15"},"generateVerificationLink":{"type":"boolean","description":"When true, generates a verification link for this UBO to complete their KYC. The link will be returned in the response.","example":true},"sendInvite":{"type":"boolean","description":"When true (and generateVerificationLink is also true), sends an email invitation to the UBO to complete their KYC verification.","example":true},"firstName":{"type":"string","minLength":1,"maxLength":1024,"description":"First name","example":"John"},"lastName":{"type":"string","minLength":2,"maxLength":1024,"description":"Last name","example":"Doe"},"middleName":{"type":"string","minLength":1,"maxLength":1024,"description":"Middle name"},"nickname":{"type":"string","minLength":1,"maxLength":1024,"description":"Nickname"},"dateOfBirth":{"type":"string","description":"Date of birth (YYYY-MM-DD)","example":"1990-01-15"},"taxIdentificationNumber":{"type":"string","minLength":1,"maxLength":50,"description":"Tax identification number. Validated against country-specific formats when provided."},"taxIdentificationDocumentType":{"type":"string","minLength":1,"maxLength":50,"description":"Tax identification document type when the issuing country supports multiple tax ID types.","example":"UTR"},"transliteratedFirstName":{"type":"string","minLength":1,"maxLength":256,"description":"Transliterated first name"},"transliteratedMiddleName":{"type":"string","minLength":1,"maxLength":256,"description":"Transliterated middle name"},"transliteratedLastName":{"type":"string","minLength":1,"maxLength":256,"description":"Transliterated last name"},"governmentId":{"description":"Government ID document references","allOf":[{"$ref":"#/components/schemas/GovernmentIdDto"}]},"proofOfAddress":{"description":"Proof of address document reference","allOf":[{"$ref":"#/components/schemas/ProofOfAddressDto"}]},"supportingDocuments":{"description":"Supporting document references","type":"array","items":{"$ref":"#/components/schemas/DocumentUploadDto"}}},"required":["countryCode","hasOwnership","hasControl","firstName","lastName"]},"CreateAssociatedBusinessDto":{"type":"object","properties":{"parentEntityId":{"type":"string","description":"Parent entity ID for nested ownership. Use the associated business entity ID returned from the associated entity endpoints when linking a child owner beneath an intermediate business owner.","example":"asp_abc123"},"countryCode":{"enum":["AD","AE","AF","AG","AI","AL","AM","AO","AR","AS","AT","AU","AW","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BR","BS","BT","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CR","CU","CV","CW","CX","CY","CZ","DE","DJ","DK","DM","DO","DZ","EC","EE","EG","EH","ER","ES","ET","EU","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GH","GI","GL","GM","GN","GP","GQ","GR","GS","GT","GU","GW","GY","HK","HN","HR","HT","HU","ID","IE","IL","IM","IN","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SY","SZ","TC","TD","TG","TH","TJ","TK","TL","TM","TN","TO","TR","TT","TV","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","YE","YT","ZA","ZM","ZW"],"type":"string","description":"Country code (ISO 3166-1 alpha-2). Nationality for individuals, country of incorporation for businesses.","example":"US"},"email":{"type":"string","format":"email","minLength":1,"maxLength":1024,"description":"Email address. Required when generateVerificationLink is true."},"phone":{"type":"string","minLength":1,"maxLength":1024,"description":"Phone number"},"address":{"description":"Address. Use the nested transliterated field for Latin character versions of non-Latin addresses.","allOf":[{"$ref":"#/components/schemas/AddressDto"}]},"hasOwnership":{"type":"boolean","description":"Whether this entity is an owner. For an individual with indirect ownership whose percentage is not quantified, set this to true to identify them as a beneficial owner."},"hasControl":{"type":"boolean","description":"Has significant control"},"ownershipPercentage":{"type":"number","minimum":0,"maximum":100,"description":"Ownership percentage"},"isSigner":{"type":"boolean","description":"Has signing authority"},"isDirector":{"type":"boolean","description":"Is a director"},"role":{"enum":["CEO","CFO","COO","PRESIDENT","GENERAL_COUNSEL","MANAGING_MEMBER","TREASURER","OTHER"],"type":"string","description":"Structured role at the company."},"attestedOwnershipStructureAt":{"type":"string","description":"Timestamp when ownership structure was attested","example":"2026-06-01T10:45:05Z"},"relationshipDate":{"type":"string","description":"Date when the relationship with this entity was established (YYYY-MM-DD).","example":"2020-01-15"},"generateVerificationLink":{"type":"boolean","description":"When true, generates a verification link for this UBO to complete their KYC. The link will be returned in the response.","example":true},"sendInvite":{"type":"boolean","description":"When true (and generateVerificationLink is also true), sends an email invitation to the UBO to complete their KYC verification.","example":true},"businessName":{"type":"string","minLength":1,"maxLength":1024,"description":"Business name","example":"Acme Holdings LLC"},"registrationNumber":{"type":"string","minLength":1,"maxLength":256,"description":"Business registration number"},"dateOfIncorporation":{"type":"string","description":"Date of incorporation (YYYY-MM-DD)","example":"2018-06-15"},"businessAddress":{"description":"Business address","allOf":[{"$ref":"#/components/schemas/AddressDto"}]},"supportingDocuments":{"description":"Supporting document references","type":"array","items":{"$ref":"#/components/schemas/DocumentUploadDto"}}},"required":["countryCode","hasOwnership","hasControl","businessName"]},"UpdateAssociatedIndividualDto":{"type":"object","properties":{"parentEntityId":{"type":"string","nullable":true,"description":"Parent entity ID for nested ownership. Must reference a BUSINESS associated entity on the same customer."},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)"},"email":{"type":"string","format":"email","minLength":1,"maxLength":1024,"description":"Email address"},"phone":{"type":"string","minLength":1,"maxLength":1024,"description":"Phone number"},"address":{"description":"Address. Use the nested transliterated field for Latin character versions of non-Latin addresses.","allOf":[{"$ref":"#/components/schemas/AddressDto"}]},"hasOwnership":{"type":"boolean","description":"Whether this entity is an owner. For an individual with indirect ownership whose percentage is not quantified, set this to true to identify them as a beneficial owner."},"hasControl":{"type":"boolean","description":"Has significant control"},"ownershipPercentage":{"type":"number","minimum":0,"maximum":100,"description":"Ownership percentage"},"isSigner":{"type":"boolean","description":"Has signing authority"},"isDirector":{"type":"boolean","description":"Is a director"},"role":{"enum":["CEO","CFO","COO","PRESIDENT","GENERAL_COUNSEL","MANAGING_MEMBER","TREASURER","OTHER"],"type":"string","description":"Structured role at the company."},"governmentId":{"description":"Government ID","allOf":[{"$ref":"#/components/schemas/GovernmentIdDto"}]},"proofOfAddress":{"description":"Proof of address document (for INDIVIDUAL). Required for recipients using the SWIFT overlay, not for the SWIFT transfer itself. Examples: utility bill, bank statement, lease agreement.","allOf":[{"$ref":"#/components/schemas/ProofOfAddressDto"}]},"supportingDocuments":{"description":"Additional supporting document references for this associated entity.","type":"array","items":{"$ref":"#/components/schemas/DocumentUploadDto"}},"attestedOwnershipStructureAt":{"type":"string","description":"Timestamp when ownership structure was attested"},"relationshipDate":{"type":"string","description":"Date when the relationship with this entity was established (YYYY-MM-DD)","example":"2020-01-15"},"firstName":{"type":"string","minLength":1,"maxLength":1024,"description":"First name"},"lastName":{"type":"string","minLength":2,"maxLength":1024,"description":"Last name"},"middleName":{"type":"string","minLength":1,"maxLength":1024,"description":"Middle name"},"nickname":{"type":"string","minLength":1,"maxLength":1024,"description":"Nickname"},"dateOfBirth":{"type":"string","description":"Date of birth (YYYY-MM-DD)"},"taxIdentificationNumber":{"type":"string","minLength":1,"maxLength":50,"description":"Tax identification number. Validated in the service against the stored nationality and residence, so partial updates that omit countries are still checked."},"taxIdentificationDocumentType":{"type":"string","minLength":1,"maxLength":50,"description":"Tax identification document type when the issuing country supports multiple tax ID types.","example":"UTR"},"transliteratedFirstName":{"type":"string","minLength":1,"maxLength":256,"description":"Transliterated first name"},"transliteratedMiddleName":{"type":"string","minLength":1,"maxLength":256,"description":"Transliterated middle name"},"transliteratedLastName":{"type":"string","minLength":1,"maxLength":256,"description":"Transliterated last name"}}},"UpdateAssociatedBusinessDto":{"type":"object","properties":{"parentEntityId":{"type":"string","nullable":true,"description":"Parent entity ID for nested ownership. Must reference a BUSINESS associated entity on the same customer."},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)"},"email":{"type":"string","format":"email","minLength":1,"maxLength":1024,"description":"Email address"},"phone":{"type":"string","minLength":1,"maxLength":1024,"description":"Phone number"},"address":{"description":"Address. Use the nested transliterated field for Latin character versions of non-Latin addresses.","allOf":[{"$ref":"#/components/schemas/AddressDto"}]},"hasOwnership":{"type":"boolean","description":"Whether this entity is an owner. For an individual with indirect ownership whose percentage is not quantified, set this to true to identify them as a beneficial owner."},"hasControl":{"type":"boolean","description":"Has significant control"},"ownershipPercentage":{"type":"number","minimum":0,"maximum":100,"description":"Ownership percentage"},"isSigner":{"type":"boolean","description":"Has signing authority"},"isDirector":{"type":"boolean","description":"Is a director"},"role":{"enum":["CEO","CFO","COO","PRESIDENT","GENERAL_COUNSEL","MANAGING_MEMBER","TREASURER","OTHER"],"type":"string","description":"Structured role at the company."},"supportingDocuments":{"description":"Additional supporting document references for this associated entity.","type":"array","items":{"$ref":"#/components/schemas/DocumentUploadDto"}},"attestedOwnershipStructureAt":{"type":"string","description":"Timestamp when ownership structure was attested"},"relationshipDate":{"type":"string","description":"Date when the relationship with this entity was established (YYYY-MM-DD)","example":"2020-01-15"},"businessName":{"type":"string","minLength":1,"maxLength":1024,"description":"Business name"},"registrationNumber":{"type":"string","minLength":1,"maxLength":256,"description":"Business registration number"},"dateOfIncorporation":{"type":"string","description":"Date of incorporation (YYYY-MM-DD)"},"businessAddress":{"description":"Business address","allOf":[{"$ref":"#/components/schemas/AddressDto"}]}}},"CreateCounterpartyDto":{"type":"object","properties":{"name":{"type":"string","example":"Jane Doe","description":"Counterparty legal name"},"beneficiaryType":{"enum":["INDIVIDUAL","BUSINESS"],"type":"string","example":"BUSINESS","description":"Entity type (individual or business)"},"address":{"description":"Counterparty address","allOf":[{"$ref":"#/components/schemas/AddressDto"}]}},"required":["name","beneficiaryType"]},"UpdateCounterpartyDto":{"type":"object","properties":{"name":{"type":"string","example":"Jane Doe","description":"Counterparty legal name"},"beneficiaryType":{"enum":["INDIVIDUAL","BUSINESS"],"type":"string","example":"BUSINESS","description":"Entity type (individual or business)"},"address":{"nullable":true,"description":"Counterparty address","type":"object","allOf":[{"$ref":"#/components/schemas/AddressDto"}]}}},"CreateDocumentDto":{"type":"object","properties":{"documentType":{"type":"string","description":"Type of document","example":"INVOICE"},"documentSubtype":{"type":"string","description":"Specific document subtype","example":"GOVERNMENT_ID_FRONT"},"fileName":{"type":"string","maxLength":255,"description":"Original file name","example":"invoice-2026-001.pdf"},"contentType":{"type":"string","description":"MIME type of the file","example":"application/pdf"},"customerId":{"type":"string","description":"Customer ID the document belongs to","example":"cus_abc123"},"transferId":{"type":"string","description":"Transfer ID if document is associated with a transfer","example":"txn_xyz789"},"fileHash":{"type":"string","description":"SHA-256 hash of file content for deduplication. If provided and a duplicate exists, returns the existing document instead of creating a new upload request.","example":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"remarks":{"type":"string","maxLength":1000,"description":"Free-form remarks or notes about the document","example":"Utility bill for the registered office"}},"required":["documentType","fileName","contentType","customerId"]},"ConfirmDocumentUploadDto":{"type":"object","properties":{"fileHash":{"type":"string","description":"SHA-256 hash of file content for deduplication","example":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}}},"ConfirmDocumentUploadResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"doc_abc123"},"organizationId":{"type":"string","example":"org_xyz789"},"customerId":{"type":"string","example":"cus_abc123"},"transferId":{"type":"string","nullable":true,"example":"txn_xyz789"},"documentType":{"enum":["IDENTITY","PROOF_OF_ADDRESS","INVOICE","CONTRACT","BANK_STATEMENT","BUSINESS_LICENSE","ARTICLES_OF_INCORPORATION","ARTICLES_OF_ASSOCIATION","CERTIFICATE_OF_FORMATION","CERTIFICATE_OF_INCUMBENCY","OPERATING_AGREEMENT","PARTNERSHIP_AGREEMENT","OWNERSHIP_STRUCTURE","SHAREHOLDER_AGREEMENT","STOCK_CERTIFICATE","TAX_RETURN","FINANCIAL_STATEMENT","MARKETING_MATERIALS","DOMAIN_OWNERSHIP_PROOF","BUSINESS_PLAN","BILL_OF_LADING","AML_POLICY","AML_COMFORT_LETTER","FUNDS_FLOW_DIAGRAM","GOOD_STANDING_CERTIFICATE","TIN_VERIFICATION","MSB_LICENSE","DIRECTORS_REGISTRY","OWNERSHIP_CHART","PROOF_OF_SIGNATORY_AUTHORITY","PROOF_OF_SOURCE_OF_FUNDS","PROOF_OF_ENTITY_NAME_CHANGE","REMOTE_ADDRESS_ATTESTATION","E_SIGNATURE_CERTIFICATE","COMPLIANCE_NOTES","PROOF_OF_SOURCE_OF_WEALTH","TAX_EXEMPT_ENTITY_CONFIRMATION","OTHER"],"type":"string","description":"Document type","example":"INVOICE"},"documentSubtype":{"type":"string","description":"Specific document subtype","example":"BANK_STATEMENT"},"fileName":{"type":"string","example":"invoice-2026-001.pdf"},"contentType":{"type":"string","example":"application/pdf"},"sizeBytes":{"type":"number","example":1024000},"remarks":{"type":"string","nullable":true,"description":"Free-form remarks or notes about the document"},"fileHash":{"type":"string","nullable":true,"description":"SHA-256 hash of file content"},"downloadUrl":{"type":"string","description":"Signed URL to download the document"},"status":{"enum":["PENDING","UPLOADING","UPLOADED","FAILED"],"type":"string","description":"Document status","example":"UPLOADED"},"createdAt":{"format":"date-time","type":"string"},"uploadedAt":{"format":"date-time","type":"string","nullable":true},"associatedEntityId":{"type":"string","nullable":true,"description":"Associated entity ID (e.g., UBO)"},"isDuplicate":{"type":"boolean","description":"Whether this document was deduplicated (returned existing instead of new)"},"reviewWarnings":{"description":"Document validation warnings that did not block confirmation and should be manually reviewed.","type":"array","items":{"type":"string"}}},"required":["id","organizationId","customerId","documentType","fileName","contentType","sizeBytes","status","createdAt"]},"AccessibleOrganizationsListResponseDto":{"type":"object","properties":{"data":{"description":"Organizations in the caller data-access scope","type":"array","items":{"$ref":"#/components/schemas/OrganizationResponseDto"}},"total":{"type":"number","description":"Total number of matching organizations"},"limit":{"type":"number","description":"Limit used for pagination"},"offset":{"type":"number","description":"Offset used for pagination"}},"required":["data","total","limit","offset"]},"CreateChildOrganizationDto":{"type":"object","properties":{"name":{"type":"string","description":"Child organization name"},"slug":{"type":"string","description":"Organization slug (URL-safe identifier)"},"domains":{"description":"Allowed email domains","type":"array","items":{"type":"string"}},"allowProfilesOutsideOrganization":{"type":"boolean","description":"Allow profiles outside organization"}},"required":["name"]},"UpdateOrganizationDto":{"type":"object","properties":{"name":{"type":"string","description":"Organization name"},"logoUrl":{"type":"string","nullable":true,"description":"Organization logo URL"},"domains":{"description":"Organization domains","type":"array","items":{"type":"string"}},"allowProfilesOutsideOrganization":{"type":"boolean","description":"Allow profiles outside organization"}}},"NetworkAddressEntryDto":{"type":"object","properties":{"address":{"type":"string","description":"The address. Null if no address is configured.","example":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"},"isDefault":{"type":"boolean","description":"Whether this address is the default (treasury wallet). False if a custom address is set.","example":true}},"required":["isDefault"]},"NetworkAddressesResponseDto":{"type":"object","properties":{"evm":{"$ref":"#/components/schemas/NetworkAddressEntryDto"},"solana":{"$ref":"#/components/schemas/NetworkAddressEntryDto"},"tron":{"$ref":"#/components/schemas/NetworkAddressEntryDto"},"bitcoin":{"$ref":"#/components/schemas/NetworkAddressEntryDto"}},"required":["evm","solana","tron","bitcoin"]},"NetworkAccountEntryDto":{"type":"object","properties":{"accountId":{"type":"string","description":"Wallet account ID (inw_xxx or ewa_xxx) for refunds. Omitted when using the treasury default.","example":"inw_abc123"},"address":{"type":"string","description":"Resolved on-chain wallet address for this refund account. Lets operators verify where refunds land without dereferencing the account ID.","example":"9giUCGg4BSigGcWZmUj2Gr6esj8hVr5MZRAKF3oMTNUo"},"isDefault":{"type":"boolean","description":"Whether this account is the default treasury wallet for the network.","example":true}},"required":["isDefault"]},"NetworkAccountsResponseDto":{"type":"object","properties":{"evm":{"$ref":"#/components/schemas/NetworkAccountEntryDto"},"solana":{"$ref":"#/components/schemas/NetworkAccountEntryDto"},"tron":{"$ref":"#/components/schemas/NetworkAccountEntryDto"},"bitcoin":{"$ref":"#/components/schemas/NetworkAccountEntryDto"}},"required":["evm","solana","tron","bitcoin"]},"OrgConfigResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Config ID","example":"orgcfg_abc123"},"organizationId":{"type":"string","description":"Organization ID","example":"org_abc123"},"feeRecipientAddresses":{"description":"Per-network fee recipient addresses","allOf":[{"$ref":"#/components/schemas/NetworkAddressesResponseDto"}]},"refundAccounts":{"description":"Per-network refund accounts for failed transfers","allOf":[{"$ref":"#/components/schemas/NetworkAccountsResponseDto"}]},"createdAt":{"type":"string","description":"Created timestamp"},"updatedAt":{"type":"string","description":"Updated timestamp"}},"required":["id","organizationId","feeRecipientAddresses","refundAccounts","createdAt","updatedAt"]},"NetworkAddressesDto":{"type":"object","properties":{"evm":{"type":"string","description":"EVM address (Ethereum, Base, Polygon). Must be a valid Ethereum address.","example":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"},"solana":{"type":"string","description":"Solana address","example":"7EcDhSYGxXyscszYEp35KHN8vvw3svAuLKTzXwCFLtV"},"tron":{"type":"string","description":"Tron address","example":"TJCnKsPa7y5okkXvQAidZBzqx3QyQ6sxMW"},"bitcoin":{"type":"string","description":"Bitcoin address","example":"bc1qar0srrr7xfkvy5l643lydnw9re59gtzzwf5mdq"}}},"NetworkAccountIdsDto":{"type":"object","properties":{"evm":{"type":"string","description":"EVM wallet account ID (inw_xxx or ewa_xxx) for refunds. Must have a wallet address; validated at request time.","example":"inw_abc123"},"solana":{"type":"string","description":"Solana wallet account ID (inw_xxx or ewa_xxx) for refunds. Must have a wallet address; validated at request time.","example":"inw_sol123"},"tron":{"type":"string","description":"Tron wallet account ID (inw_xxx or ewa_xxx) for refunds. Must have a wallet address; validated at request time.","example":"inw_tron123"},"bitcoin":{"type":"string","description":"Bitcoin wallet account ID (inw_xxx or ewa_xxx) for refunds. Must have a wallet address; validated at request time.","example":"inw_btc123"}}},"UpdateOrgConfigDto":{"type":"object","properties":{"feeRecipientAddresses":{"description":"Per-network addresses for fee payouts. Set to null to fall back to treasury wallet.","allOf":[{"$ref":"#/components/schemas/NetworkAddressesDto"}]},"refundAccounts":{"description":"Per-network refund accounts for failed transfers. Set to null to fall back to treasury wallet.","allOf":[{"$ref":"#/components/schemas/NetworkAccountIdsDto"}]}}},"OrganizationInfo":{"type":"object","properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"parentOrganizationId":{"type":"string","nullable":true},"logoUrl":{"type":"string","nullable":true},"metadata":{"type":"object","additionalProperties":true},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"required":["id","slug","name","parentOrganizationId","logoUrl","metadata","createdAt","updatedAt"]},"EnhancedDiligenceRequirements":{"type":"object","properties":{"requiredFields":{"type":"array","items":{"$ref":"#/components/schemas/RequiredField"}},"requiredDocuments":{"type":"array","items":{"$ref":"#/components/schemas/RequiredDocument"}}},"required":["requiredFields","requiredDocuments"]},"StepDocumentRequirements":{"type":"object","properties":{"requiredDocuments":{"type":"array","items":{"$ref":"#/components/schemas/RequiredDocument"}}},"required":["requiredDocuments"]},"EnhancedVerificationStep":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"subtitle":{"type":"string","nullable":true},"order":{"type":"number"},"requiredFields":{"nullable":true,"type":"array","items":{"type":"string"}},"requiredDocuments":{"nullable":true,"type":"array","items":{"type":"string"}},"documentRequirements":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/StepDocumentRequirements"}]}},"required":["id","title","order"]},"SessionConfigResponse":{"type":"object","properties":{"id":{"type":"string"},"organizationId":{"type":"string"},"organization":{"$ref":"#/components/schemas/OrganizationInfo"},"customerId":{"type":"string","nullable":true},"associatedEntityId":{"type":"string","nullable":true,"description":"Associated entity ID. Present when this is a UBO KYC session.","example":"asp_abc123"},"customerName":{"type":"string","nullable":true,"description":"Customer/business name. Present when this is a UBO KYC session.","example":"Acme Corporation"},"verificationSubtype":{"type":"string"},"countryCode":{"type":"string"},"email":{"type":"string"},"name":{"type":"string"},"status":{"type":"string"},"expiresAt":{"type":"string"},"completedAt":{"type":"string","nullable":true},"submittedAt":{"type":"string","nullable":true},"completedSteps":{"type":"array","items":{"type":"string"}},"requiredSteps":{"type":"array","items":{"type":"string"}},"requiredFields":{"type":"array","items":{"$ref":"#/components/schemas/RequiredField"}},"requiredDocuments":{"type":"array","items":{"$ref":"#/components/schemas/RequiredDocument"}},"enhancedDiligence":{"$ref":"#/components/schemas/EnhancedDiligenceRequirements"},"documentRequirements":{"$ref":"#/components/schemas/StepDocumentRequirements"},"steps":{"type":"array","items":{"$ref":"#/components/schemas/EnhancedVerificationStep"}},"estimatedCompletionTimeMinutes":{"type":"number","nullable":true},"collectedData":{"type":"object","additionalProperties":true},"providerData":{"type":"object","nullable":true,"additionalProperties":true},"providerSessionId":{"type":"string","nullable":true},"verificationUrl":{"type":"string","nullable":true},"metadata":{"type":"object","additionalProperties":true},"fillOnBehalf":{"type":"boolean"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"},"featureFlags":{"description":"Feature flags enabled for the organization","example":["socuredocv","advanced-reporting"],"type":"array","items":{"type":"string"}},"bankPartnerAgreementsRequired":{"type":"boolean","description":"Whether additional banking agreements must be accepted"}},"required":["id","organizationId","organization","customerId","verificationSubtype","countryCode","email","name","status","expiresAt","completedAt","submittedAt","completedSteps","requiredSteps","requiredFields","requiredDocuments","documentRequirements","steps","estimatedCompletionTimeMinutes","collectedData","providerData","providerSessionId","verificationUrl","metadata","fillOnBehalf","createdAt","updatedAt","featureFlags","bankPartnerAgreementsRequired"]},"VerificationSessionSummaryDto":{"type":"object","properties":{"sessionId":{"type":"string","description":"Verification session ID","example":"vs_abc123"},"status":{"type":"string","description":"Session status","example":"PENDING"},"createdAt":{"type":"string","description":"Session creation timestamp","example":"2026-09-15T10:30:00Z"},"expiresAt":{"type":"string","description":"Session expiration timestamp","example":"2026-10-15T10:30:00Z"},"completedAt":{"type":"string","description":"Session completion timestamp","example":"2026-09-20T10:30:00Z"},"progressPercentage":{"type":"number","description":"Progress percentage (0-100)","example":50},"completedSteps":{"description":"Completed step IDs","example":["personal_info"],"type":"array","items":{"type":"string"}},"requiredSteps":{"description":"Required step IDs","example":["personal_info","documents"],"type":"array","items":{"type":"string"}},"verificationUrl":{"type":"string","description":"Verification URL for the session","example":"https://verify.infinite.dev/?sessionId=vsess_abc123"},"fillOnBehalf":{"type":"boolean","description":"Whether the organization is filling out verification on behalf of the customer","example":false}},"required":["sessionId","status","createdAt","expiresAt","progressPercentage","completedSteps","requiredSteps"]},"CustomerVerificationResponseDto":{"type":"object","properties":{"customerId":{"type":"string","example":"cus_abc123"},"sessions":{"type":"array","items":{"$ref":"#/components/schemas/VerificationSessionSummaryDto"}}},"required":["customerId","sessions"]},"InitiateVerificationDto":{"type":"object","properties":{"type":{"enum":["INDIVIDUAL","BUSINESS"],"type":"string","description":"Customer type","example":"INDIVIDUAL"},"countryCode":{"type":"string","description":"Country code (ISO 3166-1 alpha-2)","example":"US"},"email":{"type":"string","format":"email","description":"Customer email address. Must be unique within the organization. If a customer with this email already exists, the existing customer will be used.","example":"customer@example.com"},"name":{"type":"string","description":"Customer name","example":"John Doe"},"customerId":{"type":"string","description":"Existing customer ID (optional)","example":"cus_abc123"},"fillOnBehalf":{"type":"boolean","description":"When true, indicates the organization will fill out the verification on behalf of the customer. No reminder emails will be sent.","default":false},"redirectUrl":{"type":"string","format":"uri","description":"URL to redirect the user to after verification is completed. When provided, the user will be automatically redirected to this URL after successfully completing the verification flow.","example":"https://app.example.com/kyc-complete"}},"required":["type","countryCode","email","name"]},"InitiateVerificationResponseDto":{"type":"object","properties":{"verification":{"type":"object","properties":{"sessionId":{"type":"string","example":"vsess_abc123"},"verificationUrl":{"type":"string","example":"https://verify.infinite.dev/?sessionId=vsess_abc123"},"expiresAt":{"type":"string","example":"2026-10-15T10:30:00Z"}}}},"required":["verification"]},"MoneyInputDto":{"type":"object","properties":{"currency":{"type":"string","description":"Currency code (ISO 4217 for fiat, symbol for crypto)","example":"USD"},"rawValue":{"type":"string","pattern":"^[1-9]\\d*$","description":"Amount in smallest unit as a string (cents for USD, satoshi for BTC, etc.)","example":"1000000"}},"required":["currency","rawValue"]},"TransferSourceDto":{"type":"object","properties":{"accountId":{"type":"string","description":"Source account ID. For Infinite Wallets: if TREASURY wallet, funds will be automatically transferred on submit. If TRANSACTION wallet, deposit instructions will be provided.","example":"inw_abc123"},"currency":{"type":"string","enum":["USD","EUR","MXN","USAT","USDC","USDT","BTC"],"description":"Source currency code","example":"USDC"},"paymentRail":{"type":"string","enum":["ACH","ACH_SAME_DAY","WIRE","FED_NOW","RTP","EREBOR","EREBOR_RAIL","BALANCE","SWIFT","SEPA","SEPA_INSTANT","TIPS","FASTER_PAYMENTS","BACS","CHAPS","ELIXIR","NICS","EFT","INTERAC","NPP","BECS","UPI","IMPS","IMPS_WITH_FIRC","NEFT","RTGS","BI_FAST","ARTAJASA","PIX","TED","TEF","SPEI","COELSA","SINPE","CIPS","CFXPS","CHATS","ZENGIN","KFTC","FAST_SG","MEPS","DUITNOW","PROMPTPAY","INSTAPAY","PESONET","NAPAS","BEFTN","SLIPS","ZAHAV","GHIPSS","NIBSS","PESALINK","RTC_ZA","TZS_RTGS","EGP_ACH","JOD_ACH","NPSS","MADA","QPS","DOP_ACH","GTQ_ACH","HNL_ACH","PEN_ACH","JMD_ACH","USD_ACH_SV","USD_ACH_EC","CLP_TEF","PSE","COP_ACH","BOB_RTGS","PYG_ACH","CERTIS","DKK_TIPS","SENT","NKS","BANKGIROT","HKD_FPS","IBFT","TRY_FAST","ETHEREUM","BASE","POLYGON","SOLANA","TRON","BITCOIN","ARBITRUM"],"description":"Payment rail for the source funds. For crypto, specify the blockchain (ETHEREUM, BASE, ARBITRUM, POLYGON, SOLANA, TRON). For fiat, specify the banking network (ACH, WIRE, SEPA, SWIFT). Provider-backed bank balances may also use EREBOR, and on-us Erebor bank transfers use EREBOR_RAIL.","example":"ETHEREUM"},"direction":{"enum":["CREDIT","DEBIT"],"type":"string","description":"ACH direction. Optional when source.paymentRail is ACH and source.accountId is provided. If omitted for an account-backed ACH source, the API defaults to CREDIT. DEBIT is currently provider-disabled for Erebor-backed virtual bank account sources.","example":"CREDIT"},"refundAccountId":{"type":"string","description":"Customer wallet account ID (inw_xxx or ewa_xxx) that receives refunds for failed crypto transfers or when fees exceed deposit. Must belong to the customer and include a wallet address; validated at request time.","example":"inw_abc123"}},"required":["currency","paymentRail"]},"TransferDestinationDto":{"type":"object","properties":{"correspondentBankName":{"type":"string","maxLength":200,"description":"Correspondent/intermediary bank name","example":"Bank of America"},"correspondentBankSwiftCode":{"type":"string","description":"Correspondent/intermediary bank SWIFT/BIC code (8 or 11 characters)","example":"IRVTUS3NXXX"},"correspondentAccountNumber":{"type":"string","maxLength":64,"description":"Correspondent/intermediary account number","example":"9876543210"},"accountId":{"type":"string","description":"Account ID for the destination of funds","example":"acc_def456"},"currency":{"type":"string","enum":["USD","EUR","MXN","USAT","USDC","USDT","BTC"],"description":"Destination currency code","example":"USDC"},"paymentRail":{"type":"string","enum":["ACH","ACH_SAME_DAY","WIRE","FED_NOW","RTP","EREBOR","EREBOR_RAIL","BALANCE","SWIFT","SEPA","SEPA_INSTANT","TIPS","FASTER_PAYMENTS","BACS","CHAPS","ELIXIR","NICS","EFT","INTERAC","NPP","BECS","UPI","IMPS","IMPS_WITH_FIRC","NEFT","RTGS","BI_FAST","ARTAJASA","PIX","TED","TEF","SPEI","COELSA","SINPE","CIPS","CFXPS","CHATS","ZENGIN","KFTC","FAST_SG","MEPS","DUITNOW","PROMPTPAY","INSTAPAY","PESONET","NAPAS","BEFTN","SLIPS","ZAHAV","GHIPSS","NIBSS","PESALINK","RTC_ZA","TZS_RTGS","EGP_ACH","JOD_ACH","NPSS","MADA","QPS","DOP_ACH","GTQ_ACH","HNL_ACH","PEN_ACH","JMD_ACH","USD_ACH_SV","USD_ACH_EC","CLP_TEF","PSE","COP_ACH","BOB_RTGS","PYG_ACH","CERTIS","DKK_TIPS","SENT","NKS","BANKGIROT","HKD_FPS","IBFT","TRY_FAST","ETHEREUM","BASE","POLYGON","SOLANA","TRON","BITCOIN","ARBITRUM"],"description":"Payment rail for destination (banking network or blockchain)","example":"ETHEREUM"},"wireMessage":{"type":"string","maxLength":140,"description":"Wire transfer message (max 140 chars)","example":"Payment for invoice INV-2026-001"},"sepaReference":{"type":"string","maxLength":140,"pattern":"^[a-zA-Z0-9&\\-./ ]{6,140}$","description":"SEPA reference (6-140 chars, limited charset: a-z A-Z 0-9 & - . / and space)","example":"INV-2026-001","minLength":6},"achReference":{"type":"string","maxLength":10,"pattern":"^[a-zA-Z0-9 ]{1,10}$","description":"ACH reference (max 10 chars, alphanumeric and spaces)","example":"ORDER123"},"blockchainMemo":{"type":"string","description":"Blockchain memo (for Stellar, Tron, etc.)","example":"MEMO123456"},"swiftReference":{"type":"string","maxLength":190,"description":"SWIFT reference (max 4 lines, 35 chars per line, separated by \\n)","example":"Payment for Invoice\\nReference: INV-2026-001"},"rtpReference":{"type":"string","maxLength":140,"pattern":"^[a-zA-Z0-9&\\-./ ]{0,140}$","description":"RTP reference (max 140 chars, limited charset: a-z A-Z 0-9 & - . / and space)","example":"Payment for invoice INV-2026-001"}},"required":["accountId","currency","paymentRail"]},"CreateTransferDto":{"type":"object","properties":{"clientReferenceId":{"type":"string","maxLength":256,"description":"Client's internal reference ID (e.g., order ID, transaction ID)","example":"order_abc123"},"onBehalfOf":{"type":"string","description":"Primary customer ID (on whose behalf the transfer is made)","example":"cus_abc123"},"counterpartyId":{"type":"string","description":"Counterparty ID for third-party recipient transfers. Omit for first-party transfers.","example":"cp_abc123"},"amount":{"description":"Transfer amount","example":{"currency":"USD","rawValue":"10000"},"allOf":[{"$ref":"#/components/schemas/MoneyInputDto"}]},"quoteId":{"type":"string","description":"Quote ID to use for rate and amount calculation","example":"quote_xyz789"},"source":{"description":"Source payment details","allOf":[{"$ref":"#/components/schemas/TransferSourceDto"}]},"destination":{"description":"Destination payment details","allOf":[{"$ref":"#/components/schemas/TransferDestinationDto"}]},"paymentReason":{"enum":["CAPITAL_CONTRIBUTIONS","CHARITABLE_CONTRIBUTIONS","CONSULTING_FEES","CORPORATE_TAX_PAYMENTS","DOWN_PAYMENTS_FOR_REAL_ESTATE","EDUCATION_FEES","EMPLOYEE_SALARIES_OR_WAGES","EXPENSES_REIMBURSEMENT","GIFTS","GOVERNMENT_GRANTS","INCOME_TAX_PAYMENTS","INHERITANCE_PAYMENTS","INSURANCE_CLAIM_PAYOUTS","INSURANCE_PREMIUM_PAYMENTS","INVESTMENTS","LOAN_ADVANCES","MORTGAGE_PAYMENTS","OTHER","PAYMENT_FOR_GOODS_AND_SERVICES","PERSONAL_TRANSFERS","REAL_ESTATE_PURCHASES","REMITTANCES","RENT","REPAYMENT_OF_LOANS","ROYALTIES","SELF","TRADE_SETTLEMENT","TRUST_FUND_DISTRIBUTIONS","UTILITY_BILLS","WELFARE_OR_BENEFITS","WINNINGS_AND_PRIZES"],"type":"string","description":"Reason for the payment (compliance/AML)","example":"PAYMENT_FOR_GOODS_AND_SERVICES"},"remarks":{"type":"string","maxLength":1000,"description":"Free-form remarks or notes about the transfer (e.g., invoice discrepancy explanations)","example":"Partial payment - remaining balance to be paid next month"},"internalRemarks":{"type":"string","maxLength":1000,"description":"Internal remarks visible only within your organization. Never forwarded to payment rails (SWIFT, ACH, etc.) or counterparties.","example":"Approved by ops on 2026-04-15"},"developerFeeFixed":{"type":"number","minimum":0,"description":"Fixed developer fee in minor units of source currency. Added on top of provider fees and deducted from the transfer amount.","example":100},"developerFeePercent":{"type":"number","minimum":0,"maximum":0.1,"description":"Developer fee as decimal percentage (e.g., 0.015 for 1.5%). Deducted from the transfer amount before sending to the destination. Maximum 0.1 (10%).","example":0.015},"documentIds":{"description":"Supporting document IDs for the transfer. Required for third-party SWIFT payments (when the destination account is marked as third-party or the destination customer differs from the originating customer).","example":["doc_abc123","doc_def456"],"type":"array","items":{"type":"string"}},"expiresAt":{"type":"string","description":"Optional transfer expiration timestamp. If omitted, the transfer expires 7 days after creation when funded by a fiat pay-in (wire/ACH) and 48 hours after creation otherwise.","example":"2026-12-31T23:59:59Z","format":"date-time"},"confirm":{"type":"boolean","description":"If true, immediately submit the transfer for processing after creation. If false or omitted, transfer is created in DRAFT status and can be submitted later via POST /transfers/:id/submit.","default":false},"requiresAuthorization":{"type":"boolean","description":"If true, this payment must be authorized before it is processed. Attach the supporting invoice via documentIds. The transfer parks in PENDING_AUTHORIZATION and does not move funds until it is approved.","default":false}},"required":["onBehalfOf","amount","source","destination","paymentReason"]},"CryptoDepositInstructionsDto":{"type":"object","properties":{"type":{"type":"string","description":"Instruction type","example":"crypto"},"paymentRail":{"type":"string","description":"Payment rail (blockchain)","example":"ETHEREUM"},"toAddress":{"type":"string","description":"Destination wallet address","example":"0x1234567890abcdef1234567890abcdef12345678"},"amount":{"description":"Amount to deposit","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]},"blockchainMemo":{"type":"string","nullable":true,"description":"Blockchain memo (for chains that require it)"},"accountId":{"type":"string","nullable":true,"description":"Account ID for the deposit destination","example":"acc_abc123"}},"required":["type","paymentRail","toAddress","amount"]},"FiatDepositInstructionsDto":{"type":"object","properties":{"type":{"type":"string","description":"Instruction type","example":"fiat"},"paymentRail":{"type":"string","description":"Payment rail","example":"ACH"},"direction":{"nullable":true,"enum":["CREDIT","DEBIT"],"type":"string","description":"ACH direction when the funding instructions are ACH-specific","example":"CREDIT"},"amount":{"description":"Amount to deposit","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]},"bankName":{"type":"string","nullable":true,"description":"Bank name"},"bankAddress":{"nullable":true,"description":"Bank address (structured)","type":"object","allOf":[{"$ref":"#/components/schemas/BankAddressDto"}]},"accountNumber":{"type":"string","nullable":true,"description":"Account number"},"routingNumber":{"type":"string","nullable":true,"description":"Routing number (US)"},"beneficiaryName":{"type":"string","nullable":true,"description":"Beneficiary name"},"beneficiaryAddress":{"nullable":true,"description":"Beneficiary address (structured)","type":"object","allOf":[{"$ref":"#/components/schemas/BankAddressDto"}]},"iban":{"type":"string","nullable":true,"description":"IBAN (international)"},"swiftBic":{"type":"string","nullable":true,"description":"SWIFT/BIC code"},"depositMessage":{"type":"string","nullable":true,"description":"Deposit message/reference to include in the transfer"},"clabe":{"type":"string","nullable":true,"description":"CLABE (Mexico)"},"accountId":{"type":"string","nullable":true,"description":"Account ID for the deposit destination","example":"vba_abc123"}},"required":["type","paymentRail","amount"]},"TransferRefundResponseDto":{"type":"object","properties":{"status":{"enum":["INITIATED","COMPLETED"],"type":"string","description":"Current refund status","example":"COMPLETED"},"reason":{"type":"string","nullable":true,"description":"Reason the transfer was refunded","example":"Fees exceed deposit amount"},"amount":{"nullable":true,"description":"Refund amount with currency details","type":"object","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]},"address":{"type":"string","nullable":true,"description":"Destination address used for the refund","example":"0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb"},"txHash":{"type":"string","nullable":true,"description":"Refund transaction hash","example":"0x1234567890abcdef..."},"initiatedAt":{"type":"string","nullable":true,"description":"When the refund was initiated","format":"date-time"},"completedAt":{"type":"string","nullable":true,"description":"When the refund completed","format":"date-time"}},"required":["status"]},"TransferSourceResponseDto":{"type":"object","properties":{"currency":{"type":"string","description":"Source currency code","example":"usd"},"fundingCurrency":{"type":"string","nullable":true,"description":"Asset the transfer was funded with when it differs from the settlement currency (e.g. a stablecoin deposit settled as fiat at face value)","example":"usdc"},"paymentRail":{"type":"string","description":"Source payment rail","example":"ACH"},"direction":{"nullable":true,"enum":["CREDIT","DEBIT"],"type":"string","description":"ACH direction when the source rail is ACH","example":"CREDIT"},"accountId":{"type":"string","nullable":true,"description":"Account ID if applicable","example":"vba_abc123"},"accountType":{"nullable":true,"enum":["VIRTUAL_BANK","VIRTUAL_WALLET","INFINITE_BANK","INFINITE_WALLET","EXTERNAL_BANK","EXTERNAL_WALLET","EXTERNAL_PROXY","PROVIDER_BALANCE"],"type":"string","description":"Account type for quick filtering","example":"VIRTUAL_BANK"},"externalAccountId":{"type":"string","nullable":true,"description":"External account ID if applicable","example":"ext_bank_456"},"fromAddress":{"type":"string","nullable":true,"description":"Source wallet address (for crypto sources)","example":"0x1234567890abcdef1234567890abcdef12345678"},"refundAccountId":{"type":"string","nullable":true,"description":"Customer wallet account ID (inw_xxx or ewa_xxx) that receives refunds for failed crypto transfers or when fees exceed deposit","example":"inw_abc123"},"accountName":{"type":"string","nullable":true,"description":"Account holder name","example":"Acme Corporation"}},"required":["currency","paymentRail"]},"TransferDestinationResponseDto":{"type":"object","properties":{"currency":{"type":"string","description":"Destination currency code","example":"USDC"},"paymentRail":{"type":"string","description":"Destination payment rail","example":"ETHEREUM"},"accountId":{"type":"string","nullable":true,"description":"Account ID if applicable","example":"vwa_def456"},"accountType":{"nullable":true,"enum":["VIRTUAL_BANK","VIRTUAL_WALLET","INFINITE_BANK","INFINITE_WALLET","EXTERNAL_BANK","EXTERNAL_WALLET","EXTERNAL_PROXY","PROVIDER_BALANCE"],"type":"string","description":"Account type for quick filtering","example":"EXTERNAL_BANK"},"externalAccountId":{"type":"string","nullable":true,"description":"External account ID if applicable","example":"ext_bank_789"},"toAddress":{"type":"string","nullable":true,"description":"Destination wallet address (for crypto destinations)","example":"0x1234567890abcdef1234567890abcdef12345678"},"accountName":{"type":"string","nullable":true,"description":"Account holder name","example":"Acme Corporation"},"wireMessage":{"type":"string","nullable":true,"description":"Wire message if applicable","example":"Payment for invoice INV-2026-001"},"achReference":{"type":"string","nullable":true,"description":"ACH reference if applicable","example":"ORDER123"},"swiftReference":{"type":"string","nullable":true,"description":"SWIFT reference if applicable","example":"Payment for invoice INV-2026-001"},"rtpReference":{"type":"string","nullable":true,"description":"RTP reference if applicable","example":"Payment for invoice INV-2026-001"},"payoutReference":{"type":"string","nullable":true,"description":"Payment reference that appears on the recipient bank statement, for fiat payouts. Populated once the payout has been initiated.","example":"INV2026"}},"required":["currency","paymentRail"]},"TransferDeveloperFeeDto":{"type":"object","properties":{"amount":{"nullable":true,"description":"Total developer fee collected for this transfer. Null until the fee has been collected.","type":"object","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]},"fixed":{"type":"string","nullable":true,"description":"Configured fixed fee component, in minor units of the source currency.","example":"100"},"percent":{"type":"number","nullable":true,"description":"Configured variable fee component as a decimal fraction (e.g., 0.005 = 0.5%).","example":0.005},"txHash":{"type":"string","nullable":true,"description":"Transaction hash of the on-chain movement that paid the fee out to your configured fee wallet. Shared with the payout hash when the fee was split atomically in the same transaction. Null when the fee settled without a dedicated on-chain hop.","example":"0x1234567890abcdef..."}}},"TransferStepDto":{"type":"object","properties":{"id":{"type":"string","description":"Step ID","example":"tleg_abc123"},"sequence":{"type":"number","description":"Sequence in the route (0-indexed)","example":0},"type":{"enum":["DEPOSIT_CRYPTO","DEPOSIT_FIAT","ONRAMP","CONVERT","OFFRAMP","CRYPTO_TRANSFER","BRIDGE","OUTBOUND_TOP_UP","INBOUND_TOP_UP","REFUND_CRYPTO","REFUND_FIAT","LIQUIDITY_ADVANCE"],"type":"string","description":"Step type","example":"DEPOSIT_CRYPTO"},"inputCurrency":{"type":"string","description":"Input currency","example":"USDC"},"outputCurrency":{"type":"string","description":"Output currency","example":"USD"},"inputRail":{"type":"string","description":"Input rail","example":"ETHEREUM"},"outputRail":{"type":"string","description":"Output rail","example":"ACH"},"status":{"enum":["PENDING","IN_PROGRESS","COMPLETED","FAILED","SKIPPED"],"type":"string","description":"Step status","example":"PENDING"},"startedAt":{"type":"string","nullable":true,"description":"When the step started processing","format":"date-time"},"completedAt":{"type":"string","nullable":true,"description":"When the step completed","format":"date-time"},"uetr":{"type":"string","nullable":true,"description":"SWIFT UETR (Universal End-to-End Transaction Reference)","example":"9b6f37f2-21f0-4b2b-b03c-1893364782ce"},"imad":{"type":"string","nullable":true,"description":"Wire IMAD (Input Message Accountability Data)","example":"20260309EREBBANK000002"},"omad":{"type":"string","nullable":true,"description":"Wire OMAD (Output Message Accountability Data)","example":"20260309MMQFMP0B012345"},"achTraceNumber":{"type":"string","nullable":true,"description":"ACH trace number from the payment network","example":"021000021234567"},"txHash":{"type":"string","nullable":true,"description":"Blockchain transaction hash. Populated for on-chain customer wallet movements: crypto deposits, crypto sends to the destination wallet, and crypto refunds. Null for internal settlement steps.","example":"0x1234567890abcdef..."},"developerFee":{"nullable":true,"description":"Developer fee collected on this step. Null for steps that carried no fee.","type":"object","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]},"feeTxHash":{"type":"string","nullable":true,"description":"Transaction hash of the on-chain movement that paid this step's developer fee to your configured fee wallet. Matches txHash when the fee was split atomically in the same transaction; null when the fee settled without a dedicated on-chain hop.","example":"0x1234567890abcdef..."}},"required":["id","sequence","type","inputCurrency","outputCurrency","inputRail","outputRail","status"]},"TransferResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Transfer ID (tfr_xxx)","example":"tfr_1234567890abcdef"},"organizationId":{"type":"string","description":"Organization ID","example":"org_abc123"},"clientReferenceId":{"type":"string","nullable":true,"description":"Client's internal reference ID","example":"order_abc123"},"sourceCustomerId":{"type":"string","description":"Source customer ID","example":"cus_abc123"},"counterpartyId":{"type":"string","nullable":true,"description":"Counterparty ID for third-party recipient transfers","example":"cp_abc123"},"flow":{"enum":["CRYPTO_TO_CRYPTO","CRYPTO_TO_FIAT","FIAT_TO_CRYPTO","FIAT_TO_FIAT","FIAT_TO_CRYPTO_TO_FIAT","FX","INTERNAL","FEE_CRYPTO","REFUND_CRYPTO","REFUND_FIAT"],"type":"string","description":"Transfer flow type describing the asset conversion","example":"CRYPTO_TO_FIAT"},"status":{"enum":["DRAFT","PENDING_AUTHORIZATION","IN_REVIEW","PENDING","PROCESSING","COMPLETED","FAILED","CANCELLED","REVERSED"],"type":"string","description":"Transfer status","example":"COMPLETED"},"source":{"description":"Source payment details","allOf":[{"$ref":"#/components/schemas/TransferSourceResponseDto"}]},"destination":{"description":"Destination payment details","allOf":[{"$ref":"#/components/schemas/TransferDestinationResponseDto"}]},"sourceAmount":{"description":"Source amount with currency details","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]},"destinationAmount":{"nullable":true,"description":"Destination amount with currency details","type":"object","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]},"refund":{"nullable":true,"description":"Refund details when this transfer has been refunded or a refund is in progress","type":"object","allOf":[{"$ref":"#/components/schemas/TransferRefundResponseDto"}]},"quoteId":{"type":"string","nullable":true,"description":"Quote ID if transfer was created from a quote","example":"quote_abc123"},"exchangeRate":{"type":"string","nullable":true,"description":"Exchange rate applied to the currency conversion, inclusive of all fees. Expressed on minor-unit amounts: destinationAmount = sourceAmount * exchangeRate. Populated for FX trades.","example":"0.99985"},"developerFeeFixed":{"type":"string","nullable":true,"description":"Fixed developer fee in minor units of source currency. Prefer the `developerFee` object, which also carries the collected amount and payout hash.","example":"100"},"developerFeePercent":{"type":"number","nullable":true,"description":"Variable developer fee as decimal percentage (e.g., 0.005 = 0.5%). Prefer the `developerFee` object, which also carries the collected amount and payout hash.","example":0.005},"developerFee":{"nullable":true,"description":"Developer fee charged on this transfer: the configured components plus the collected amount and the on-chain payout hash for reconciliation against your fee wallet. Null when the transfer has no developer fee. Per-step collected amounts and fee tx hashes are on `legs[]`.","type":"object","allOf":[{"$ref":"#/components/schemas/TransferDeveloperFeeDto"}]},"depositInstructions":{"description":"Deposit instructions if customer needs to send funds (onramps). Either crypto or fiat instructions depending on the transfer flow.","nullable":true,"oneOf":[{"$ref":"#/components/schemas/CryptoDepositInstructionsDto"},{"$ref":"#/components/schemas/FiatDepositInstructionsDto"}]},"createdAt":{"type":"string","description":"Transfer creation date","format":"date-time","example":"2026-09-15T10:00:00.000Z"},"updatedAt":{"type":"string","description":"Transfer last update date","format":"date-time","example":"2026-09-15T10:00:00.000Z"},"legs":{"description":"Transfer route legs (steps in the transfer)","type":"array","items":{"$ref":"#/components/schemas/TransferStepDto"}},"currentLegIndex":{"type":"number","nullable":true,"description":"Index of the current active leg in the legs array (0-indexed). Null if all legs are done.","example":0},"fundingNeeded":{"type":"boolean","description":"Whether the transfer is waiting for the customer to send funds (deposit)","example":false},"isThirdParty":{"type":"boolean","description":"Whether this is a third-party payment (destination account belongs to someone other than the customer)","example":false},"remarks":{"type":"string","nullable":true,"description":"Free-form remarks or notes about the transfer","example":"Partial payment - remaining balance to be paid next month"},"internalRemarks":{"type":"string","nullable":true,"description":"Internal remarks visible only within your organization. Never forwarded to payment rails or counterparties."},"uetr":{"type":"string","nullable":true,"description":"SWIFT UETR (Universal End-to-End Transaction Reference)","example":"9b6f37f2-21f0-4b2b-b03c-1893364782ce"},"imad":{"type":"string","nullable":true,"description":"Wire IMAD (Input Message Accountability Data)","example":"20260309EREBBANK000002"},"omad":{"type":"string","nullable":true,"description":"Wire OMAD (Output Message Accountability Data)","example":"20260309MMQFMP0B012345"},"achTraceNumber":{"type":"string","nullable":true,"description":"ACH trace number from the payment network","example":"021000021234567"},"txHash":{"type":"string","nullable":true,"description":"Blockchain transaction hash","example":"0x1234567890abcdef..."},"systemRemark":{"type":"string","nullable":true,"description":"System-generated status note with important transfer context for the customer","example":"Tracking is unavailable for this SWIFT transfer. We will auto-complete it after 24 hours and mark it with an asterisk because settlement is assumed rather than confirmed."},"metadata":{"type":"object","description":"Additional non-contractual transfer metadata for UI display","additionalProperties":true,"example":{"swiftRouting":{"source":"GPI_ROUTE","senderBic":"CHASUS33","receiverBic":"CLRBGB22","checkedAt":"2026-05-10T16:34:42.597Z","steps":[{"label":"Sender bank","bic":"CHASUS33","bankName":"JP Morgan Chase","status":"Confirmed Active"}]}}},"estimatedSettlementAt":{"type":"string","nullable":true,"description":"Estimated time the recipient will receive funds. Best-effort projection — fiat rails account for bank cutoff times, weekends, and US Federal Reserve holidays; crypto conversions project from recently observed processing times for the route. Not a guarantee.","format":"date-time","example":"2026-05-26T13:00:00.000Z"},"nextCutoffAt":{"type":"string","nullable":true,"description":"Next time the customer can submit and still settle same business day. Past this time, transfers settle next business day.","format":"date-time","example":"2026-05-19T19:00:00.000Z"},"cutoffTimezone":{"type":"string","nullable":true,"description":"IANA timezone for the cutoff time, e.g. \"America/New_York\".","example":"America/New_York"},"counterparty":{"nullable":true,"description":"Expanded counterparty details (only included when expand=counterparty)","oneOf":[{"$ref":"#/components/schemas/CounterpartyResponseDto"}],"allOf":[{"$ref":"#/components/schemas/CounterpartyResponseDto"}]}},"required":["id","organizationId","sourceCustomerId","flow","status","source","destination","sourceAmount","createdAt","updatedAt","legs","fundingNeeded"]},"CorrespondentBankDto":{"type":"object","properties":{"name":{"type":"string","nullable":true,"description":"Bank name"},"swiftCode":{"type":"string","nullable":true,"description":"SWIFT/BIC code","example":"IRVTUS3NXXX"},"accountNumber":{"type":"string","nullable":true,"description":"Account number","example":"9876543210"}}},"TransferDetailResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Transfer ID (tfr_xxx)","example":"tfr_1234567890abcdef"},"organizationId":{"type":"string","description":"Organization ID","example":"org_abc123"},"clientReferenceId":{"type":"string","nullable":true,"description":"Client's internal reference ID","example":"order_abc123"},"sourceCustomerId":{"type":"string","description":"Source customer ID","example":"cus_abc123"},"counterpartyId":{"type":"string","nullable":true,"description":"Counterparty ID for third-party recipient transfers","example":"cp_abc123"},"flow":{"enum":["CRYPTO_TO_CRYPTO","CRYPTO_TO_FIAT","FIAT_TO_CRYPTO","FIAT_TO_FIAT","FIAT_TO_CRYPTO_TO_FIAT","FX","INTERNAL","FEE_CRYPTO","REFUND_CRYPTO","REFUND_FIAT"],"type":"string","description":"Transfer flow type describing the asset conversion","example":"CRYPTO_TO_FIAT"},"status":{"enum":["DRAFT","PENDING_AUTHORIZATION","IN_REVIEW","PENDING","PROCESSING","COMPLETED","FAILED","CANCELLED","REVERSED"],"type":"string","description":"Transfer status","example":"COMPLETED"},"source":{"description":"Source payment details","allOf":[{"$ref":"#/components/schemas/TransferSourceResponseDto"}]},"destination":{"description":"Destination payment details","allOf":[{"$ref":"#/components/schemas/TransferDestinationResponseDto"}]},"sourceAmount":{"description":"Source amount with currency details","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]},"destinationAmount":{"nullable":true,"description":"Destination amount with currency details","type":"object","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]},"refund":{"nullable":true,"description":"Refund details when this transfer has been refunded or a refund is in progress","type":"object","allOf":[{"$ref":"#/components/schemas/TransferRefundResponseDto"}]},"quoteId":{"type":"string","nullable":true,"description":"Quote ID if transfer was created from a quote","example":"quote_abc123"},"exchangeRate":{"type":"string","nullable":true,"description":"Exchange rate applied to the currency conversion, inclusive of all fees. Expressed on minor-unit amounts: destinationAmount = sourceAmount * exchangeRate. Populated for FX trades.","example":"0.99985"},"developerFeeFixed":{"type":"string","nullable":true,"description":"Fixed developer fee in minor units of source currency. Prefer the `developerFee` object, which also carries the collected amount and payout hash.","example":"100"},"developerFeePercent":{"type":"number","nullable":true,"description":"Variable developer fee as decimal percentage (e.g., 0.005 = 0.5%). Prefer the `developerFee` object, which also carries the collected amount and payout hash.","example":0.005},"developerFee":{"nullable":true,"description":"Developer fee charged on this transfer: the configured components plus the collected amount and the on-chain payout hash for reconciliation against your fee wallet. Null when the transfer has no developer fee. Per-step collected amounts and fee tx hashes are on `legs[]`.","type":"object","allOf":[{"$ref":"#/components/schemas/TransferDeveloperFeeDto"}]},"depositInstructions":{"description":"Deposit instructions if customer needs to send funds (onramps). Either crypto or fiat instructions depending on the transfer flow.","nullable":true,"oneOf":[{"$ref":"#/components/schemas/CryptoDepositInstructionsDto"},{"$ref":"#/components/schemas/FiatDepositInstructionsDto"}]},"createdAt":{"type":"string","description":"Transfer creation date","format":"date-time","example":"2026-09-15T10:00:00.000Z"},"updatedAt":{"type":"string","description":"Transfer last update date","format":"date-time","example":"2026-09-15T10:00:00.000Z"},"legs":{"description":"Transfer route legs (steps in the transfer)","type":"array","items":{"$ref":"#/components/schemas/TransferStepDto"}},"currentLegIndex":{"type":"number","nullable":true,"description":"Index of the current active leg in the legs array (0-indexed). Null if all legs are done.","example":0},"fundingNeeded":{"type":"boolean","description":"Whether the transfer is waiting for the customer to send funds (deposit)","example":false},"isThirdParty":{"type":"boolean","description":"Whether this is a third-party payment (destination account belongs to someone other than the customer)","example":false},"remarks":{"type":"string","nullable":true,"description":"Free-form remarks or notes about the transfer","example":"Partial payment - remaining balance to be paid next month"},"internalRemarks":{"type":"string","nullable":true,"description":"Internal remarks visible only within your organization. Never forwarded to payment rails or counterparties."},"uetr":{"type":"string","nullable":true,"description":"SWIFT UETR (Universal End-to-End Transaction Reference)","example":"9b6f37f2-21f0-4b2b-b03c-1893364782ce"},"imad":{"type":"string","nullable":true,"description":"Wire IMAD (Input Message Accountability Data)","example":"20260309EREBBANK000002"},"omad":{"type":"string","nullable":true,"description":"Wire OMAD (Output Message Accountability Data)","example":"20260309MMQFMP0B012345"},"achTraceNumber":{"type":"string","nullable":true,"description":"ACH trace number from the payment network","example":"021000021234567"},"txHash":{"type":"string","nullable":true,"description":"Blockchain transaction hash","example":"0x1234567890abcdef..."},"systemRemark":{"type":"string","nullable":true,"description":"System-generated status note with important transfer context for the customer","example":"Tracking is unavailable for this SWIFT transfer. We will auto-complete it after 24 hours and mark it with an asterisk because settlement is assumed rather than confirmed."},"metadata":{"type":"object","description":"Additional non-contractual transfer metadata for UI display","additionalProperties":true,"example":{"swiftRouting":{"source":"GPI_ROUTE","senderBic":"CHASUS33","receiverBic":"CLRBGB22","checkedAt":"2026-05-10T16:34:42.597Z","steps":[{"label":"Sender bank","bic":"CHASUS33","bankName":"JP Morgan Chase","status":"Confirmed Active"}]}}},"estimatedSettlementAt":{"type":"string","nullable":true,"description":"Estimated time the recipient will receive funds. Best-effort projection — fiat rails account for bank cutoff times, weekends, and US Federal Reserve holidays; crypto conversions project from recently observed processing times for the route. Not a guarantee.","format":"date-time","example":"2026-05-26T13:00:00.000Z"},"nextCutoffAt":{"type":"string","nullable":true,"description":"Next time the customer can submit and still settle same business day. Past this time, transfers settle next business day.","format":"date-time","example":"2026-05-19T19:00:00.000Z"},"cutoffTimezone":{"type":"string","nullable":true,"description":"IANA timezone for the cutoff time, e.g. \"America/New_York\".","example":"America/New_York"},"counterparty":{"nullable":true,"description":"Expanded counterparty details (only included when expand=counterparty)","oneOf":[{"$ref":"#/components/schemas/CounterpartyResponseDto"}],"allOf":[{"$ref":"#/components/schemas/CounterpartyResponseDto"}]},"correspondentBank":{"nullable":true,"description":"Correspondent/intermediary bank details (when applicable)","type":"object","allOf":[{"$ref":"#/components/schemas/CorrespondentBankDto"}]},"documentIds":{"description":"IDs of documents associated with this transfer","example":["doc_abc123","doc_def456"],"type":"array","items":{"type":"string"}},"sourceAccount":{"nullable":true,"description":"Expanded source account details (only included when expand=sourceAccount)","oneOf":[{"$ref":"#/components/schemas/AccountResponseDto"}],"allOf":[{"$ref":"#/components/schemas/AccountResponseDto"}]},"destinationAccount":{"nullable":true,"description":"Expanded destination account details (only included when expand=destinationAccount)","oneOf":[{"$ref":"#/components/schemas/AccountResponseDto"}],"allOf":[{"$ref":"#/components/schemas/AccountResponseDto"}]},"sourceCustomer":{"nullable":true,"description":"Expanded source customer details (only included when expand=sourceCustomer)","oneOf":[{"$ref":"#/components/schemas/CustomerResponseDto"}],"allOf":[{"$ref":"#/components/schemas/CustomerResponseDto"}]}},"required":["id","organizationId","sourceCustomerId","flow","status","source","destination","sourceAmount","createdAt","updatedAt","legs","fundingNeeded"]},"UpdateTransferSourceDto":{"type":"object","properties":{"currency":{"type":"string","enum":["USD","EUR","MXN","USAT","USDC","USDT","BTC"],"description":"Source currency code","example":"USDC"},"paymentRail":{"type":"string","enum":["ACH","ACH_SAME_DAY","WIRE","FED_NOW","RTP","EREBOR","EREBOR_RAIL","BALANCE","SWIFT","SEPA","SEPA_INSTANT","TIPS","FASTER_PAYMENTS","BACS","CHAPS","ELIXIR","NICS","EFT","INTERAC","NPP","BECS","UPI","IMPS","IMPS_WITH_FIRC","NEFT","RTGS","BI_FAST","ARTAJASA","PIX","TED","TEF","SPEI","COELSA","SINPE","CIPS","CFXPS","CHATS","ZENGIN","KFTC","FAST_SG","MEPS","DUITNOW","PROMPTPAY","INSTAPAY","PESONET","NAPAS","BEFTN","SLIPS","ZAHAV","GHIPSS","NIBSS","PESALINK","RTC_ZA","TZS_RTGS","EGP_ACH","JOD_ACH","NPSS","MADA","QPS","DOP_ACH","GTQ_ACH","HNL_ACH","PEN_ACH","JMD_ACH","USD_ACH_SV","USD_ACH_EC","CLP_TEF","PSE","COP_ACH","BOB_RTGS","PYG_ACH","CERTIS","DKK_TIPS","SENT","NKS","BANKGIROT","HKD_FPS","IBFT","TRY_FAST","ETHEREUM","BASE","POLYGON","SOLANA","TRON","BITCOIN","ARBITRUM"],"description":"Payment rail for the source funds","example":"ETHEREUM"},"refundAccountId":{"type":"string","description":"Customer wallet account ID (inw_xxx or ewa_xxx) that receives refunds for failed crypto transfers or when fees exceed deposit. Must belong to the customer and include a wallet address; validated at request time.","example":"inw_abc123"}}},"UpdateTransferDestinationDto":{"type":"object","properties":{"correspondentBankName":{"type":"string","maxLength":200,"description":"Correspondent/intermediary bank name","example":"Bank of America"},"correspondentBankSwiftCode":{"type":"string","description":"Correspondent/intermediary bank SWIFT/BIC code (8 or 11 characters)","example":"IRVTUS3NXXX"},"correspondentAccountNumber":{"type":"string","maxLength":64,"description":"Correspondent/intermediary account number","example":"9876543210"},"accountId":{"type":"string","description":"Account ID for the destination of funds","example":"acc_def456"},"currency":{"type":"string","enum":["USD","EUR","MXN","USAT","USDC","USDT","BTC"],"description":"Destination currency code","example":"USDC"},"paymentRail":{"type":"string","enum":["ACH","ACH_SAME_DAY","WIRE","FED_NOW","RTP","EREBOR","EREBOR_RAIL","BALANCE","SWIFT","SEPA","SEPA_INSTANT","TIPS","FASTER_PAYMENTS","BACS","CHAPS","ELIXIR","NICS","EFT","INTERAC","NPP","BECS","UPI","IMPS","IMPS_WITH_FIRC","NEFT","RTGS","BI_FAST","ARTAJASA","PIX","TED","TEF","SPEI","COELSA","SINPE","CIPS","CFXPS","CHATS","ZENGIN","KFTC","FAST_SG","MEPS","DUITNOW","PROMPTPAY","INSTAPAY","PESONET","NAPAS","BEFTN","SLIPS","ZAHAV","GHIPSS","NIBSS","PESALINK","RTC_ZA","TZS_RTGS","EGP_ACH","JOD_ACH","NPSS","MADA","QPS","DOP_ACH","GTQ_ACH","HNL_ACH","PEN_ACH","JMD_ACH","USD_ACH_SV","USD_ACH_EC","CLP_TEF","PSE","COP_ACH","BOB_RTGS","PYG_ACH","CERTIS","DKK_TIPS","SENT","NKS","BANKGIROT","HKD_FPS","IBFT","TRY_FAST","ETHEREUM","BASE","POLYGON","SOLANA","TRON","BITCOIN","ARBITRUM"],"description":"Payment rail for destination","example":"ETHEREUM"},"wireMessage":{"type":"string","maxLength":140,"description":"Wire transfer message (max 140 chars)"},"sepaReference":{"type":"string","maxLength":140,"pattern":"^[a-zA-Z0-9&\\-./ ]{6,140}$","description":"SEPA reference (6-140 chars)"},"achReference":{"type":"string","maxLength":10,"pattern":"^[a-zA-Z0-9 ]{1,10}$","description":"ACH reference (max 10 chars)"},"blockchainMemo":{"type":"string","description":"Blockchain memo"},"swiftReference":{"type":"string","maxLength":190,"description":"SWIFT reference (max 190 chars)"},"rtpReference":{"type":"string","maxLength":140,"pattern":"^[a-zA-Z0-9&\\-./ ]{0,140}$","description":"RTP reference (max 140 chars)"}}},"UpdateTransferDto":{"type":"object","properties":{"clientReferenceId":{"type":"string","maxLength":256,"description":"Client's internal reference ID","example":"order_abc123"},"counterpartyId":{"type":"string","description":"Counterparty ID for third-party recipient transfers. Omit for first-party transfers.","example":"cp_abc123"},"amount":{"description":"Transfer amount","allOf":[{"$ref":"#/components/schemas/MoneyInputDto"}]},"quoteId":{"type":"string","description":"Quote ID to use for rate and amount calculation","example":"quote_xyz789"},"source":{"description":"Source payment details","allOf":[{"$ref":"#/components/schemas/UpdateTransferSourceDto"}]},"destination":{"description":"Destination payment details","allOf":[{"$ref":"#/components/schemas/UpdateTransferDestinationDto"}]},"paymentReason":{"enum":["CAPITAL_CONTRIBUTIONS","CHARITABLE_CONTRIBUTIONS","CONSULTING_FEES","CORPORATE_TAX_PAYMENTS","DOWN_PAYMENTS_FOR_REAL_ESTATE","EDUCATION_FEES","EMPLOYEE_SALARIES_OR_WAGES","EXPENSES_REIMBURSEMENT","GIFTS","GOVERNMENT_GRANTS","INCOME_TAX_PAYMENTS","INHERITANCE_PAYMENTS","INSURANCE_CLAIM_PAYOUTS","INSURANCE_PREMIUM_PAYMENTS","INVESTMENTS","LOAN_ADVANCES","MORTGAGE_PAYMENTS","OTHER","PAYMENT_FOR_GOODS_AND_SERVICES","PERSONAL_TRANSFERS","REAL_ESTATE_PURCHASES","REMITTANCES","RENT","REPAYMENT_OF_LOANS","ROYALTIES","SELF","TRADE_SETTLEMENT","TRUST_FUND_DISTRIBUTIONS","UTILITY_BILLS","WELFARE_OR_BENEFITS","WINNINGS_AND_PRIZES"],"type":"string","description":"Reason for the payment"},"remarks":{"type":"string","maxLength":1000,"description":"Free-form remarks or notes about the transfer (e.g., invoice discrepancy explanations)","example":"Partial payment - remaining balance to be paid next month"},"internalRemarks":{"type":"string","maxLength":1000,"description":"Internal remarks visible only within your organization. Never forwarded to payment rails (SWIFT, ACH, etc.) or counterparties.","example":"Approved by ops on 2026-04-15"},"documentIds":{"description":"Supporting document IDs for the transfer","type":"array","items":{"type":"string"}}}},"CancelTransferDto":{"type":"object","properties":{"reason":{"type":"string","maxLength":500,"description":"Optional reason for cancellation. This will be stored in the transfer metadata.","example":"Customer requested cancellation"}}},"FundTransferFromBalanceDto":{"type":"object","properties":{"fundingCustomerId":{"type":"string","description":"The customer ID whose Infinite Wallet balance will fund this transfer. Does not need to be the transfer source customer, but must be in the same organization.","example":"cus_abc123"},"note":{"type":"string","description":"Optional note explaining why this customer is funding the transfer","example":"Funded by treasury account on behalf of sender"}},"required":["fundingCustomerId"]},"PayoutBatchSourceResponseDto":{"type":"object","properties":{"currency":{"type":"string","example":"USDT"},"paymentRail":{"type":"string","example":"ETHEREUM"}},"required":["currency","paymentRail"]},"PayoutBatchItemDestinationResponseDto":{"type":"object","properties":{"type":{"type":"string","enum":["EXTERNAL_WALLET"],"example":"EXTERNAL_WALLET"},"currency":{"type":"string","example":"USDT"},"paymentRail":{"type":"string","example":"ETHEREUM"},"accountId":{"type":"string","example":"ewa_abc123","description":"Public destination account ID."},"address":{"type":"string","example":"0x1234567890abcdef1234567890abcdef12345678","description":"Destination wallet address snapshot from batch creation."}},"required":["type","currency","paymentRail","accountId","address"]},"PayoutBatchItemResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"pbi_abc123"},"position":{"type":"number","example":0,"description":"0-based position within the batch"},"amount":{"$ref":"#/components/schemas/MoneyOutputDto"},"counterpartyId":{"type":"string","example":"cp_abc123"},"destination":{"$ref":"#/components/schemas/PayoutBatchItemDestinationResponseDto"},"transferId":{"type":"string","nullable":true,"example":"tfr_abc123","description":"Child transfer ID once created after approval."},"status":{"enum":["PENDING","TRANSFER_CREATED","COMPLETED","FAILED","CANCELLED"],"type":"string","example":"PENDING"},"clientReferenceId":{"type":"string","nullable":true,"example":"payroll_line_42"},"developerFeeFixed":{"type":"number","nullable":true,"example":100,"description":"Fixed developer fee in minor units."},"developerFeePercent":{"type":"number","nullable":true,"example":0.015,"description":"Developer fee as decimal percentage."},"errorMessage":{"type":"string","nullable":true,"description":"Customer-safe error when item creation or settlement failed."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","position","amount","counterpartyId","destination","status","createdAt","updatedAt"]},"PayoutBatchResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"pb_abc123"},"organizationId":{"type":"string","example":"org_abc123"},"onBehalfOf":{"type":"string","example":"cus_abc123"},"source":{"$ref":"#/components/schemas/PayoutBatchSourceResponseDto"},"status":{"enum":["DRAFT","PENDING_APPROVAL","PROCESSING","COMPLETED","PARTIALLY_COMPLETED","FAILED","CANCELLED","REJECTED"],"type":"string","example":"DRAFT"},"paymentReason":{"enum":["CAPITAL_CONTRIBUTIONS","CHARITABLE_CONTRIBUTIONS","CONSULTING_FEES","CORPORATE_TAX_PAYMENTS","DOWN_PAYMENTS_FOR_REAL_ESTATE","EDUCATION_FEES","EMPLOYEE_SALARIES_OR_WAGES","EXPENSES_REIMBURSEMENT","GIFTS","GOVERNMENT_GRANTS","INCOME_TAX_PAYMENTS","INHERITANCE_PAYMENTS","INSURANCE_CLAIM_PAYOUTS","INSURANCE_PREMIUM_PAYMENTS","INVESTMENTS","LOAN_ADVANCES","MORTGAGE_PAYMENTS","OTHER","PAYMENT_FOR_GOODS_AND_SERVICES","PERSONAL_TRANSFERS","REAL_ESTATE_PURCHASES","REMITTANCES","RENT","REPAYMENT_OF_LOANS","ROYALTIES","SELF","TRADE_SETTLEMENT","TRUST_FUND_DISTRIBUTIONS","UTILITY_BILLS","WELFARE_OR_BENEFITS","WINNINGS_AND_PRIZES"],"type":"string","example":"PAYMENT_FOR_GOODS_AND_SERVICES"},"items":{"type":"array","items":{"$ref":"#/components/schemas/PayoutBatchItemResponseDto"}},"rejectionReason":{"type":"string","nullable":true,"description":"Reason when the batch was rejected during review."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","organizationId","onBehalfOf","source","status","paymentReason","items","createdAt","updatedAt"]},"PayoutBatchSourceDto":{"type":"object","properties":{"currency":{"enum":["USDT","USDC"],"type":"string","description":"Source stablecoin. Supported: USDT, USDC.","example":"USDT"},"paymentRail":{"enum":["ETHEREUM","BASE","ARBITRUM","POLYGON","SOLANA","TRON"],"type":"string","description":"Source network. Supported per currency: USDT on Ethereum, Arbitrum, Polygon, Solana, Tron; USDC on Ethereum, Base, Arbitrum, Polygon, Solana.","example":"ETHEREUM"}},"required":["currency","paymentRail"]},"PayoutBatchDestinationDto":{"type":"object","properties":{"type":{"type":"string","enum":["EXTERNAL_WALLET"],"description":"Destination type. The initial Global Payouts launch supports `EXTERNAL_WALLET` destinations.","example":"EXTERNAL_WALLET"},"address":{"type":"string","description":"Recipient wallet address on the batch source network. Must match the address family of that chain (EVM, Solana, or Tron).","example":"0x1234567890abcdef1234567890abcdef12345678"}},"required":["type","address"]},"CreatePayoutBatchItemDto":{"type":"object","properties":{"amount":{"description":"Payout amount in the batch source stablecoin, minor units (6 decimals). Currency must equal the batch source currency.","example":{"currency":"USDT","rawValue":"1000000"},"allOf":[{"$ref":"#/components/schemas/MoneyInputDto"}]},"counterpartyId":{"type":"string","description":"Existing counterparty ID for the beneficiary. Required when inline beneficiary fields are omitted.","example":"cp_abc123"},"beneficiaryType":{"enum":["INDIVIDUAL","BUSINESS"],"type":"string","description":"Beneficiary type when creating a new counterparty. Required when `counterpartyId` is omitted.","example":"INDIVIDUAL"},"beneficiaryName":{"type":"string","description":"Beneficiary legal name when creating a new counterparty. Required when `counterpartyId` is omitted.","example":"Jane Doe"},"beneficiaryAddress":{"description":"Beneficiary address when creating a new counterparty. Required when `counterpartyId` is omitted.","allOf":[{"$ref":"#/components/schemas/AddressDto"}]},"destination":{"description":"Payout destination for this item.","allOf":[{"$ref":"#/components/schemas/PayoutBatchDestinationDto"}]},"clientReferenceId":{"type":"string","maxLength":256,"description":"Client's internal reference ID for this item (e.g. invoice or payroll line ID). Must be unique within the batch when provided.","example":"payroll_line_42"},"developerFeeFixed":{"type":"number","minimum":0,"description":"Fixed developer fee in minor units of source currency. Added on top of network fees and deducted from the transfer amount.","example":100},"developerFeePercent":{"type":"number","minimum":0,"maximum":0.1,"description":"Developer fee as decimal percentage (e.g., 0.015 for 1.5%). Maximum 0.1 (10%).","example":0.015}},"required":["amount","destination"]},"CreatePayoutBatchDto":{"type":"object","properties":{"onBehalfOf":{"type":"string","description":"Customer ID on whose behalf the batch is created.","example":"cus_abc123"},"source":{"description":"Source funding details. Draws the chosen stablecoin from the customer's provider-held balance on the chosen network.","allOf":[{"$ref":"#/components/schemas/PayoutBatchSourceDto"}]},"paymentReason":{"enum":["CAPITAL_CONTRIBUTIONS","CHARITABLE_CONTRIBUTIONS","CONSULTING_FEES","CORPORATE_TAX_PAYMENTS","DOWN_PAYMENTS_FOR_REAL_ESTATE","EDUCATION_FEES","EMPLOYEE_SALARIES_OR_WAGES","EXPENSES_REIMBURSEMENT","GIFTS","GOVERNMENT_GRANTS","INCOME_TAX_PAYMENTS","INHERITANCE_PAYMENTS","INSURANCE_CLAIM_PAYOUTS","INSURANCE_PREMIUM_PAYMENTS","INVESTMENTS","LOAN_ADVANCES","MORTGAGE_PAYMENTS","OTHER","PAYMENT_FOR_GOODS_AND_SERVICES","PERSONAL_TRANSFERS","REAL_ESTATE_PURCHASES","REMITTANCES","RENT","REPAYMENT_OF_LOANS","ROYALTIES","SELF","TRADE_SETTLEMENT","TRUST_FUND_DISTRIBUTIONS","UTILITY_BILLS","WELFARE_OR_BENEFITS","WINNINGS_AND_PRIZES"],"type":"string","description":"Reason for the payments (compliance/AML). Applied to every item.","example":"PAYMENT_FOR_GOODS_AND_SERVICES"},"items":{"minItems":1,"maxItems":100,"description":"Payout items (max 100). Each item pays the batch source stablecoin on the source network to an external wallet.","type":"array","items":{"$ref":"#/components/schemas/CreatePayoutBatchItemDto"}},"confirm":{"type":"boolean","description":"If true, submit the batch for review immediately. If false or omitted, the batch is created in DRAFT and can be confirmed later."}},"required":["onBehalfOf","source","paymentReason","items"]},"ServiceStatus":{"type":"string","enum":["operational","degraded","unavailable"],"description":"Worst status across all components. `operational` means send us traffic; anything else means route new payment traffic elsewhere until it returns to `operational`."},"HealthComponentsDto":{"type":"object","properties":{"api":{"description":"Whether the API is accepting requests and reading and writing data.","allOf":[{"$ref":"#/components/schemas/ServiceStatus"}]},"payments":{"description":"Whether new payments are being accepted and moved through settlement.","allOf":[{"$ref":"#/components/schemas/ServiceStatus"}]}},"required":["api","payments"]},"HealthResponseDto":{"type":"object","properties":{"status":{"description":"Worst status across all components. `operational` means send us traffic; anything else means route new payment traffic elsewhere until it returns to `operational`.","allOf":[{"$ref":"#/components/schemas/ServiceStatus"}]},"timestamp":{"type":"string","example":"2026-09-15T10:30:00.000Z","description":"When these checks last ran. Results are cached for a few seconds, so this trails the request by up to that long."},"components":{"description":"Per-component detail, so a partial impairment can be routed around without failing over everything.","allOf":[{"$ref":"#/components/schemas/HealthComponentsDto"}]}},"required":["status","timestamp","components"]},"CustomerRfiResponseDto":{"type":"object","properties":{"id":{"type":"string"},"caseId":{"type":"string"},"customerId":{"type":"string"},"customerName":{"type":"string"},"status":{"enum":["DRAFT","OPEN","SUBMITTED","UNDER_REVIEW","RESOLVED","CANCELLED"],"type":"string"},"publicStatus":{"enum":["NEEDS_INFORMATION","IN_REVIEW","APPROVED","REJECTED","CANCELLED"],"type":"string","description":"Customer-facing case status for parent portal and integrator APIs."},"dueAt":{"format":"date-time","type":"string","nullable":true},"openedAt":{"format":"date-time","type":"string","nullable":true},"submittedAt":{"format":"date-time","type":"string","nullable":true},"closedAt":{"format":"date-time","type":"string","nullable":true},"requestedFields":{"type":"array","items":{"$ref":"#/components/schemas/RequiredField"}},"requestedDocuments":{"type":"array","items":{"$ref":"#/components/schemas/RequiredDocument"}},"instructions":{"type":"string","nullable":true}},"required":["id","caseId","customerId","customerName","status","publicStatus","requestedFields","requestedDocuments"]},"WebhookMessageSummaryDto":{"type":"object","properties":{"id":{"type":"string","example":"msg_1234567890abcdef"},"eventType":{"type":"string","example":"transfer.completed"},"timestamp":{"type":"string","format":"date-time"},"tags":{"description":"Resource IDs carried on the message","example":["tfr_1234567890abcdef","cus_1234567890abcdef"],"type":"array","items":{"type":"string"}},"status":{"enum":["SUCCESS","PENDING","FAIL","SENDING","CANCELED"],"type":"string","description":"Delivery status to the endpoint. Only present when the list is scoped to an endpoint."},"nextAttempt":{"type":"string","nullable":true,"description":"Next scheduled retry, when delivery is still pending","format":"date-time"}},"required":["id","eventType","timestamp"]},"WebhookMessageListResponseDto":{"type":"object","properties":{"available":{"type":"boolean","description":"Whether delivery history is available for this organization. False when the organization uses a custom delivery integration."},"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookMessageSummaryDto"}},"iterator":{"type":"string","nullable":true,"description":"Cursor for the next page, when more results exist"},"done":{"type":"boolean","description":"Whether this is the last page"}},"required":["available","data","iterator","done"]},"WebhookMessageAttemptDto":{"type":"object","properties":{"id":{"type":"string","example":"atmpt_1234567890abcdef"},"endpointId":{"type":"string","example":"ep_1234567890abcdef"},"endpointUrl":{"type":"string","nullable":true,"example":"https://api.example.com/webhooks"},"status":{"enum":["SUCCESS","PENDING","FAIL","SENDING","CANCELED"],"type":"string"},"statusCode":{"type":"number","nullable":true,"example":200},"responseBody":{"type":"string","nullable":true,"description":"HTTP response body returned by the endpoint"},"durationMs":{"type":"number","nullable":true,"description":"Round-trip duration of the delivery attempt in milliseconds","example":132},"trigger":{"enum":["SCHEDULED","MANUAL"],"type":"string","description":"Whether the attempt was scheduled automatically or triggered manually (e.g. a resend)"},"timestamp":{"type":"string","format":"date-time"}},"required":["id","endpointId","status","trigger","timestamp"]},"WebhookMessageDetailResponseDto":{"type":"object","properties":{"id":{"type":"string","example":"msg_1234567890abcdef"},"eventType":{"type":"string","example":"transfer.completed"},"timestamp":{"type":"string","format":"date-time"},"tags":{"description":"Resource IDs carried on the message","type":"array","items":{"type":"string"}},"payload":{"type":"object","nullable":true,"additionalProperties":true,"description":"Request body delivered to the endpoint. Null when the payload has expired."},"attempts":{"type":"array","items":{"$ref":"#/components/schemas/WebhookMessageAttemptDto"}}},"required":["id","eventType","timestamp","payload","attempts"]},"ResendWebhookMessageDto":{"type":"object","properties":{"endpointId":{"type":"string","description":"Resend to a single endpoint. Defaults to every enabled endpoint subscribed to the message event type.","example":"ep_1234567890abcdef"}}},"ResendWebhookMessageResponseDto":{"type":"object","properties":{"eventType":{"type":"string","example":"transfer.completed"},"endpointIds":{"description":"Endpoints the message was resent to","type":"array","items":{"type":"string"}}},"required":["eventType","endpointIds"]},"EndpointResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Endpoint ID","example":"ep_1234567890abcdef"},"url":{"type":"string","description":"The webhook endpoint URL","example":"https://api.example.com/webhooks"},"description":{"type":"string","description":"Description of the endpoint","example":"Production webhook endpoint"},"filterTypes":{"description":"Event types sent to this endpoint. An empty array means the endpoint is subscribed to all event types.","example":["customer.created","customer.updated"],"type":"array","items":{"type":"string"}},"disabled":{"type":"boolean","description":"Whether the endpoint is disabled","example":false},"createdAt":{"type":"string","description":"Endpoint creation timestamp","example":"2026-09-15T10:30:00Z"},"updatedAt":{"type":"string","description":"Endpoint last update timestamp","example":"2026-09-15T10:30:00Z"},"metadata":{"type":"object","description":"Optional endpoint metadata","additionalProperties":true}},"required":["id","url","description","filterTypes","disabled","createdAt","updatedAt"]},"RecoverEndpointDto":{"type":"object","properties":{"since":{"type":"string","description":"Replay failed deliveries created at or after this timestamp","example":"2026-08-01T00:00:00Z"},"until":{"type":"string","description":"Only replay failed deliveries created before this timestamp","example":"2026-08-10T00:00:00Z"}},"required":["since"]},"RecoverEndpointResponseDto":{"type":"object","properties":{"status":{"enum":["RUNNING","FINISHED","FAILED"],"type":"string","description":"Status of the background replay task"}},"required":["status"]},"EndpointSecretResponseDto":{"type":"object","properties":{"key":{"type":"string","description":"Signing secret used to verify webhook signatures on this endpoint","example":"whsec_C2FVsBQIhrscChlQIMVub5sSYspob7oD"}},"required":["key"]},"CreateEndpointDto":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"The webhook endpoint URL","example":"https://api.example.com/webhooks"},"description":{"type":"string","description":"Description of the endpoint","example":"Production webhook endpoint"},"filterTypes":{"description":"Event types to send to this endpoint. Omit or pass an empty array to subscribe to all event types.","example":["customer.created","customer.updated"],"type":"array","items":{"type":"string"}},"metadata":{"type":"object","description":"Optional endpoint metadata","additionalProperties":true}},"required":["url","description"]},"UpdateEndpointDto":{"type":"object","properties":{"url":{"type":"string","format":"uri","description":"The webhook endpoint URL","example":"https://api.example.com/webhooks"},"description":{"type":"string","description":"Description of the endpoint","example":"Production webhook endpoint"},"filterTypes":{"description":"Event types to send to this endpoint. Pass an empty array to subscribe to all event types. Omit to leave unchanged.","example":["customer.created","customer.updated"],"type":"array","items":{"type":"string"}},"disabled":{"type":"boolean","description":"Disable or re-enable the endpoint. Disabled endpoints receive no events.","example":false},"metadata":{"type":"object","description":"Optional endpoint metadata","additionalProperties":true}}},"CreateQuoteDto":{"type":"object","properties":{"sourceAmount":{"description":"Source amount with currency. Provide either sourceAmount OR destinationAmount, not both.","example":{"currency":"USD","rawValue":"100000"},"allOf":[{"$ref":"#/components/schemas/MoneyInputDto"}]},"destinationAmount":{"description":"Destination amount to receive (exact receive mode). Provide either sourceAmount OR destinationAmount, not both.","example":{"currency":"USDC","rawValue":"100000000"},"allOf":[{"$ref":"#/components/schemas/MoneyInputDto"}]},"sourceCurrency":{"type":"string","enum":["USD","EUR","GBP","CAD","JPY","PHP","AUD","MXN","BRL","AED","ARS","BDT","BHD","BOB","CHF","CLP","CNY","CNH","COP","CRC","CZK","DKK","DOP","EGP","GHS","GTQ","HKD","HNL","HUF","IDR","ILS","INR","JMD","JOD","KES","KRW","KWD","LKR","MYR","NGN","NOK","NZD","PEN","PKR","PLN","PYG","QAR","RON","RSD","RUB","SAR","SEK","SGD","THB","TRY","TWD","TZS","VND","ZAR","USDC","USDT","DAI","ETH","BTC","SOL","TRX","EURC","USDB","PYUSD","USDP","CASH","USDS"],"description":"Source currency code (required when using destinationAmount for receive-exact mode)","example":"USD"},"destinationCurrency":{"type":"string","enum":["USD","EUR","GBP","CAD","JPY","PHP","AUD","MXN","BRL","AED","ARS","BDT","BHD","BOB","CHF","CLP","CNY","CNH","COP","CRC","CZK","DKK","DOP","EGP","GHS","GTQ","HKD","HNL","HUF","IDR","ILS","INR","JMD","JOD","KES","KRW","KWD","LKR","MYR","NGN","NOK","NZD","PEN","PKR","PLN","PYG","QAR","RON","RSD","RUB","SAR","SEK","SGD","THB","TRY","TWD","TZS","VND","ZAR","USDC","USDT","DAI","ETH","BTC","SOL","TRX","EURC","USDB","PYUSD","USDP","CASH","USDS"],"description":"Destination currency code (required when using sourceAmount, derived from destinationAmount when provided)","example":"USDC"},"destinationCountry":{"type":"string","description":"Destination country code (ISO 3166-1 alpha-2)","example":"US"},"holdQuote":{"type":"boolean","description":"Whether to hold the quote and create a DB entry","example":false,"default":false},"payinMethod":{"type":"string","enum":["ACH","ACH_SAME_DAY","WIRE","FED_NOW","RTP","EREBOR","EREBOR_RAIL","BALANCE","SWIFT","SEPA","SEPA_INSTANT","TIPS","FASTER_PAYMENTS","BACS","CHAPS","ELIXIR","NICS","EFT","INTERAC","NPP","BECS","UPI","IMPS","IMPS_WITH_FIRC","NEFT","RTGS","BI_FAST","ARTAJASA","PIX","TED","TEF","SPEI","COELSA","SINPE","CIPS","CFXPS","CHATS","ZENGIN","KFTC","FAST_SG","MEPS","DUITNOW","PROMPTPAY","INSTAPAY","PESONET","NAPAS","BEFTN","SLIPS","ZAHAV","GHIPSS","NIBSS","PESALINK","RTC_ZA","TZS_RTGS","EGP_ACH","JOD_ACH","NPSS","MADA","QPS","DOP_ACH","GTQ_ACH","HNL_ACH","PEN_ACH","JMD_ACH","USD_ACH_SV","USD_ACH_EC","CLP_TEF","PSE","COP_ACH","BOB_RTGS","PYG_ACH","CERTIS","DKK_TIPS","SENT","NKS","BANKGIROT","HKD_FPS","IBFT","TRY_FAST","ETHEREUM","BASE","POLYGON","SOLANA","TRON","BITCOIN","ARBITRUM"],"description":"Payment rail for source funds. For crypto, specify chain (ethereum, base, polygon, solana, tron). For fiat, specify network (ach, sepa, fast_sg).","example":"base"},"payoutMethod":{"type":"string","enum":["ACH","ACH_SAME_DAY","WIRE","FED_NOW","RTP","EREBOR","EREBOR_RAIL","BALANCE","SWIFT","SEPA","SEPA_INSTANT","TIPS","FASTER_PAYMENTS","BACS","CHAPS","ELIXIR","NICS","EFT","INTERAC","NPP","BECS","UPI","IMPS","IMPS_WITH_FIRC","NEFT","RTGS","BI_FAST","ARTAJASA","PIX","TED","TEF","SPEI","COELSA","SINPE","CIPS","CFXPS","CHATS","ZENGIN","KFTC","FAST_SG","MEPS","DUITNOW","PROMPTPAY","INSTAPAY","PESONET","NAPAS","BEFTN","SLIPS","ZAHAV","GHIPSS","NIBSS","PESALINK","RTC_ZA","TZS_RTGS","EGP_ACH","JOD_ACH","NPSS","MADA","QPS","DOP_ACH","GTQ_ACH","HNL_ACH","PEN_ACH","JMD_ACH","USD_ACH_SV","USD_ACH_EC","CLP_TEF","PSE","COP_ACH","BOB_RTGS","PYG_ACH","CERTIS","DKK_TIPS","SENT","NKS","BANKGIROT","HKD_FPS","IBFT","TRY_FAST","ETHEREUM","BASE","POLYGON","SOLANA","TRON","BITCOIN","ARBITRUM"],"description":"Payment rail for destination funds. For crypto, specify chain (ethereum, base, polygon, solana, tron). For fiat, specify network (ach, sepa, fast_sg).","example":"fast_sg"},"stablecoinParity":{"type":"boolean","description":"Treat stablecoin/fiat pairs as 1:1 (e.g., 1 USDT = 1 USD). Only applicable to stablecoin/fiat conversions. Any market difference is settled via postpaid billing. Defaults to true for eligible pairs.","example":true,"default":true},"onBehalfOf":{"type":"string","description":"Customer the quote is for. Some customers are configured for customer-specific pricing on stablecoin pairs; pass the customer the eventual transfer will execute for so the quoted rate matches it. Omitted: standard pricing.","example":"cus_abc123"}}},"FeeBreakdownDto":{"type":"object","properties":{"fixed":{"type":"number","nullable":true,"description":"Fixed fee amount","example":null},"variable":{"type":"number","nullable":true,"description":"Variable fee rate","example":null}},"required":["fixed","variable"]},"DeveloperFeeDto":{"type":"object","properties":{"fixed":{"type":"number","nullable":true,"description":"Fixed fee amount","example":null},"variable":{"type":"number","nullable":true,"description":"Variable fee rate","example":null}},"required":["fixed","variable"]},"RouteEstimateDto":{"type":"object","properties":{"estimatedReceiveAt":{"type":"string","description":"Estimated time when funds will be received","format":"date-time","example":"2026-09-17T10:30:00Z"},"estimatedMinutes":{"type":"number","description":"Estimated duration in minutes","example":2880},"nextCutoff":{"type":"string","description":"Next wire cutoff time (if applicable)","format":"date-time","example":"2026-09-15T15:00:00Z"},"cutoffTimezone":{"type":"string","description":"Timezone for the cutoff time","example":"Asia/Singapore"}},"required":["estimatedReceiveAt","estimatedMinutes"]},"RouteLegDto":{"type":"object","properties":{"type":{"type":"string","description":"Type of leg","example":"payout_fiat"},"inputCurrency":{"type":"string","description":"Input currency for this leg","example":"USDC"},"outputCurrency":{"type":"string","description":"Output currency for this leg","example":"USD"},"inputRail":{"type":"string","description":"Input rail for this leg","example":"ETHEREUM"},"outputRail":{"type":"string","description":"Output rail for this leg","example":"SWIFT"},"feeBps":{"type":"number","description":"Fee in basis points for this leg","example":2},"settlementType":{"type":"string","description":"Settlement type for this leg","example":"T+2"}},"required":["type","inputCurrency","outputCurrency","inputRail","outputRail","feeBps","settlementType"]},"RouteInfoDto":{"type":"object","properties":{"supported":{"type":"boolean","description":"Whether this route is supported","example":true},"flow":{"type":"string","description":"Transfer flow type","example":"CRYPTO_TO_SWIFT"},"summary":{"type":"string","description":"Human-readable route summary","example":"USDC → USD"},"totalFeeBps":{"type":"number","description":"Total fee in basis points","example":2},"estimate":{"description":"Route timing estimate","allOf":[{"$ref":"#/components/schemas/RouteEstimateDto"}]},"minimumAmount":{"description":"Minimum amount for this route. Requests below this floor are rejected at transfer creation.","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]},"legs":{"description":"Individual legs of the transfer","type":"array","items":{"$ref":"#/components/schemas/RouteLegDto"}}},"required":["supported"]},"QuoteResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Quote ID (only present for held quotes)","example":"quote_abc123"},"sourceAmount":{"description":"Source amount with currency details","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]},"destinationAmount":{"description":"Destination amount with currency details","allOf":[{"$ref":"#/components/schemas/MoneyOutputDto"}]},"exchangeRate":{"type":"string","description":"Exchange rate (inclusive of all fees)","example":"1.00500"},"infiniteFee":{"description":"Infinite fee breakdown","allOf":[{"$ref":"#/components/schemas/FeeBreakdownDto"}]},"developerFee":{"description":"Developer fee breakdown","allOf":[{"$ref":"#/components/schemas/DeveloperFeeDto"}]},"sourceRail":{"type":"string","description":"Source payment rail","example":"ACH"},"destinationRail":{"type":"string","description":"Destination payment rail","example":"SWIFT"},"expiresAt":{"type":"string","description":"Quote expiration timestamp (only present for held quotes)","format":"date-time","example":"2026-09-15T10:35:00Z"},"createdAt":{"type":"string","description":"Quote creation timestamp","format":"date-time","example":"2026-09-15T10:30:00Z"},"lockable":{"type":"boolean","description":"Whether the exchange rate can be locked for 24 hours","example":true},"route":{"description":"Route information including timing and fee estimates","allOf":[{"$ref":"#/components/schemas/RouteInfoDto"}]}},"required":["sourceAmount","destinationAmount","exchangeRate","infiniteFee","createdAt","lockable"]},"InitiateTosRequestDto":{"type":"object","properties":{"customerId":{"type":"string","description":"Customer ID (optional)","example":"cus_abc123"},"verificationSessionId":{"type":"string","description":"Verification session ID used to derive whether this acceptance is for a related person","example":"vsess_abc123"},"organizationId":{"type":"string","description":"Organization ID","example":"org_abc123"}},"required":["organizationId"]},"InitiateTosResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"ToS acceptance ID","example":"tos_abc123"}},"required":["id"]},"AcceptTosRequestDto":{"type":"object","properties":{"infiniteAgreementsAccepted":{"type":"boolean","description":"Whether the Infinite agreements were accepted","example":true},"ereborAgreementsAccepted":{"type":"boolean","description":"Whether the Erebor agreements were accepted","example":true},"oneMoneyAgreementsAccepted":{"type":"boolean","description":"Whether the 1Money agreements were accepted","example":true},"customerId":{"type":"string","description":"Customer ID (if known)","example":"cus_abc123"}},"required":["infiniteAgreementsAccepted"]},"AcceptTosResponseDto":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the acceptance was successful","example":true},"message":{"type":"string","description":"Message describing the result","example":"Terms of Service accepted successfully"},"acceptanceId":{"type":"string","description":"ToS acceptance record ID","example":"tos_abc123"}},"required":["success","message"]},"TosAcceptanceResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the ToS acceptance record","example":"tos_abc123"},"customerId":{"type":"string","nullable":true,"description":"Customer ID","example":"cus_abc123"},"organizationId":{"type":"string","description":"Organization ID","example":"org_abc123"},"infiniteAgreementsAccepted":{"type":"boolean","description":"Whether the Infinite agreements were accepted","example":true},"ereborAgreementsAccepted":{"type":"boolean","nullable":true,"description":"Whether the Erebor agreements were accepted","example":true},"oneMoneyAgreementsAccepted":{"type":"boolean","nullable":true,"description":"Whether the 1Money agreements were accepted","example":true},"acceptedAt":{"type":"string","nullable":true,"description":"When the acceptance was recorded","example":"2026-10-20T10:30:00Z"},"createdAt":{"type":"string","description":"When the record was created","example":"2026-10-20T10:30:00Z"}},"required":["id","customerId","organizationId","infiniteAgreementsAccepted","ereborAgreementsAccepted","oneMoneyAgreementsAccepted","acceptedAt","createdAt"]},"SandboxSetCustomerStatusDto":{"type":"object","properties":{"status":{"enum":["DRAFT","IN_REVIEW","NEED_ACTIONS","REJECTED","ACTIVE","INACTIVE","SUSPENDED"],"type":"string","description":"The verification status to set for the customer","example":"ACTIVE"}},"required":["status"]},"SandboxSimulateCapabilitiesDto":{"type":"object","properties":{"capabilities":{"minItems":1,"type":"array","items":{"type":"string","enum":["USD_ACH_PAYIN","USD_ACH_PAYOUT","USD_WIRE_PAYIN","USD_WIRE_PAYOUT","USD_BALANCE","USD_YIELD","SWIFT_PAYIN","SWIFT_PAYOUT","STABLECOIN_PAYIN","STABLECOIN_PAYOUT","STABLECOIN_SWAPS","AED_FX_PAYOUT","AUD_FX_PAYOUT","BHD_FX_PAYOUT","BOB_FX_PAYOUT","BRL_FX_PAYOUT","CLP_FX_PAYOUT","CNY_FX_PAYOUT","COP_FX_PAYOUT","DOP_FX_PAYOUT","EGP_FX_PAYOUT","EUR_FX_PAYOUT","GBP_FX_PAYOUT","HKD_FX_PAYOUT","IDR_FX_PAYOUT","INR_FX_PAYOUT","JPY_FX_PAYOUT","KRW_FX_PAYOUT","KWD_FX_PAYOUT","MXN_FX_PAYOUT","MYR_FX_PAYOUT","PEN_FX_PAYOUT","PHP_FX_PAYOUT","PYG_FX_PAYOUT","QAR_FX_PAYOUT","SAR_FX_PAYOUT","SGD_FX_PAYOUT","THB_FX_PAYOUT","TRY_FX_PAYOUT","TWD_FX_PAYOUT","USD_FX_PAYOUT","VND_FX_PAYOUT"]},"description":"Capabilities to make READY for this customer by simulating the underlying approvals.","example":["USD_BALANCE"]}},"required":["capabilities"]},"SandboxFundInDto":{"type":"object","properties":{"rail":{"type":"string","enum":["WIRE","ACH","BLOCKCHAIN"],"description":"Funding rail to simulate","example":"WIRE"},"amount":{"type":"string","pattern":"^(?:0|[1-9]\\d*)(?:\\.\\d{1,6})?$","description":"Funding amount as a decimal string. Fiat rails accept up to 2 decimals; stablecoin balance funding accepts up to 6.","example":"1000.00"},"currency":{"type":"string","description":"Funding currency code","example":"USD"},"network":{"enum":["ETHEREUM","BASE","SOLANA","ARBITRUM","POLYGON","TRON"],"type":"string","description":"Blockchain network when `rail` is `BLOCKCHAIN`","example":"BASE"},"reference":{"type":"string","description":"Optional client reference for future providers","example":"fund_in_123"}},"required":["rail","amount","currency"]},"SandboxFundingAmountResponseDto":{"type":"object","properties":{"value":{"type":"string","description":"Funding amount returned as a decimal string","example":"1000.00"},"currency":{"type":"string","description":"Currency code","example":"USD"}},"required":["value","currency"]},"SandboxFundInResponseDto":{"type":"object","properties":{"accountId":{"type":"string","description":"Internal account ID used for the sandbox simulation","example":"vba_123"},"amount":{"description":"Funding amount returned in our API shape","allOf":[{"$ref":"#/components/schemas/SandboxFundingAmountResponseDto"}]},"rail":{"type":"string","description":"Funding rail simulated","enum":["WIRE","ACH","BLOCKCHAIN"],"example":"WIRE"},"transactionHash":{"type":"string","description":"Blockchain transaction hash when provided by the sandbox provider","example":"0x1234"}},"required":["accountId","amount","rail"]},"SandboxSimulateFixedRouteDepositDto":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$","description":"Deposit amount in major units (e.g. \"1000.00\" for USD, \"100.5\" for USDT)","example":"1000.00"},"currency":{"type":"string","description":"Deposit currency; defaults to the route source currency when omitted","example":"USD"},"reference":{"type":"string","description":"Idempotency reference for the simulated deposit; replays return the existing sweep transfer","example":"sandbox_test_deposit_1"},"senderBank":{"description":"Sender bank reported for the simulated deposit, for exercising the allowedSenderBanks restriction on fiat pay-in routes. Omit to simulate a deposit without sender-bank data.","allOf":[{"$ref":"#/components/schemas/AllowedSenderBankDto"}]}},"required":["amount"]},"SandboxSimulateFixedRouteDepositResponseDto":{"type":"object","properties":{"accountId":{"type":"string","description":"Fixed route source account ID","example":"acc_123"},"transferId":{"type":"string","description":"Sweep transfer created or replayed for this simulation","example":"tfr_123"},"sweepReferenceId":{"type":"string","description":"Sweep idempotency key used for this simulation","example":"sandbox_sim_550e8400-e29b-41d4-a716-446655440000"}},"required":["accountId","transferId","sweepReferenceId"]},"SandboxSimulateTransferDto":{"type":"object","properties":{"targetStatus":{"enum":["PROCESSING","COMPLETED","FAILED"],"type":"string","description":"Target transfer status to simulate","example":"COMPLETED"},"failReason":{"type":"string","description":"Failure reason (required when targetStatus is FAILED)","example":"Provider timeout"},"outputAmount":{"type":"string","pattern":"^[1-9]\\d*$","description":"Optional output amount override in minor units for completed legs","example":"100000000"}},"required":["targetStatus"]},"SandboxSetLegStatusDto":{"type":"object","properties":{"status":{"enum":["PENDING","IN_PROGRESS","COMPLETED","FAILED","SKIPPED"],"type":"string","description":"The status to set for the leg","example":"COMPLETED"},"reason":{"type":"string","description":"Reason for the status change. Required when setting status to FAILED or SKIPPED.","example":"Simulating provider timeout"},"outputAmount":{"type":"string","pattern":"^[1-9]\\d*$","description":"Output amount in minor units. Used when completing a leg to simulate the actual amount received.","example":"100000000"}},"required":["status"]}}}}