Sub Accounts
Sub-accounts are merchant-owned child wallets with dedicated MPC keys. They let you isolate balances, scope delegated access, and route splits/offramp flows by sub-account.Sub-accounts are created programmatically via API, SDK, or CLI. The dashboard intentionally provides a read-only watchtower view.
Authentication
All sub-account endpoints are protected merchant endpoints.- Use
Authorization: Bearer zfi_test_...orAuthorization: Bearer zfi_live_... - Dashboard sessions also work for merchant UI usage.
Create Sub-Account
string
required
Immutable label for this sub-account. Must be unique per merchant.
number
Optional configured spend limit (USDC).
string
default:"delegated"
delegated or merchant_managed.boolean
default:"false"
Yield toggle metadata for this sub-account.
Example
Response
List Sub-Accounts
Get Sub-Account
id accepts either the UUID or external ID (for example sa_xxxxx).
Get Sub-Account Balance
Response
Get Merchant Sub-Account TTL Policy
Response
Update Merchant Sub-Account TTL Policy
Body
GET /api/v1/subaccounts/ttl-policy.
Mint Delegation Token
string
required
deposit_only, withdraw_only, spend_only, read_only, or full_access.number
Optional spend cap enforced for this token.
integer
default:"3600"
Token lifetime in seconds.
array<string>
Optional destination allowlist.
boolean
default:"false"
If true, token auto-revokes after first successful authorized use.
string
Optional policy version UUID attached to this token.
string
Optional actor label for audit attribution.
string
Optional actor public key for attribution.
object
Optional structured actor metadata.
Response
Mint Child Delegation Token
expires_in_seconds must be within the merchant effective child-delegation TTL ceiling and cannot exceed parent token expiry.
Body
Response
Freeze Sub-Account
Unfreeze Sub-Account
- Only sub-accounts currently in
frozenstatus can be unfrozen. closedsub-accounts cannot be unfrozen.- Previously revoked delegation tokens are not reactivated. Mint new token(s) if needed.
Drain Sub-Account
Body
Withdraw From Sub-Account
Body
signing_grant and passkey_signature are mutually exclusive.
passkey_signature remains available as an interactive fallback and is no longer required for headless external-withdraw flows.
Withdraw Sub-Account To Bank (One-Shot)
Body
bank_id accepts a bank identifier value: PAJ bank id, bank code, or bank name.
Response
automation_token and delegation_token are mutually exclusive.
signing_grant and passkey_signature are mutually exclusive.
For API-key initiated bank withdrawals, provide:
- one policy token (
automation_tokenordelegation_token) - one signing authorization (
signing_grant)
passkey_signature remains available as an interactive fallback and is no longer required for headless flows.
Mint Sub-Account Automation Token
withdraw-bank.
ttl_seconds must be within the merchant effective automation-token TTL ceiling.
Body
Response
Mint Sub-Account Signing Grant
withdraw-bank.
ttl_seconds must be within the merchant effective signing-grant TTL ceiling.
Body
Response
Start Signing Grant Browser Intent
ttl_seconds must be within the merchant effective signing-grant TTL ceiling.
Body
Response
Poll Signing Grant Browser Intent
signing_grant exactly once and marks the intent consumed.
Body
Response (approved)
Revoke Sub-Account Signing Grant
Response
Revoke Sub-Account Automation Token
Response
This endpoint is API-key compatible and requires no manual OTP submission in your client. OTP handling is automated server-side via proxy email and IMAP monitor.
Create Policy Version
Body
Dry Run Policy
Get Policy
Create Webhook Trigger Subscription
balance_belowbalance_abovethreshold_crossedfunds_arrivaldaily_withdrawal_above
List Webhook Trigger Subscriptions
Create Execution Intent
Approve Execution Intent
Release Execution Intent by Signal
Create Balance Rule
topup_below or drain_above).
Close Sub-Account
Webhook Coverage
Sub-account flows emit:- Withdrawal events:
WithdrawalInitiated,WithdrawalFailed,WithdrawalCompleted - Lifecycle events:
SubAccountCreated,SubAccountDelegationTokenMinted,SubAccountFrozen,SubAccountUnfrozen,SubAccountClosed - Reactive controls:
SubAccountBalanceLow,SubAccountBalanceHigh,SubAccountThresholdCrossed - Execution gates:
SubAccountExecutionGatePending,SubAccountExecutionGateReleased