Skip to main content

Hosts and auth

Sandbox hosthttps://api.sandbox.conduit.financial
Production hosthttps://api.conduit.financial
Auth headerx-api-key: ck_sandbox_... or ck_live_...
Idempotency headeridempotency-key: <uuid> (required on every money-moving POST; 300s cache TTL)

Address format

  • EVM: all-lowercase OR a correct EIP-55 checksum.
  • Tron / Solana: Base58 verbatim.
The mnemonic suffixes called out in the docs are uppercase for readability; the wire-format addresses are all-lowercase.

Scenario suffixes

SuffixChainForcesObservable on
12517C00EVM, Tron, SolanaWallet screening returns elevated risk score (below rejection threshold)Withdrawal proceeds; status: completed (elevated-risk classification recorded for audit)
503CA110EVM, Tron, SolanaTravel Rule provider temporarily unavailableWithdrawal parks in status: processing until the Travel Rule provider recovers.
5A4070EDEVM, Tron, SolanaWallet screening matches sanctions listWithdrawal fails; status: failed, failureCode: AML_REJECTED (sanctions classification recorded for audit)
5A4D4E51EVM, Tron, SolanaAML check returns elevated risk (routes as approved at medium threshold)Withdrawal proceeds; status: completed
5A4D4E5AEVM, Tron, SolanaAML check flags sanctions matchWithdrawal fails; status: failed, failureCode: AML_REJECTED (sanctions classification recorded for audit)
5A4D4EAAEVM, Tron, SolanaAML check passes (approved)Withdrawal proceeds; status: completed
5A4D4EE5EVM, Tron, SolanaAML check fails (high-risk rejection)Withdrawal fails; status: failed, failureCode: AML_REJECTED
5A4ED0DDEVM, Tron, SolanaTravel Rule record created in a non-sendable stateWithdrawal fails pre-broadcast; status: failed, failureCode: TRAVEL_RULE_REJECTED
5A50AB1EEVM, Tron, SolanaWallet screening identifies destination as a known exchangeTravel Rule flow triggered; withdrawal proceeds if TR passes
5E1F0577EVM, Tron, SolanaWallet screening identifies destination as self-hostedTravel Rule skipped; withdrawal proceeds normally
94000000FiatFiat withdrawal completes successfullyWithdrawal completed; status: completed
94009001FiatRail policy rejects (amount limit, frequency cap, or recipient restriction)Withdrawal fails; status: failed, failureCode: RAIL_POLICY_REJECTED
94009002FiatInsufficient funds at settlement (funds available at reservation)Withdrawal fails; status: failed, failureCode: INSUFFICIENT_FUNDS_AT_SETTLE
94009003FiatNo viable rail available for the corridorWithdrawal fails; status: failed, failureCode: RAIL_UNAVAILABLE
94009004FiatRail provider timeoutWithdrawal fails; status: failed, failureCode: RAIL_UNAVAILABLE
95000000FiatAML check passes for inbound fiat depositDeposit credited; status: completed
95009001FiatAML check fails for inbound fiat depositDeposit frozen; status: failed, failureCode: COMPLIANCE_HOLD
95009002FiatAML check flags sanctions match on inbound fiat depositDeposit frozen; status: failed, failureCode: COMPLIANCE_HOLD
95009003FiatAML check returns elevated risk on inbound fiat deposit (routes as approved)Deposit credited; status: completed
AC6BC0DEEVM, Tron, SolanaReceiving institution acknowledges transfer (informational only)Withdrawal proceeds; status: completed
ACCEEDEDEVM, Tron, SolanaReceiving institution accepts transfer (informational under FATF Rec. 16)Withdrawal proceeds; status: completed
BAD6A1A4EVM, Tron, SolanaReceiving institution rejects transferPre-broadcast: status: failed, failureCode: TRAVEL_RULE_REJECTED. Post-broadcast: withdrawal completes (on-chain transfer cannot be reversed).
BAD7E517EVM, Tron, SolanaTravel Rule pre-send validation rejects the transferWithdrawal fails pre-broadcast; status: failed, failureCode: TRAVEL_RULE_REJECTED
BAD8CA57EVM, Tron, SolanaBroadcast rejected by the chain providerWithdrawal fails pre-broadcast; status: failed, failureCode: PROVIDER_REJECTED
D15CCAD0EVM, Tron, SolanaWallet attestation conflict: customer claims self-custody but screening identifies a VASPWithdrawal fails; status: failed, failureCode: TRAVEL_RULE_REJECTED
DA171465EVM, Tron, SolanaReceiving institution requests additional information; auto-resolves to acceptedWithdrawal proceeds; Travel Rule row transitions to accepted post-broadcast. status: completed
DE5E11F0EVM, Tron, SolanaDeposit parked at sender-info gate; auto-pilot fires deadlineDeposit paused; customer clears via POST /v2/sandbox/customers/:customerId/deposits/:depositId/simulate/sender-info
DEAA4900EVM, Tron, SolanaAML check passes for inbound crypto depositDeposit credited; status: completed
DEAA5A4DEVM, Tron, SolanaAML check flags sanctions match on inbound crypto depositDeposit frozen; status: failed, failureCode: COMPLIANCE_HOLD
DEAA8157EVM, Tron, SolanaAML check returns elevated risk on inbound crypto deposit (routes as approved)Deposit credited; status: completed
DEAA8E50EVM, Tron, SolanaAML check fails for inbound crypto depositDeposit frozen; status: failed, failureCode: COMPLIANCE_HOLD
DEC11A1DEVM, Tron, SolanaReceiving institution declines transferPre-broadcast: status: failed, failureCode: TRAVEL_RULE_REJECTED. Post-broadcast: withdrawal completes.

Simulate endpoints

EndpointDrivesBodyResponseErrors
POST /v2/sandbox/applications/:id/simulate/decisionApplication -> APPROVED or REJECTED{ outcome: "approved" | "rejected", category?, field?, reason? }200APPLICATION_NOT_FOUND, REJECTION_CATEGORY_NOT_APPLICABLE
POST /v2/sandbox/applications/:id/simulate/verification-completeVerification -> COMPLETED{ outcome: "approved" | "declined", method?, reason? }200VERIFICATION_NOT_FOUND, VERIFICATION_INVALID_STATUS
POST /v2/sandbox/customers/:customerId/virtual-accounts/:virtualAccountId/deposits/simulateCreates a new fiat deposit; outcome steers compliance branch{ outcome: "completed" | "frozen" | "returned" (default completed), assetAmount, senderInfo?, detectedAt?, externalReference?, reason? }201VALIDATION_ERROR, NOT_FOUND
POST /v2/sandbox/customers/:customerId/wallets/:walletId/deposits/simulateCreates a new crypto deposit; outcome steers compliance branch{ outcome: "completed" | "frozen" | "returned" (default completed), assetAmount, originator?, sourceAddress, detectedAt?, externalReference?, reason? }201VALIDATION_ERROR, NOT_FOUND
POST /v2/sandbox/customers/:customerId/deposits/:depositId/simulate/sender-infoDeposit’s sender-info gate -> RESOLVED{ senderInfo }200SANDBOX_SENDER_INFO_NOT_REQUIRED, NOT_FOUND
POST /v2/sandbox/transactions/:id/simulate/terminalTransaction -> COMPLETED or FAILED{ outcome: "completed" | "failed", utr?, reason? }200SANDBOX_TRANSACTION_NOT_FORCE_TERMINAL_READY, RESOURCE_TERMINAL, NOT_FOUND
POST /v2/sandbox/payouts/:id/simulate/confirmCrypto payout -> chain-confirm{ outcome: "completed" | "failed", txHash?, reason? } (txHash required when outcome="completed")200PAYOUT_NOT_FOUND, SANDBOX_TRANSACTION_NOT_FORCE_TERMINAL_READY, RESOURCE_TERMINAL
POST /v2/sandbox/payouts/:id/simulate/settledFiat payout -> rail settlement{ outcome: "completed" | "failed", utr?, reason? }200PAYOUT_NOT_FOUND, SANDBOX_TRANSACTION_NOT_FORCE_TERMINAL_READY, RESOURCE_TERMINAL
POST /v2/sandbox/payouts/:id/simulate/counterparty-webhookTravel-Rule counterparty resolution{ outcome: "acknowledged" | "approved" | "rejected" | "declined", reason? }200RESOURCE_TERMINAL, NOT_FOUND
POST /v2/sandbox/payouts/:id/simulate/cosignNon-custodial payout cosign gate{ outcome: "approved" | "declined", reason? }200PAYOUT_NOT_FOUND, RESOURCE_TERMINAL, NOT_FOUND
POST /v2/sandbox/payouts/:id/simulate/broadcast-failCrypto payout -> broadcast failure terminal{ reason? }200RESOURCE_TERMINAL, NOT_FOUND
POST /v2/sandbox/payouts/:id/simulate-review-approvePayout document review -> APPROVED; payout resumes{}200PAYOUT_NOT_FOUND, RESOURCE_TERMINAL
POST /v2/sandbox/payouts/:id/simulate-review-rejectPayout document review -> REJECTED; funds returned{}200PAYOUT_NOT_FOUND, RESOURCE_TERMINAL
POST /v2/sandbox/payouts/:id/simulate-stampRecords one signer’s cosign stamp on a non-custodial payout’s quorum; repeats walk the quorum, then the compliance auto-stamp lands once the customer threshold is met{ walletSignerId, selection: "APPROVED" | "REJECTED" }200PAYOUT_NOT_FOUND, PAYOUT_NOT_IN_AWAITING_SIGNATURE, SIGNER_NOT_FOUND
POST /v2/sandbox/wallet-signers/:signerId/mark-enrolledDrives a signer from pendingActivation to active without going through the real passkey/OIDC flow; once every roster member is active, the provider account auto-activates and crypto_wallet.completed fires{}200SIGNER_NOT_FOUND
POST /v2/sandbox/customers/:customerId/simulate-reset-claimSingle-shot reset of a customer’s non-custodial claim. Removes every signer, every wallet, and the crypto-wallet feature flag so the next claim-non-custodial starts fresh. Refuses with 409 CLAIM_RESET_BLOCKED if open transactions, deposits, or pending signature approvals still reference the customer.{}200PROVIDER_ACCOUNT_NOT_FOUND, CLAIM_RESET_BLOCKED
POST /v2/sandbox/orders/:id/simulate/rate-lock-expiredOrder -> rate-lock-expired cancellation (about 1s){}200NOT_FOUND
POST /v2/sandbox/orders/:id/simulate/conversion-failedOrder -> conversion-failed terminal{ reason? }200NOT_FOUND
POST /v2/sandbox/whitelist-recipients/:id/simulate-approveWhitelist recipient PENDING_REVIEW -> REGISTERED{}200WHITELIST_RECIPIENT_NOT_FOUND, WHITELIST_INVALID_TRANSITION
POST /v2/sandbox/whitelist-recipients/:id/simulate-rejectWhitelist recipient PENDING_REVIEW -> REJECTED{}200WHITELIST_RECIPIENT_NOT_FOUND, WHITELIST_INVALID_TRANSITION

Index by entity

If you have a…You can call…
app_... (application)POST /v2/sandbox/applications/:id/simulate/decision, POST /v2/sandbox/applications/:id/simulate/verification-complete
cus_... (customer)none directly; act on the customer’s applications and features
vac_... (virtual account)POST /v2/sandbox/customers/:customerId/virtual-accounts/:virtualAccountId/deposits/simulate
wlt_... (wallet)POST /v2/sandbox/customers/:customerId/wallets/:walletId/deposits/simulate
dep_... (deposit)POST /v2/sandbox/customers/:customerId/deposits/:depositId/simulate/sender-info
txn_... (transaction / payout)POST /v2/sandbox/transactions/:id/simulate/terminal; payouts also: .../payouts/:id/simulate/confirm, .../simulate/settled, .../simulate/counterparty-webhook, .../simulate/cosign, .../simulate/broadcast-fail, .../simulate-review-approve, .../simulate-review-reject
ord_... (order)POST /v2/sandbox/orders/:id/simulate/rate-lock-expired, .../simulate/conversion-failed

Index by lifecycle state

Payouts
Payout stateWhat you can call
pending (custodial)nothing yet; the cosign auto-resolves and broadcast begins
pending_cosign (non-custodial)simulate/cosign {outcome: "approved" | "declined"}, or simulate/counterparty-webhook to drive a Travel Rule pre-broadcast reject
parked at document review (payout created with documents)simulate-review-approve to resume the payout, or simulate-review-reject to terminate it as failed with failureCode: COMPLIANCE_REJECTED (reserved funds returned). The payout reads as status: "processing" while parked.
broadcastingsimulate/confirm {outcome: "completed" | "failed", txHash?} to drive chain finality (custodial) or simulate/broadcast-fail to force-fail
completed / failednothing; calls return 409 RESOURCE_TERMINAL. See RESOURCE_TERMINAL playbook.
Deposits
Deposit stateWhat you can call
(parked at sender-info gate)simulate/sender-info
terminal (completed / frozen / returned)nothing; outcome was set at ingestion time
Orders
Order stateWhat you can call
pending (rate-lock window open)simulate/rate-lock-expired (cancels within ~1s)
any pre-terminal state with a conversion legsimulate/conversion-failed
Applications
Application stateWhat you can call
pendingsimulate/decision {outcome: "approved" | "rejected"}
(with verification gate)simulate/verification-complete {outcome: "approved" | "declined"}

Index by error code

If you got…The call that produced it…
RESOURCE_TERMINAL (409)Any simulate/* against a terminal entity. See playbook.
SANDBOX_TRANSACTION_NOT_FORCE_TERMINAL_READY (422)simulate/settled or simulate/confirm against a payout parked at the document-review gate (call simulate-review-approve first); also simulate/terminal with outcome: "completed" before a fiat route is selected. See playbook.
APPLICATION_NOT_FOUND (404)simulate/decision when the application ID does not exist or does not belong to the org.
REJECTION_CATEGORY_NOT_APPLICABLE (422)simulate/decision with a category field on a non-KYB application.
VERIFICATION_NOT_FOUND (404)simulate/verification-complete when no pending verification exists for the application.
VERIFICATION_INVALID_STATUS (409)simulate/verification-complete when the verification is not in PENDING status.
SANDBOX_SENDER_INFO_NOT_REQUIRED (409)simulate/sender-info against a deposit not parked at the sender-info gate.
See the Error catalog for the full code list and per-code playbooks.

Public failure codes

CodeTerminal stateChannelDescriptionPlaybook
AML_REJECTEDfailedwebhook + polledAML screening rejected the transaction (sanctions-class signals route here)Playbook
CHAIN_BROADCAST_FAILEDfailedwebhook + polledThe signed payout could not be broadcast to the chain before reaching finality; no funds left the walletPlaybook
COMPLIANCE_HOLDfailedwebhook + polledCompliance review held the funds; manual remediation requiredPlaybook
COMPLIANCE_REJECTEDfailedwebhook + polledA compliance reviewer rejected the payout’s supporting documentation; reserved funds were returned (fires transaction.rejected, not transaction.failed)Playbook
CRYPTO_WALLET_MISCONFIGUREDfailedwebhook + polledThe source wallet is missing required custody configuration; the payout could not be signedPlaybook
INSUFFICIENT_FUNDS_AT_SETTLEfailedwebhook + polledSource funds were insufficient at the settlement attemptPlaybook
PROVIDER_REJECTEDfailedwebhook + polledThe crypto outbound provider declined the broadcast request before the transaction was submitted to the chainPlaybook
RAIL_POLICY_REJECTEDfailedwebhook + polledThe receiving rail rejected the payment per its policyPlaybook
RAIL_UNAVAILABLEfailedwebhook + polledThe chosen rail was temporarily unavailablePlaybook
RETURNED_BY_SENDERfailedwebhook + polledThe inbound transfer was returned by the originating institution before it could be creditedPlaybook
ROSTER_CHANGEDfailedwebhook + polledA signer on the customer’s roster was removed (or demoted out of the signing pool) while the payout was awaiting signatures; the half-collected stamps were voided so the fintech can re-initiatePlaybook
SENDER_INFO_TIMEOUTfailedwebhook + polledSender-information gate expired before resolutionPlaybook
TRAVEL_RULE_REJECTEDfailedwebhook + polledCounterparty rejected the Travel Rule request, or Travel Rule validation failed pre-broadcastPlaybook
USER_SIGNATURE_DECLINEDfailedwebhook + polledEnd user explicitly declined to signPlaybook
USER_SIGNATURE_REJECTED_BY_PROVIDERfailedwebhook + polledCustody provider rejected the signature payloadPlaybook
USER_SIGNATURE_TIMEOUTfailedwebhook + polledEnd user did not sign within the cosign windowPlaybook

Sandbox simulate endpoint errors

These codes are returned as HTTP errors by sandbox simulate endpoints. They are not failureCode values on transactions.
CodeHTTP statusDescriptionPlaybook
CONCURRENT_COSIGN_IN_FLIGHT409Source wallet has a non-custodial payout awaiting signature on the same chainPlaybook
INVALID_ADDRESS_FORMAT400EVM address must be all-lowercase or a correct EIP-55 checksumPlaybook
RESOURCE_TERMINAL409Tried to drive a simulate against an already-terminal entityPlaybook
SANDBOX_TRANSACTION_NOT_FORCE_TERMINAL_READY422Called a sandbox simulate endpoint whose requested outcome is not viable in the transaction’s current phase (e.g. simulate/settled or simulate/confirm against a payout parked at the document-review gate, or simulate/terminal with outcome:completed before a fiat route is selected)Playbook

HTTP status code legend

CodeMeaning
200Mutation succeeded; resource returned
201Resource created; resource returned
202Accepted; resource pending
400Validation error; check the pointer in the response
401Missing or invalid API key
403API key lacks permission
404Resource not found
409Conflict; inspect type for the precise error
429Rate limited
500Server error

Webhook event topics (most common)

  • application.approved / application.rejected
  • transaction.created / transaction.completed / transaction.failed / transaction.cancelled
  • transaction.awaiting_sender_information
  • order.failed
  • customer.activated
  • virtual_account.activated
See the webhooks reference for the full topic list and signature scheme.

See also