Download OpenAPI specification:Download
Issuing, settlement, refunds, and on-ramp infrastructure for partner platforms.
Creates a virtual card for the given cardholder. Behavior depends on the ISSUING_PROVIDER config: Stripe issues a Stripe Issuing card; Bridge creates a Bridge card account funded by the supplied crypto account.
| cardholderId required | string Cardholder UUID returned from POST /v1/cardholders. |
| chain | string Enum: "solana" "world_chain" "base" Bridge only — blockchain for the card account funding source. |
| cryptoAccountAddress | string Bridge only — crypto account address that funds card draws. |
| cryptoAccountType | string Enum: "standard" "bridge_wallet" Bridge only — crypto account type. Defaults to |
{- "cardholderId": "550e8400-e29b-41d4-a716-446655440000",
- "chain": "solana",
- "cryptoAccountAddress": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb1",
- "cryptoAccountType": "standard"
}{- "cardId": "6ee0b2a0-3c8c-4f49-9d12-bd55b15f02b1",
- "stripeCardId": "ic_1NXxxx",
- "bridgeCardAccountId": "card_acc_abc123",
- "last4": "4242"
}Returns a Stripe Issuing ephemeral key suitable for Apple Pay In-App Provisioning, Google Pay JS push tokenization, or client-side Stripe.js PAN display. Stripe-only: rejects with 400 when ISSUING_PROVIDER=bridge. Tightly rate-limited (5/min/IP) because ephemeral keys are sensitive.
| id required | string Example: 6ee0b2a0-3c8c-4f49-9d12-bd55b15f02b1 SafeBank card UUID |
| platform required | string Enum: "apple" "google" Target wallet vendor. |
| nonce | string Required for Apple/Google Pay In-App Provisioning push tokenization. Omit for client-side card display via Stripe.js (PAN reveal). |
| nonceSignature | string Apple Pay only — base64 signature over |
| certificates | Array of strings Apple Pay only — array of base64 certificates from PKAddPaymentPassRequest. Required when |
{- "platform": "apple",
- "nonce": "string",
- "nonceSignature": "string",
- "certificates": [
- "string"
]
}{- "cardId": "6ee0b2a0-3c8c-4f49-9d12-bd55b15f02b1",
- "stripeCardId": "ic_1NXxxx",
- "platform": "apple",
- "ephemeralKey": {
- "id": "ephkey_1NX...",
- "secret": "ek_test_...",
- "expires": 1715000000,
- "associated_objects": [
- {
- "id": "string",
- "type": "string"
}
]
}
}The configured per-transaction / daily / weekly / monthly caps and MCC rules for a card.
| id required | string SafeBank card UUID |
{- "cardId": "6ee0b2a0-3c8c-4f49-9d12-bd55b15f02b1",
- "perTransactionUsd": "250.00",
- "dailyUsd": "500.00",
- "weeklyUsd": "2000.00",
- "monthlyUsd": "5000.00",
- "blockedMcc": [ ],
- "allowedMcc": null
}Sets per-transaction / daily / weekly / monthly USD caps and MCC block/allow rules. Only the fields sent are changed; an explicit null clears a cap or the allowlist. Enforced in real time on every authorization for the card.
| id required | string SafeBank card UUID |
| perTransactionUsd | object or null Per-transaction USD cap. |
| dailyUsd | object or null Rolling 24h USD cap. |
| weeklyUsd | object or null Rolling ISO-week USD cap. |
| monthlyUsd | object or null Calendar-month USD cap. |
| blockedMcc | Array of strings MCCs to decline. Replaces the existing list. |
| allowedMcc | Array of strings or null When set, only these MCCs are allowed. |
{- "perTransactionUsd": "250.00",
- "dailyUsd": "500.00",
- "weeklyUsd": "2000.00",
- "monthlyUsd": "5000.00",
- "blockedMcc": [
- "7995"
], - "allowedMcc": [
- "5411",
- "5812"
]
}{- "cardId": "6ee0b2a0-3c8c-4f49-9d12-bd55b15f02b1",
- "perTransactionUsd": "250.00",
- "dailyUsd": "500.00",
- "weeklyUsd": "2000.00",
- "monthlyUsd": "5000.00",
- "blockedMcc": [ ],
- "allowedMcc": null
}Sets the card inactive at Stripe and in SafeBank — subsequent authorizations decline immediately.
| id required | string SafeBank card UUID |
{- "cardId": "6ee0b2a0-3c8c-4f49-9d12-bd55b15f02b1",
- "status": "inactive",
- "last4": "4242",
- "safeAddress": "0x1111111111111111111111111111111111111111"
}Reactivates a frozen card.
| id required | string SafeBank card UUID |
{- "cardId": "6ee0b2a0-3c8c-4f49-9d12-bd55b15f02b1",
- "status": "inactive",
- "last4": "4242",
- "safeAddress": "0x1111111111111111111111111111111111111111"
}Issues a Safe-funded card drawing USDC from the wallet’s Safe, seeding its spend limits from the body. Sandbox-only (a Stripe cardholder is minted for the tenant on first use); live issuance requires KYB onboarding.
| walletId required | string Source wallet id (must be DEPLOYED). |
| perTransactionUsd | object or null Per-transaction USD cap. |
| dailyUsd | object or null Rolling 24h USD cap. |
| weeklyUsd | object or null Rolling ISO-week USD cap. |
| monthlyUsd | object or null Calendar-month USD cap. |
| blockedMcc | Array of strings MCCs to decline. Replaces the existing list. |
| allowedMcc | Array of strings or null When set, only these MCCs are allowed. |
| agentId | string Bind the card to an agent (its spend also accumulates under the agent). |
{- "perTransactionUsd": "250.00",
- "dailyUsd": "500.00",
- "weeklyUsd": "2000.00",
- "monthlyUsd": "5000.00",
- "blockedMcc": [
- "7995"
], - "allowedMcc": [
- "5411",
- "5812"
], - "agentId": "a1b2c3d4-5e6f-7890-abcd-ef1234567890"
}{- "cardId": "6ee0b2a0-3c8c-4f49-9d12-bd55b15f02b1",
- "stripeCardId": "ic_1NXxxx",
- "last4": "4242",
- "safeAddress": "0x1111111111111111111111111111111111111111",
- "status": "active"
}| phone required | string Recipient phone (E.164). |
| amountUsd required | string USD amount (≤6 fraction digits). |
| chainId | number Source chain id (default 84532). |
| fundingMode | string Enum: "INTERNAL_BALANCE" "ONCHAIN_DEPOSIT" "SAFE_PROPOSAL" How the sender funds the payment. v1: INTERNAL_BALANCE. |
| requestedDestinationId | string One of the RECIPIENT's active destination ids (server-verified ownership). |
| speedPreference | string Enum: "FASTEST" "CHEAPEST" |
{- "phone": "+15551234567",
- "amountUsd": "25.00",
- "chainId": 0,
- "fundingMode": "INTERNAL_BALANCE",
- "requestedDestinationId": "string",
- "speedPreference": "FASTEST"
}{- "paymentId": "string",
- "status": "CREATED",
- "recipientPhoneMasked": { },
- "recipientTenantId": { },
- "claimId": { },
- "sourceChainKey": "string",
- "sourceAssetId": "string",
- "sourceAmountBaseUnits": "string",
- "sourceFundingMode": "string",
- "requestedDestinationId": { },
- "selectedRouteQuoteId": { },
- "holdReasons": [
- "string"
], - "failureReason": { },
- "deliveredAt": { },
- "createdAt": "string",
- "quotes": [
- {
- "routeId": "string",
- "paymentId": "string",
- "destinationId": "string",
- "provider": "string",
- "sourceAmountBaseUnits": "string",
- "sourceAssetId": "string",
- "destinationAmountMinor": "string",
- "destinationCurrency": "string",
- "fees": { },
- "exchangeRate": "string",
- "estimatedDeliverySeconds": { },
- "requiresBridge": true,
- "requiresConversion": true,
- "requiresPrefunding": true,
- "status": "string",
- "quoteExpiresAt": "string"
}
]
}{- "payments": [
- {
- "paymentId": "string",
- "status": "CREATED",
- "recipientPhoneMasked": { },
- "recipientTenantId": { },
- "claimId": { },
- "sourceChainKey": "string",
- "sourceAssetId": "string",
- "sourceAmountBaseUnits": "string",
- "sourceFundingMode": "string",
- "requestedDestinationId": { },
- "selectedRouteQuoteId": { },
- "holdReasons": [
- "string"
], - "failureReason": { },
- "deliveredAt": { },
- "createdAt": "string"
}
]
}| id required | string |
{- "paymentId": "string",
- "status": "CREATED",
- "recipientPhoneMasked": { },
- "recipientTenantId": { },
- "claimId": { },
- "sourceChainKey": "string",
- "sourceAssetId": "string",
- "sourceAmountBaseUnits": "string",
- "sourceFundingMode": "string",
- "requestedDestinationId": { },
- "selectedRouteQuoteId": { },
- "holdReasons": [
- "string"
], - "failureReason": { },
- "deliveredAt": { },
- "createdAt": "string"
}| id required | string |
{- "routes": [
- {
- "routeId": "string",
- "paymentId": "string",
- "destinationId": "string",
- "provider": "string",
- "sourceAmountBaseUnits": "string",
- "sourceAssetId": "string",
- "destinationAmountMinor": "string",
- "destinationCurrency": "string",
- "fees": { },
- "exchangeRate": "string",
- "estimatedDeliverySeconds": { },
- "requiresBridge": true,
- "requiresConversion": true,
- "requiresPrefunding": true,
- "status": "string",
- "quoteExpiresAt": "string"
}
]
}| id required | string |
| routeQuoteId required | string Route quote id to select. |
{- "routeQuoteId": "string"
}{- "paymentId": "string",
- "status": "CREATED",
- "recipientPhoneMasked": { },
- "recipientTenantId": { },
- "claimId": { },
- "sourceChainKey": "string",
- "sourceAssetId": "string",
- "sourceAmountBaseUnits": "string",
- "sourceFundingMode": "string",
- "requestedDestinationId": { },
- "selectedRouteQuoteId": { },
- "holdReasons": [
- "string"
], - "failureReason": { },
- "deliveredAt": { },
- "createdAt": "string"
}| id required | string |
{- "paymentId": "string",
- "status": "CREATED",
- "recipientPhoneMasked": { },
- "recipientTenantId": { },
- "claimId": { },
- "sourceChainKey": "string",
- "sourceAssetId": "string",
- "sourceAmountBaseUnits": "string",
- "sourceFundingMode": "string",
- "requestedDestinationId": { },
- "selectedRouteQuoteId": { },
- "holdReasons": [
- "string"
], - "failureReason": { },
- "deliveredAt": { },
- "createdAt": "string"
}| id required | string |
{- "paymentId": "string",
- "status": "CREATED",
- "recipientPhoneMasked": { },
- "recipientTenantId": { },
- "claimId": { },
- "sourceChainKey": "string",
- "sourceAssetId": "string",
- "sourceAmountBaseUnits": "string",
- "sourceFundingMode": "string",
- "requestedDestinationId": { },
- "selectedRouteQuoteId": { },
- "holdReasons": [
- "string"
], - "failureReason": { },
- "deliveredAt": { },
- "createdAt": "string"
}| claimToken required | string |
| challengeId required | string Challenge id returned by verify-phone. |
| code required | string 6-digit code from the SMS. |
{- "challengeId": "string",
- "code": "123456"
}{- "challengeId": "string",
- "verified": true
}| claimToken required | string |
| challengeId required | string A VERIFIED phone challenge id for this claim. |
| destinationId required | string One of the caller tenant's ACTIVE payout destination ids. |
{- "challengeId": "string",
- "destinationId": "string"
}{- "paymentId": "string",
- "status": "string",
- "holdReasons": [
- "string"
], - "quotes": [
- {
- "routeId": "string",
- "paymentId": "string",
- "destinationId": "string",
- "provider": "string",
- "sourceAmountBaseUnits": "string",
- "sourceAssetId": "string",
- "destinationAmountMinor": "string",
- "destinationCurrency": "string",
- "fees": { },
- "exchangeRate": "string",
- "estimatedDeliverySeconds": { },
- "requiresBridge": true,
- "requiresConversion": true,
- "requiresPrefunding": true,
- "status": "string",
- "quoteExpiresAt": "string"
}
]
}Returns the deployment environment, the EVM chains the platform is configured for (with USDC token addresses), and the feature flags that are actually available in this deployment. Computed from config; unbuilt features report false.
{- "apiVersion": "1",
- "environment": "sandbox",
- "chains": [
- {
- "chainId": 84532,
- "name": "Base Sepolia",
- "family": "EVM",
- "testnet": true,
- "usdcAddress": "0x036CbD53842c5426634e7929541eC2318f3dCF7e"
}
], - "features": {
- "identity": {
- "sessions": true,
- "provider": "mock",
- "live": false,
- "enforcement": "off"
}, - "wallets": true,
- "payments": true,
- "cards": {
- "issuing": true,
- "freeze": true,
- "limits": true
}, - "intents": false,
- "simulate": false,
- "autoramps": false,
- "treasury": false,
- "agents": true,
- "invoices": true,
- "offramp": true,
- "claims": true,
- "destinationRails": true
}
}Creates the developer/business account that owns API keys and every API-platform resource. Authenticated with a Privy session — this is the one API-platform write that does not need a tenant to already exist. Idempotent: if the caller already owns a tenant, that tenant is returned.
| name | string Human-readable tenant name. Defaults to a generated name. |
| slug | string URL-safe slug (lowercase letters, digits, hyphens). Auto-generated from the name when omitted; a numeric suffix is appended if the slug is taken. |
{- "name": "Acme Robotics",
- "slug": "acme-robotics"
}{- "id": "b3f1c2a0-1111-2222-3333-444455556666",
- "slug": "acme-robotics",
- "name": "Acme Robotics",
- "role": "OWNER",
- "createdAt": "2026-08-09T12:00:00.000Z"
}Returns the tenant the caller is acting as — resolved from the Privy session's membership or from the developer API key.
{- "id": "b3f1c2a0-1111-2222-3333-444455556666",
- "slug": "acme-robotics",
- "name": "Acme Robotics",
- "role": "OWNER",
- "createdAt": "2026-08-09T12:00:00.000Z"
}Creates a PENDING member and returns a one-time invite token (share it with the invitee). They accept via POST /v1/tenants/members/accept, registering the address they will sign with.
| email required | string Invitee email. |
| displayName | string Display name for the member. |
| role | string Default: "MEMBER" Enum: "ADMIN" "MEMBER" |
{- "email": "bob@acme.com",
- "displayName": "Bob Jones",
- "role": "ADMIN"
}{- "id": "string",
- "email": { },
- "displayName": { },
- "role": "MEMBER",
- "status": "PENDING",
- "signerAddress": "0x83172d9A819b7895cEE10F4B52bB4Ec40114D39C",
- "privyUserId": { },
- "createdAt": "string",
- "acceptedAt": { },
- "inviteToken": "string"
}{- "members": [
- {
- "id": "string",
- "email": { },
- "displayName": { },
- "role": "MEMBER",
- "status": "PENDING",
- "signerAddress": "0x83172d9A819b7895cEE10F4B52bB4Ec40114D39C",
- "privyUserId": { },
- "createdAt": "string",
- "acceptedAt": { }
}
]
}Marks the member REVOKED. Does NOT remove on-chain Safe ownership — the response lists wallets where they are still an owner so you can remove them with an owner-admin tx.
| id required | string |
{- "id": "string",
- "status": "REVOKED",
- "stillOwnerOfWalletIds": [ ]
}Token-authenticated (no API key needed). Activates the member and registers the EVM address they will sign with.
| token required | string The one-time invite token from the invite response. |
| signerAddress required | string The EVM address the member will sign with (their CLI signer or wallet address). Becomes the on-chain owner key when they are added to a Safe. |
| displayName | string Optional display name override. |
{- "token": "string",
- "signerAddress": "0x83172d9A819b7895cEE10F4B52bB4Ec40114D39C",
- "displayName": "string"
}{- "id": "string",
- "email": { },
- "displayName": { },
- "role": "MEMBER",
- "status": "PENDING",
- "signerAddress": "0x83172d9A819b7895cEE10F4B52bB4Ec40114D39C",
- "privyUserId": { },
- "createdAt": "string",
- "acceptedAt": { }
}Mints a developer API key for the caller’s tenant. The plaintext key is returned ONCE — store it immediately. Requires the keys:manage scope (Privy sessions and root keys hold it implicitly).
| name required | string Human label for the key. |
| environment | string Enum: "test" "live" Environment. Defaults to |
| scopes | Array of strings Items Enum: "wallets:read" "wallets:write" "wallets:fund" "payments:read" "payments:create" "payments:execute" "cards:read" "cards:issue" "cards:manage" "policies:read" "policies:write" "policies:evaluate" "agents:read" "agents:manage" "treasury:read" "treasury:write" "invoices:read" "invoices:write" "invoices:release" "invoices:pay" "ramps:read" "ramps:write" "keys:manage" "members:read" "members:manage" "contacts:read" "contacts:write" "identity:read" "identity:write" "status:read" "twofactor:read" "twofactor:manage" "*" Granted permission scopes. Defaults to a read-only set. Use |
| expiresAt | string Optional ISO-8601 expiry. A key past its expiry fails auth. |
{- "name": "CI sandbox",
- "environment": "test",
- "scopes": [
- "wallets:write",
- "wallets:fund",
- "payments:create"
], - "expiresAt": "2027-01-01T00:00:00.000Z"
}{- "id": "c1a2b3d4-...",
- "key": "sb_test_Ab12Cd34Ef56_xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
- "pubId": "Ab12Cd34Ef56",
- "environment": "TEST",
- "scopes": [
- "wallets:write",
- "payments:create"
], - "expiresAt": null,
- "createdAt": "2026-08-09T12:00:00.000Z"
}{- "keys": [
- {
- "id": "c1a2b3d4-...",
- "name": "CI sandbox",
- "pubId": "Ab12Cd34Ef56",
- "environment": "TEST",
- "scopes": [
- "wallets:write"
], - "lastUsedAt": "2026-08-09T12:30:00.000Z",
- "expiresAt": null,
- "revokedAt": null,
- "createdAt": "2026-08-09T12:00:00.000Z"
}
]
}Mints a new secret with the same scopes/environment; the old secret keeps working for a 24-hour grace window, then auto-expires. Returns the new plaintext key once.
| id required | string API key id to rotate. |
{- "id": "c1a2b3d4-...",
- "key": "sb_test_Ab12Cd34Ef56_xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
- "pubId": "Ab12Cd34Ef56",
- "environment": "TEST",
- "scopes": [
- "wallets:write",
- "payments:create"
], - "expiresAt": null,
- "createdAt": "2026-08-09T12:00:00.000Z"
}Creates a tenant-owned agent principal.
| name required | string Human label for the agent. |
{- "name": "ap-bot"
}{- "id": "a1b2c3d4-5e6f-7890-abcd-ef1234567890",
- "name": "ap-bot",
- "status": "ACTIVE",
- "createdAt": "2026-08-10T00:00:00.000Z"
}A suspended agent is declined (AGENT_SUSPENDED) on its next action.
| id required | string Agent id |
{- "id": "a1b2c3d4-5e6f-7890-abcd-ef1234567890",
- "name": "ap-bot",
- "status": "ACTIVE",
- "createdAt": "2026-08-10T00:00:00.000Z"
}| id required | string Agent id |
{- "agentId": "a1b2c3d4-5e6f-7890-abcd-ef1234567890",
- "perTransactionUsd": "50.00",
- "dailyUsd": "500.00",
- "weeklyUsd": "2000.00",
- "monthlyUsd": "5000.00"
}Per-payment / daily / weekly / monthly USD caps enforced on every agent-initiated payment. Only the fields sent change; an explicit null clears a cap.
| id required | string Agent id |
| perTransactionUsd | object or null Per-payment USD cap. |
| dailyUsd | object or null Rolling 24h USD cap. |
| weeklyUsd | object or null Rolling ISO-week USD cap. |
| monthlyUsd | object or null Calendar-month USD cap. |
{- "perTransactionUsd": "50.00",
- "dailyUsd": "500.00",
- "weeklyUsd": "2000.00",
- "monthlyUsd": "5000.00"
}{- "agentId": "a1b2c3d4-5e6f-7890-abcd-ef1234567890",
- "perTransactionUsd": "50.00",
- "dailyUsd": "500.00",
- "weeklyUsd": "2000.00",
- "monthlyUsd": "5000.00"
}Returns the plaintext key ONCE. Scopes are clamped to the agent ceiling — the key can never hold *, agents:manage, keys:manage, or policies:write.
| id required | string Agent id |
| name required | string Human label for the key. |
| environment | string Enum: "test" "live" Environment. Defaults to |
| scopes | Array of strings Items Enum: "wallets:read" "wallets:write" "wallets:fund" "payments:read" "payments:create" "payments:execute" "cards:read" "cards:issue" "cards:manage" "policies:read" "policies:evaluate" "agents:read" "treasury:read" "invoices:read" "invoices:write" "invoices:release" "invoices:pay" "ramps:read" "ramps:write" "members:read" "contacts:read" "contacts:write" "identity:read" "status:read" "twofactor:read" Granted scopes. Clamped to the agent ceiling — an agent key can never hold |
| expiresAt | string Optional ISO-8601 expiry. A key past its expiry fails auth. |
{- "name": "ap-bot ci",
- "environment": "test",
- "scopes": [
- "wallets:read",
- "payments:create"
], - "expiresAt": "2027-01-01T00:00:00.000Z"
}{- "id": "c1a2b3d4-...",
- "key": "sb_test_Ab12Cd34Ef56_xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
- "pubId": "Ab12Cd34Ef56",
- "environment": "TEST",
- "scopes": [
- "wallets:write",
- "payments:create"
], - "expiresAt": null,
- "createdAt": "2026-08-09T12:00:00.000Z"
}Creates a tenant-owned Safe (purpose AGENT) the agent’s card and payments draw from. One wallet per agent; owners are tenant signers (the agent holds no on-chain key). Deploys asynchronously — poll the wallet until DEPLOYED.
| id required | string Agent id |
required | Array of objects (WalletOwnerInput) Safe owners (tenant signers). |
| threshold | number Signature threshold. Defaults to 1. |
| chainId | number EVM chain id. Defaults to the sandbox chain. |
{- "owners": [
- {
- "address": "0x51c2…88",
- "memberId": "string",
- "handle": "string",
- "role": "ADMIN_OWNER",
- "label": "string"
}
], - "threshold": 1,
- "chainId": 84532
}{- "agentId": "a1b2c3d4-5e6f-7890-abcd-ef1234567890",
- "walletId": "string",
- "address": { },
- "status": "PENDING_DEPLOYMENT",
- "chainId": 84532,
- "threshold": 1
}Issues from the agent’s dedicated wallet (provision it first). Caps omitted from the body are seeded from the agent’s own limits, so the in-prod card gate enforces the agent’s caps synchronously. Sandbox only.
| id required | string Agent id |
| perTransactionUsd | object or null Per-transaction USD cap. |
| dailyUsd | object or null Rolling 24h USD cap. |
| weeklyUsd | object or null Rolling ISO-week USD cap. |
| monthlyUsd | object or null Calendar-month USD cap. |
| blockedMcc | Array of strings MCCs to decline. Replaces the existing list. |
| allowedMcc | Array of strings or null When set, only these MCCs are allowed. |
{- "perTransactionUsd": "250.00",
- "dailyUsd": "500.00",
- "weeklyUsd": "2000.00",
- "monthlyUsd": "5000.00",
- "blockedMcc": [
- "7995"
], - "allowedMcc": [
- "5411",
- "5812"
]
}{- "cardId": "6ee0b2a0-3c8c-4f49-9d12-bd55b15f02b1",
- "stripeCardId": "ic_1NXxxx",
- "last4": "4242",
- "safeAddress": "0x1111111111111111111111111111111111111111",
- "status": "active"
}Newest-first merge of the agent’s payments, card authorizations, and policy decisions. Read-only.
| id required | string Agent id |
| limit | number Example: limit=50 Max items (1–200). Defaults to 50. |
{- "agentId": "string",
- "items": [
- {
- "type": "payment",
- "id": "string",
- "at": "string"
}
]
}Move a reservation from reserved to settled spend at the actual amount (upto ≤ ceiling) once the facilitator confirms the on-chain transfer. Idempotent per nonce.
| nonce required | string The EIP-3009 nonce returned by authorize. |
| txHash required | string Settlement transaction hash. |
| actualAmount | string Actual settled atomic units (upto ≤ ceiling). Defaults to reserved. |
{- "nonce": "string",
- "txHash": "string",
- "actualAmount": "string"
}{- "nonce": "string",
- "status": "SETTLED"
}Creates a Safe for the caller’s tenant and fires the on-chain deploy asynchronously. Returns the predicted CREATE2 address immediately (usable before the proxy is mined). Defaults: Base Sepolia (84532), threshold 1.
| name required | string Human name for the wallet. |
required | Array of objects (WalletOwnerInput) On-chain owners. At least one; the first defaults to ADMIN_OWNER. |
| threshold | number Signature threshold. Defaults to 1 (sandbox single-owner). |
| chainId | number EVM chain id. Defaults to the platform default (Base Sepolia 84532). |
{- "name": "Acme Treasury",
- "owners": [
- {
- "address": "0x51c2…88",
- "memberId": "string",
- "handle": "string",
- "role": "ADMIN_OWNER",
- "label": "string"
}
], - "threshold": 1,
- "chainId": 84532
}{- "id": "string",
- "address": { },
- "status": "PENDING_DEPLOYMENT",
- "chainId": { },
- "threshold": 0,
- "predictedAddress": true,
- "name": "string",
- "owners": [
- {
- "address": "string",
- "role": "string",
- "label": { }
}
], - "balances": [
- {
- "asset": "usdc",
- "amount": "250.00",
- "decimals": 6
}
], - "createdAt": "string"
}Tenant-scoped, newest first.
| skip | string |
| take | string |
{- "wallets": [
- {
- "id": "string",
- "address": { },
- "status": "PENDING_DEPLOYMENT",
- "chainId": { },
- "threshold": 0,
- "predictedAddress": true,
- "name": "string",
- "owners": [
- {
- "address": "string",
- "role": "string",
- "label": { }
}
], - "balances": [
- {
- "asset": "usdc",
- "amount": "250.00",
- "decimals": 6
}
], - "createdAt": "string"
}
], - "total": 0,
- "skip": 0,
- "take": 0
}Pending Safe transactions across your wallets. Pass ?owner=0x… to get only those a specific owner has not yet signed (their co-sign queue).
| owner | string |
{- "pending": [
- {
- "txId": "string",
- "walletId": "string",
- "walletName": "string",
- "to": "string",
- "value": "string",
- "safeTxHash": { },
- "status": "PROPOSED",
- "signatureCount": 0,
- "threshold": 0,
- "createdAt": "string"
}
]
}| txId required | string |
{- "id": "string",
- "walletId": "string",
- "to": "string",
- "value": "string",
- "data": "string",
- "safeTxHash": { },
- "status": "string",
- "signers": [
- "string"
], - "signatureCount": 0,
- "threshold": 0,
- "createdAt": "string"
}Includes live on-chain balances.
| id required | string |
{- "id": "string",
- "address": { },
- "status": "PENDING_DEPLOYMENT",
- "chainId": { },
- "threshold": 0,
- "predictedAddress": true,
- "name": "string",
- "owners": [
- {
- "address": "string",
- "role": "string",
- "label": { }
}
], - "balances": [
- {
- "asset": "usdc",
- "amount": "250.00",
- "decimals": 6
}
], - "createdAt": "string"
}Builds and pins a SafeTx (to/value/data). Returns the safeTxHash to sign.
| id required | string |
| to required | string Destination contract/EOA (EIP-55). |
| value | string Native value in wei (decimal string). Defaults to "0". |
| data | string Calldata hex. Defaults to 0x. |
| ownerAddress | string Owner address to act as (must be a registered on-chain owner). Optional when the wallet has exactly one on-chain owner. |
{- "to": "0x036CbD…",
- "value": "0",
- "data": "0xa9059cbb…",
- "ownerAddress": "string"
}The signer is recovered from the raw secp256k1 signature over the safeTxHash and must be a registered on-chain owner. When the threshold is met the tx becomes executable.
| txId required | string |
| signature required | string Raw secp256k1 signature over the 32-byte safeTxHash (NOT personal_sign). |
{- "signature": "0x…"
}| txId required | string |
| ownerAddress | string Owner address to act as. Optional for single-owner wallets. |
{- "ownerAddress": "string"
}| txId required | string |
| ownerAddress | string Owner address to act as. Optional for single-owner wallets. |
{- "ownerAddress": "string"
}Proposes an owner-admin SafeTx; the wallet threshold of owners must sign it.
| id required | string |
| newOwner required | string New owner address (EIP-55). |
| threshold required | number Resulting signature threshold (1..ownerCount+1). |
| role | string Enum: "ADMIN_OWNER" "FINANCE_OWNER" "MERCHANT_OPERATOR" DB role for the new owner (default FINANCE_OWNER). |
| ownerAddress | string Acting owner (ADMIN_OWNER). Optional if sole owner. |
{- "newOwner": "string",
- "threshold": 2,
- "role": "ADMIN_OWNER",
- "ownerAddress": "string"
}| id required | string |
| addr required | string Owner address to remove |
| threshold required | number Resulting signature threshold (1..ownerCount-1). |
| ownerAddress | string Acting owner (ADMIN_OWNER). Optional if sole owner. |
{- "threshold": 1,
- "ownerAddress": "string"
}| id required | string |
| addr required | string Existing owner address to replace |
| newOwner required | string The replacement owner address (EIP-55). |
| ownerAddress | string Acting owner (ADMIN_OWNER). Optional if sole owner. |
{- "newOwner": "string",
- "ownerAddress": "string"
}| id required | string |
| threshold required | number New signature threshold (1..ownerCount). |
| ownerAddress | string Acting owner (ADMIN_OWNER). Optional if sole owner. |
{- "threshold": 2,
- "ownerAddress": "string"
}Sends platform-funded test USDC (default) or test ETH to the wallet. TEST environment only; capped at 1000 USDC / 0.02 ETH per drip and rate-limited per wallet and tenant.
| id required | string Wallet id to fund. |
| asset | string Enum: "usdc" "eth" Asset to drip. Defaults to |
| amount | string Human decimal amount (e.g. "250" USDC, "0.01" ETH). Defaults to a per-asset default. Capped at 1000 USDC / 0.02 ETH per drip. |
{- "asset": "usdc",
- "amount": "250"
}{- "id": "d1a2b3c4-...",
- "walletId": "w1",
- "asset": "usdc",
- "amount": "250",
- "chainId": 84532,
- "status": "SUBMITTED",
- "txHash": { },
- "failureReason": { },
- "createdAt": "2026-08-09T12:00:00.000Z"
}Tenant-scoped, newest first.
| walletId | string |
{- "drips": [
- {
- "id": "d1a2b3c4-...",
- "walletId": "w1",
- "asset": "usdc",
- "amount": "250",
- "chainId": 84532,
- "status": "SUBMITTED",
- "txHash": { },
- "failureReason": { },
- "createdAt": "2026-08-09T12:00:00.000Z"
}
]
}{- "id": "d1a2b3c4-...",
- "walletId": "w1",
- "asset": "usdc",
- "amount": "250",
- "chainId": 84532,
- "status": "SUBMITTED",
- "txHash": { },
- "failureReason": { },
- "createdAt": "2026-08-09T12:00:00.000Z"
}Exact match only. Email resolution requires the target to have opted in.
| handle | string |
string |
{- "handle": "acme-treasury",
- "displayName": { },
- "address": "0x7Fb2…c41A",
- "chainId": 84532,
- "verified": true
}Points an @handle at one of your wallets so others can pay you by name.
| handle required | string Handle to claim (without the @). |
| walletId required | string Wallet id this handle resolves to. |
| discoverableByEmail | boolean Opt in to email-based resolution. |
string Contact email for email resolution. |
{- "handle": "acme-treasury",
- "walletId": "w1",
- "discoverableByEmail": false,
- "email": "string"
}{- "handle": "acme-treasury",
- "displayName": { },
- "address": "0x7Fb2…c41A",
- "chainId": 84532,
- "verified": true
}| label required | string Short label used as |
| displayName | string |
| notes | string |
required | object (ContactDestinationInput) |
{- "label": "acme",
- "displayName": "Acme Robotics",
- "notes": "string",
- "destination": {
- "type": "handle",
- "handle": "string",
- "address": "string",
- "email": "string",
- "walletId": "string",
- "chainId": 0
}
}{- "id": "string",
- "label": "string",
- "displayName": { },
- "notes": { },
- "destination": {
- "type": "handle",
- "handle": "string",
- "address": "string",
- "email": "string",
- "walletId": "string",
- "chainId": 0
}, - "createdAt": "string"
}{- "contacts": [
- {
- "id": "string",
- "label": "string",
- "displayName": { },
- "notes": { },
- "destination": {
- "type": "handle",
- "handle": "string",
- "address": "string",
- "email": "string",
- "walletId": "string",
- "chainId": 0
}, - "createdAt": "string"
}
]
}{- "id": "string",
- "label": "string",
- "displayName": { },
- "notes": { },
- "destination": {
- "type": "handle",
- "handle": "string",
- "address": "string",
- "email": "string",
- "walletId": "string",
- "chainId": 0
}, - "createdAt": "string"
}| id required | string |
| displayName | string |
| notes | string |
object (ContactDestinationInput) |
{- "displayName": "string",
- "notes": "string",
- "destination": {
- "type": "handle",
- "handle": "string",
- "address": "string",
- "email": "string",
- "walletId": "string",
- "chainId": 0
}
}{- "id": "string",
- "label": "string",
- "displayName": { },
- "notes": { },
- "destination": {
- "type": "handle",
- "handle": "string",
- "address": "string",
- "email": "string",
- "walletId": "string",
- "chainId": 0
}, - "createdAt": "string"
}| kind required | string Enum: "KYC" "KYB" KYC verifies a member; KYB the tenant. |
| memberId | string TenantMember id — required for KYC, ignored for KYB. |
| legalName | string Subject legal name. Defaults to the member display name (KYC) or tenant name (KYB). |
string Subject contact email; defaults to the member email. | |
| country | string ISO-3166 alpha-2 country code. |
{- "kind": "KYC",
- "memberId": "string",
- "legalName": "string",
- "email": "string",
- "country": "DE"
}{- "id": "string",
- "kind": "KYC",
- "subjectType": "TENANT",
- "subjectId": "string",
- "legalName": "string",
- "status": "CREATED",
- "requirements": [
- {
- "type": "authorized_representative_kyc",
- "status": "PENDING",
- "subjectRef": "string"
}
], - "credentialId": { },
- "createdAt": "string",
- "updatedAt": "string",
- "completedAt": { }
}| subject_type required | string |
| subject_id required | string |
{- "sessions": [
- {
- "id": "string",
- "kind": "KYC",
- "subjectType": "TENANT",
- "subjectId": "string",
- "legalName": "string",
- "status": "CREATED",
- "requirements": [
- {
- "type": "authorized_representative_kyc",
- "status": "PENDING",
- "subjectRef": "string"
}
], - "credentialId": { },
- "createdAt": "string",
- "updatedAt": "string",
- "completedAt": { }
}
]
}| id required | string |
{- "id": "string",
- "kind": "KYC",
- "subjectType": "TENANT",
- "subjectId": "string",
- "legalName": "string",
- "status": "CREATED",
- "requirements": [
- {
- "type": "authorized_representative_kyc",
- "status": "PENDING",
- "subjectRef": "string"
}
], - "credentialId": { },
- "createdAt": "string",
- "updatedAt": "string",
- "completedAt": { }
}| id required | string |
{- "id": "string",
- "kind": "KYC",
- "subjectType": "TENANT",
- "subjectId": "string",
- "legalName": "string",
- "status": "CREATED",
- "requirements": [
- {
- "type": "authorized_representative_kyc",
- "status": "PENDING",
- "subjectRef": "string"
}
], - "credentialId": { },
- "createdAt": "string",
- "updatedAt": "string",
- "completedAt": { }
}| id required | string |
{- "id": "string",
- "kind": "KYC",
- "subjectType": "TENANT",
- "subjectId": "string",
- "legalName": "string",
- "status": "CREATED",
- "requirements": [
- {
- "type": "authorized_representative_kyc",
- "status": "PENDING",
- "subjectRef": "string"
}
], - "credentialId": { },
- "createdAt": "string",
- "updatedAt": "string",
- "completedAt": { }
}| subject_type required | string |
| subject_id required | string |
{- "credentials": [
- {
- "id": "string",
- "kind": "PERSON_IDENTITY",
- "subjectType": "TENANT",
- "subjectId": "string",
- "status": "ACTIVE",
- "legalName": "string",
- "issuedAt": "string",
- "expiresAt": { },
- "revokedAt": { },
- "revokedReason": { }
}
]
}{- "id": "string",
- "kind": "PERSON_IDENTITY",
- "subjectType": "TENANT",
- "subjectId": "string",
- "status": "ACTIVE",
- "legalName": "string",
- "issuedAt": "string",
- "expiresAt": { },
- "revokedAt": { },
- "revokedReason": { }
}| type | string Enum: "ONCHAIN_WALLET" "PAYPAL" "VENMO" "US_BANK_ACH" "SEPA" "SAFEBANK_BALANCE" Defaults to ONCHAIN_WALLET when an address is supplied (legacy shape). |
| asset | string Asset symbol (on-chain types). |
| network | string Network key, lowercase (on-chain types). |
| address | string Receiving address, stored verbatim (case-sensitive). |
string PayPal email. | |
| phone | string E.164 phone (PayPal/Venmo). |
| handle | string Venmo handle (without @). |
| routingNumber | string US ABA routing number (US_BANK_ACH). |
| accountNumber | string US bank account number (US_BANK_ACH). |
| iban | string IBAN (SEPA). |
| country | string ISO-3166 alpha-2 country. |
| currency | string ISO-4217 payout currency (fiat rails). |
| label | string Display label override. |
{- "type": "ONCHAIN_WALLET",
- "asset": "USDT",
- "network": "tron",
- "address": "string",
- "email": "string",
- "phone": "string",
- "handle": "string",
- "routingNumber": "string",
- "accountNumber": "string",
- "iban": "string",
- "country": "string",
- "currency": "string",
- "label": "string"
}{- "id": "string",
- "type": "STABLECOIN_ADDRESS",
- "asset": { },
- "network": { },
- "address": { },
- "provider": { },
- "country": { },
- "currency": { },
- "maskedLabel": "string",
- "status": "PENDING_VERIFICATION",
- "ownershipStatus": "DECLARED",
- "verificationCredentialId": { },
- "priority": 0,
- "allowAutomaticFallback": true,
- "isDefault": true,
- "consentedAt": { },
- "verifiedAt": { },
- "revokedAt": { },
- "createdAt": "string"
}{- "destinations": [
- {
- "id": "string",
- "type": "STABLECOIN_ADDRESS",
- "asset": { },
- "network": { },
- "address": { },
- "provider": { },
- "country": { },
- "currency": { },
- "maskedLabel": "string",
- "status": "PENDING_VERIFICATION",
- "ownershipStatus": "DECLARED",
- "verificationCredentialId": { },
- "priority": 0,
- "allowAutomaticFallback": true,
- "isDefault": true,
- "consentedAt": { },
- "verifiedAt": { },
- "revokedAt": { },
- "createdAt": "string"
}
]
}| id required | string |
{- "id": "string",
- "type": "STABLECOIN_ADDRESS",
- "asset": { },
- "network": { },
- "address": { },
- "provider": { },
- "country": { },
- "currency": { },
- "maskedLabel": "string",
- "status": "PENDING_VERIFICATION",
- "ownershipStatus": "DECLARED",
- "verificationCredentialId": { },
- "priority": 0,
- "allowAutomaticFallback": true,
- "isDefault": true,
- "consentedAt": { },
- "verifiedAt": { },
- "revokedAt": { },
- "createdAt": "string"
}| id required | string |
| label | string Display label. |
| priority | number Ordering preference among own destinations. |
| allowAutomaticFallback | boolean Consent to automatic fallback routing to this destination (spec rule 14). |
{- "label": "string",
- "priority": 0,
- "allowAutomaticFallback": true
}{- "id": "string",
- "type": "STABLECOIN_ADDRESS",
- "asset": { },
- "network": { },
- "address": { },
- "provider": { },
- "country": { },
- "currency": { },
- "maskedLabel": "string",
- "status": "PENDING_VERIFICATION",
- "ownershipStatus": "DECLARED",
- "verificationCredentialId": { },
- "priority": 0,
- "allowAutomaticFallback": true,
- "isDefault": true,
- "consentedAt": { },
- "verifiedAt": { },
- "revokedAt": { },
- "createdAt": "string"
}| id required | string |
{- "id": "string",
- "type": "STABLECOIN_ADDRESS",
- "asset": { },
- "network": { },
- "address": { },
- "provider": { },
- "country": { },
- "currency": { },
- "maskedLabel": "string",
- "status": "PENDING_VERIFICATION",
- "ownershipStatus": "DECLARED",
- "verificationCredentialId": { },
- "priority": 0,
- "allowAutomaticFallback": true,
- "isDefault": true,
- "consentedAt": { },
- "verifiedAt": { },
- "revokedAt": { },
- "createdAt": "string"
}| id required | string |
{- "id": "string",
- "type": "STABLECOIN_ADDRESS",
- "asset": { },
- "network": { },
- "address": { },
- "provider": { },
- "country": { },
- "currency": { },
- "maskedLabel": "string",
- "status": "PENDING_VERIFICATION",
- "ownershipStatus": "DECLARED",
- "verificationCredentialId": { },
- "priority": 0,
- "allowAutomaticFallback": true,
- "isDefault": true,
- "consentedAt": { },
- "verifiedAt": { },
- "revokedAt": { },
- "createdAt": "string"
}| id required | string |
{- "id": "string",
- "type": "STABLECOIN_ADDRESS",
- "asset": { },
- "network": { },
- "address": { },
- "provider": { },
- "country": { },
- "currency": { },
- "maskedLabel": "string",
- "status": "PENDING_VERIFICATION",
- "ownershipStatus": "DECLARED",
- "verificationCredentialId": { },
- "priority": 0,
- "allowAutomaticFallback": true,
- "isDefault": true,
- "consentedAt": { },
- "verifiedAt": { },
- "revokedAt": { },
- "createdAt": "string"
}| action required | string Enum: "payments.create" "invoices.pay" "ramps.offramp" |
{- "action": "payments.create"
}{- "eligible": true,
- "mode": "off",
- "requirements": [
- {
- "kind": "BUSINESS_IDENTITY",
- "satisfied": true,
- "credentialId": { }
}
]
}{- "factors": [
- {
- "id": "string",
- "type": "EMAIL",
- "status": "PENDING",
- "label": { },
- "hint": "string",
- "verifiedAt": { },
- "usableAt": { },
- "usableNow": true,
- "lastUsedAt": { },
- "createdAt": "string"
}
], - "requiredFactors": 0,
- "usableFactors": 0
}Sends a confirmation code (EMAIL/SMS) or returns a TOTP secret. The factor stays PENDING until POST /v1/2fa/factors/{id}/verify proves control of the channel.
| type required | string Enum: "EMAIL" "SMS" "TOTP" "PRIVY_MFA" |
string Required when type=EMAIL. | |
| phoneE164 | string Required when type=SMS. E.164, e.g. +15551234567. |
| label | string Optional friendly name, e.g. "work phone". |
{- "type": "EMAIL",
- "email": "string",
- "phoneE164": "string",
- "label": "string"
}{- "factorId": "string",
- "type": "EMAIL",
- "status": "string",
- "hint": "string",
- "secretBase32": "string",
- "otpauthUri": "string",
- "signerAddress": "string"
}| factorId required | string |
| code | string 6-digit code (EMAIL / SMS / TOTP). |
| signature | string EIP-712 signature (PRIVY_MFA). |
{- "code": "string",
- "signature": "string"
}{- "id": "string",
- "type": "EMAIL",
- "status": "PENDING",
- "label": { },
- "hint": "string",
- "verifiedAt": { },
- "usableAt": { },
- "usableNow": true,
- "lastUsedAt": { },
- "createdAt": "string"
}Effective immediately. Refused if it would drop your usable factors below the tenant requirement, or leave you with only email/SMS (which would make your funds unreachable during a provider outage).
| factorId required | string |
Also used to resend. The message states the amount and destination — that is the anti-phishing control, so compare it against what you are actually sending.
| challengeId required | string |
| factorId required | string Which enrolled factor to deliver the code to. |
{- "factorId": "string"
}Repeat until satisfiedFactors reaches requiredFactors, then replay the original request with the X-SafeBank-2FA-Challenge header.
| challengeId required | string |
| factorId required | string |
| code | string 6-digit code (EMAIL / SMS / TOTP). |
| signature | string EIP-712 signature (PRIVY_MFA). |
{- "factorId": "string",
- "code": "string",
- "signature": "string"
}Owner/admin user sessions only — never an API key, whatever scopes it holds. The cooling-off window cannot be set below 24h while protection is enabled.
| enabled | boolean |
| coolingOffSeconds | number >= 86400 Minimum 86400 (24h) while enabled. |
| thresholdUsd | string |
| requiredFactors | number >= 1 |
{- "enabled": true,
- "coolingOffSeconds": 86400,
- "thresholdUsd": "100",
- "requiredFactors": 1
}{- "enabled": true,
- "coolingOffSeconds": 0,
- "thresholdUsd": "string",
- "requiredFactors": 0,
- "updatedAt": { }
}Resolves the destination, OFAC-screens the recipient, and proposes a USDC transfer on the source Safe. Returns the payment with its safeTxHash to sign.
| x-safebank-2fa-challenge | string A satisfied two-factor challenge id, replayed after a 403 TWOFA_REQUIRED. Sent as a HEADER rather than a body field so the request body — and therefore the Idempotency-Key hash — is byte-identical between the original call and the retry. |
| sourceWalletId required | string Wallet to pay from. |
required | object (PaymentDestinationInput) |
required | object (PaymentAmountInput) |
| memo | string Free-text memo. |
| ownerAddress | string Owner address to act as (must be a registered on-chain owner). Optional for single-owner wallets. |
{- "sourceWalletId": "w1",
- "destination": {
- "type": "handle",
- "handle": "volt-components",
- "label": "acme",
- "email": "string",
- "address": "string",
- "chainId": 0,
- "walletId": "string"
}, - "amount": {
- "asset": "usdc",
- "value": "25.00"
}, - "memo": "string",
- "ownerAddress": "string"
}{- "id": "string",
- "sourceWalletId": "string",
- "destinationType": "handle",
- "destinationHandle": { },
- "destinationAddress": "string",
- "destinationChainId": 0,
- "asset": "usdc",
- "amount": "25.00",
- "status": "CREATED",
- "safeTxHash": { },
- "executedTxHash": { },
- "memo": { },
- "failureReason": { },
- "createdAt": "string"
}Tenant-scoped, newest first.
| skip | string |
| take | string |
{- "payments": [
- {
- "id": "string",
- "sourceWalletId": "string",
- "destinationType": "handle",
- "destinationHandle": { },
- "destinationAddress": "string",
- "destinationChainId": 0,
- "asset": "usdc",
- "amount": "25.00",
- "status": "CREATED",
- "safeTxHash": { },
- "executedTxHash": { },
- "memo": { },
- "failureReason": { },
- "createdAt": "string"
}
], - "total": 0,
- "skip": 0,
- "take": 0
}{- "id": "string",
- "sourceWalletId": "string",
- "destinationType": "handle",
- "destinationHandle": { },
- "destinationAddress": "string",
- "destinationChainId": 0,
- "asset": "usdc",
- "amount": "25.00",
- "status": "CREATED",
- "safeTxHash": { },
- "executedTxHash": { },
- "memo": { },
- "failureReason": { },
- "createdAt": "string"
}Submits an owner signature over the safeTxHash. Once the threshold is met the payment auto-executes on-chain.
| id required | string |
| signature required | string Raw secp256k1 signature over the safeTxHash. |
{- "signature": "string"
}{- "id": "string",
- "sourceWalletId": "string",
- "destinationType": "handle",
- "destinationHandle": { },
- "destinationAddress": "string",
- "destinationChainId": 0,
- "asset": "usdc",
- "amount": "25.00",
- "status": "CREATED",
- "safeTxHash": { },
- "executedTxHash": { },
- "memo": { },
- "failureReason": { },
- "createdAt": "string"
}| id required | string |
| ownerAddress | string Owner address to act as. Optional for single-owner wallets. |
{- "ownerAddress": "string"
}{- "id": "string",
- "sourceWalletId": "string",
- "destinationType": "handle",
- "destinationHandle": { },
- "destinationAddress": "string",
- "destinationChainId": 0,
- "asset": "usdc",
- "amount": "25.00",
- "status": "CREATED",
- "safeTxHash": { },
- "executedTxHash": { },
- "memo": { },
- "failureReason": { },
- "createdAt": "string"
}| id required | string |
| ownerAddress | string Owner address to act as. Optional for single-owner wallets. |
{- "ownerAddress": "string"
}{- "id": "string",
- "sourceWalletId": "string",
- "destinationType": "handle",
- "destinationHandle": { },
- "destinationAddress": "string",
- "destinationChainId": 0,
- "asset": "usdc",
- "amount": "25.00",
- "status": "CREATED",
- "safeTxHash": { },
- "executedTxHash": { },
- "memo": { },
- "failureReason": { },
- "createdAt": "string"
}Creates one Safe per bucket (202 — CREATE2 addresses are usable immediately, deployment is async). Sandbox-only for now.
| name required | string Treasury name. |
required | Array of objects (WalletOwnerInput) Safe owners applied to every bucket wallet. |
| threshold | number Signature threshold per bucket Safe. Defaults to 1. |
| chainId | number EVM chain id. Defaults to Base Sepolia (84532). |
required | Array of objects (TreasuryBucketInput) 1-8 buckets, one Safe each. |
{- "name": "Acme Treasury",
- "owners": [
- {
- "address": "0x51c2…88",
- "memberId": "string",
- "handle": "string",
- "role": "ADMIN_OWNER",
- "label": "string"
}
], - "threshold": 0,
- "chainId": 0,
- "buckets": [
- {
- "name": "Operating",
- "kind": "OPERATING",
- "targetBps": 6000,
- "apyBps": 450
}
]
}{- "accountId": "string",
- "name": "string",
- "buckets": [
- {
- "bucketId": "string",
- "name": "string",
- "kind": "OPERATING",
- "targetBps": 0,
- "apyBps": { },
- "walletId": "string",
- "safeAddress": { },
- "walletStatus": "string",
- "balanceUsd": { },
- "driftBps": { },
- "accruedYieldUsd": "string",
- "simulatedYield": true
}
], - "totalUsd": { },
- "createdAt": "string"
}Live bucket balances, drift vs targetBps, and accrued simulated yield. A bucket whose balance cannot be read right now reports null (never zero).
| id required | string |
{- "accountId": "string",
- "name": "string",
- "buckets": [
- {
- "bucketId": "string",
- "name": "string",
- "kind": "OPERATING",
- "targetBps": 0,
- "apyBps": { },
- "walletId": "string",
- "safeAddress": { },
- "walletStatus": "string",
- "balanceUsd": { },
- "driftBps": { },
- "accruedYieldUsd": "string",
- "simulatedYield": true
}
], - "totalUsd": { },
- "createdAt": "string"
}| id required | string |
| type required | string Enum: "SWEEP_EXCESS" "TOP_UP" "REBALANCE_TO_TARGET" |
| sourceBucketId | string Source bucket id (SWEEP_EXCESS / TOP_UP). |
| destBucketId | string Destination bucket id (SWEEP_EXCESS / TOP_UP). |
| thresholdUsd | string SWEEP_EXCESS: balance above this is swept. TOP_UP: trigger level (defaults to targetUsd). |
| targetUsd | string TOP_UP: refill the destination back up to this level. |
| intervalSeconds | number Minimum seconds between fires. Default 3600. |
| enabled | boolean Rules are enabled by default. |
{- "type": "SWEEP_EXCESS",
- "sourceBucketId": "string",
- "destBucketId": "string",
- "thresholdUsd": "1000.00",
- "targetUsd": "500.00",
- "intervalSeconds": 0,
- "enabled": true
}{- "ruleId": "string",
- "accountId": "string",
- "type": "SWEEP_EXCESS",
- "sourceBucketId": { },
- "destBucketId": { },
- "thresholdUsd": { },
- "targetUsd": { },
- "intervalSeconds": 0,
- "enabled": true,
- "lastFiredAt": { },
- "createdAt": "string"
}{- "rules": [
- {
- "ruleId": "string",
- "accountId": "string",
- "type": "SWEEP_EXCESS",
- "sourceBucketId": { },
- "destBucketId": { },
- "thresholdUsd": { },
- "targetUsd": { },
- "intervalSeconds": 0,
- "enabled": true,
- "lastFiredAt": { },
- "createdAt": "string"
}
], - "total": 0
}| ruleId required | string |
| thresholdUsd | string |
| targetUsd | string |
| intervalSeconds | number |
| enabled | boolean |
{- "thresholdUsd": "string",
- "targetUsd": "string",
- "intervalSeconds": 0,
- "enabled": true
}{- "ruleId": "string",
- "accountId": "string",
- "type": "SWEEP_EXCESS",
- "sourceBucketId": { },
- "destBucketId": { },
- "thresholdUsd": { },
- "targetUsd": { },
- "intervalSeconds": 0,
- "enabled": true,
- "lastFiredAt": { },
- "createdAt": "string"
}Proposes a bucket-to-bucket USDC Payment. Execution requires owner signatures via the payments API (a 1-of-1 Safe completes in a single sign call).
| id required | string |
| sourceBucketId required | string Bucket to move USDC out of. |
| destBucketId required | string Bucket to move USDC into. |
| amountUsd required | string USD amount to move. |
| ownerAddress | string Acting owner for the proposal (required when the Safe has multiple owners). |
{- "sourceBucketId": "string",
- "destBucketId": "string",
- "amountUsd": "250.00",
- "ownerAddress": "string"
}{- "sweepId": "string",
- "accountId": "string",
- "ruleId": { },
- "sourceBucketId": "string",
- "destBucketId": "string",
- "amountUsd": "string",
- "status": "PROPOSED",
- "paymentId": { },
- "paymentStatus": { },
- "failureReason": { },
- "createdAt": "string"
}Includes the live status of each sweep’s linked payment.
| id required | string |
{- "sweeps": [
- {
- "sweepId": "string",
- "accountId": "string",
- "ruleId": { },
- "sourceBucketId": "string",
- "destBucketId": "string",
- "amountUsd": "string",
- "status": "PROPOSED",
- "paymentId": { },
- "paymentStatus": { },
- "failureReason": { },
- "createdAt": "string"
}
], - "total": 0
}on = credit the wallet Safe with USDC (fiat debit simulated; completes immediately). off = propose a Safe debit to the liquidation address — owners sign the linked payment and the (simulated) fiat payout confirms when it executes. Sandbox-only.
| walletId required | string Wallet whose Safe is credited (on) or debited (off). |
| direction required | string Enum: "on" "off" on = fiat->USDC, off = USDC->fiat. |
| amount required | string USD amount. |
| provider | string Default: "simulated" Enum: "simulated" "privy" "stripe" "visa" "ousd" Ramp provider. Only |
{- "walletId": "string",
- "direction": "on",
- "amount": "100.00",
- "provider": "simulated"
}{- "rampId": "string",
- "walletId": "string",
- "direction": "ON",
- "provider": "simulated",
- "amountUsd": "string",
- "status": "SUBMITTED",
- "txHash": { },
- "paymentId": { },
- "paymentStatus": { },
- "fiatRef": { },
- "simulated": true,
- "failureReason": { },
- "createdAt": "string"
}{- "ramps": [
- {
- "rampId": "string",
- "walletId": "string",
- "direction": "ON",
- "provider": "simulated",
- "amountUsd": "string",
- "status": "SUBMITTED",
- "txHash": { },
- "paymentId": { },
- "paymentStatus": { },
- "fiatRef": { },
- "simulated": true,
- "failureReason": { },
- "createdAt": "string"
}
], - "total": 0
}{- "rampId": "string",
- "walletId": "string",
- "direction": "ON",
- "provider": "simulated",
- "amountUsd": "string",
- "status": "SUBMITTED",
- "txHash": { },
- "paymentId": { },
- "paymentStatus": { },
- "fiatRef": { },
- "simulated": true,
- "failureReason": { },
- "createdAt": "string"
}Compiles the document to an immutable v1 (IR + sha256) and makes it active.
| name required | string Human name for the policy. |
| document required | object The policy document (schemaVersion 1): limits (per-txn/daily/weekly/monthly USD), mcc (blocked/allowed), counterparties (blocked). Compiled to an immutable versioned IR. |
{- "name": "AP bot guardrails",
- "document": {
- "schemaVersion": 1,
- "limits": {
- "perTransactionUsd": "250.00",
- "dailyUsd": "1000.00"
}, - "mcc": {
- "blocked": [
- "7995"
]
}
}
}{- "policyId": "string",
- "name": "string",
- "status": "ACTIVE",
- "activeVersionId": { },
- "activeVersion": { },
- "createdAt": "string"
}Deterministically tests a hypothetical transaction against a policy (by id or by the policy attached to a subject) using the same engine that gates live authorizations. Returns allow/deny + a per-rule trace and writes a DecisionLog audit row.
| policyId | string Evaluate a specific policy id (else the one attached to the subject). |
| subjectType | string Enum: "wallet" "card" "agent" "treasury_account" Resolve the attached policy. |
| subjectId | string |
| amountUsd required | string Transaction USD amount to test. |
| mcc | string 4-digit MCC to test. |
| counterparty | string Counterparty address to test. |
{- "policyId": "string",
- "subjectType": "wallet",
- "subjectId": "string",
- "amountUsd": "120.00",
- "mcc": "5411",
- "counterparty": "string"
}{- "allow": true,
- "reason": { },
- "policyId": { },
- "policyVersion": { },
- "sha256": { },
- "ruleTrace": [
- {
- "rule": "PER_TXN_LIMIT",
- "result": "pass",
- "detail": { }
}
], - "decisionLogId": "string"
}Appends an immutable version and makes it the active one.
| id required | string |
| document required | object A new document — committed as the next immutable version. |
{- "document": { }
}{- "versionId": "string",
- "version": 0,
- "sha256": "string",
- "ir": { },
- "createdAt": "string"
}Binds the policy to a wallet / card / agent / treasury account. One active policy per subject. Attachments scope dry-run evaluation today; live gating is a later increment.
| id required | string |
| subjectType required | string Enum: "wallet" "card" "agent" "treasury_account" |
| subjectId required | string Id of the wallet / card / agent / treasury account. |
{- "subjectType": "wallet",
- "subjectId": "string"
}{- "attachmentId": "string",
- "policyId": "string",
- "subjectType": "wallet",
- "subjectId": "string",
- "attachedAt": "string"
}| payeeName | string Human label for the payee. |
| description | string What the invoice is for. |
| amountUsd required | string Amount due, USD. |
| payerAddress required | string Payer address (funds the hold Safe). |
| payeeAddress required | string Payee address (receives a release). |
| arbiterAddress | string Platform arbiter address (tie-break owner). Defaults to the platform arbiter. |
| chainId | number EVM chain id. Defaults to Base Sepolia (84532). |
| expiresAt | string ISO-8601 auto-expiry for the unfunded invoice. |
{- "payeeName": "Volt Components",
- "description": "string",
- "amountUsd": "120.00",
- "payerAddress": "0x1111…",
- "payeeAddress": "0x2222…",
- "arbiterAddress": "string",
- "chainId": 0,
- "expiresAt": "string"
}{- "invoiceId": "string",
- "payeeName": { },
- "description": { },
- "amountUsd": "string",
- "payerAddress": "string",
- "payeeAddress": "string",
- "arbiterAddress": "string",
- "chainId": 0,
- "status": "DRAFT",
- "holdWalletId": { },
- "holdAddress": { },
- "releasePaymentId": { },
- "refundPaymentId": { },
- "expiresAt": { },
- "createdAt": "string"
}{- "invoices": [
- {
- "invoiceId": "string",
- "payeeName": { },
- "description": { },
- "amountUsd": "string",
- "payerAddress": "string",
- "payeeAddress": "string",
- "arbiterAddress": "string",
- "chainId": 0,
- "status": "DRAFT",
- "holdWalletId": { },
- "holdAddress": { },
- "releasePaymentId": { },
- "refundPaymentId": { },
- "expiresAt": { },
- "createdAt": "string"
}
], - "total": 0
}The caller is the sender: targets the recipient by @handle or wallet address and carries an EIP-712 InvoiceAuthorization signed by a registered member key.
| toHandle | string Recipient's SafeBank @handle (or use toAddress). |
| toAddress | string Recipient's wallet address (or use toHandle). |
| amountUsd required | string Amount due, USD. |
| payeeAddress required | string Address that receives payment (the sender). |
| payeeName | string Human label for the payee (bound by docHash). |
| description | string What the bill is for (bound by docHash). |
| chainId | number EVM chain id. Defaults to the payer wallet chain. |
| senderAddress required | string Address that SIGNED the authorization (a member key). |
| signature required | string EIP-712 InvoiceAuthorization signature. |
| sigNonce required | string Single-use replay nonce (uint256 as a decimal string). |
| sigExpiresAt required | string ISO-8601 authorization expiry. |
| sigDocHash | string sha256 of the signed human-readable terms (bytes32). |
| domainChainId | number EIP-712 domain chainId (defaults to the bill chainId). |
| domainVerifyingContract | string EIP-712 domain verifyingContract anchor. |
{- "toHandle": "string",
- "toAddress": "string",
- "amountUsd": "120.00",
- "payeeAddress": "string",
- "payeeName": "string",
- "description": "string",
- "chainId": 0,
- "senderAddress": "string",
- "signature": "string",
- "sigNonce": "string",
- "sigExpiresAt": "string",
- "sigDocHash": "string",
- "domainChainId": 0,
- "domainVerifyingContract": "string"
}{- "invoiceId": "string",
- "amountUsd": "string",
- "payerAddress": "string",
- "payeeAddress": "string",
- "payeeName": { },
- "description": { },
- "chainId": 0,
- "payerTenantId": { },
- "senderTenantId": { },
- "senderAddress": { },
- "verificationStatus": "UNVERIFIED",
- "payerDecision": "ACCEPTED",
- "payerPaymentId": { },
- "sigExpiresAt": { },
- "createdAt": "string"
}| verification | string Enum: "UNVERIFIED" "VERIFIED" "FAILED" |
{- "bills": [
- {
- "invoiceId": "string",
- "amountUsd": "string",
- "payerAddress": "string",
- "payeeAddress": "string",
- "payeeName": { },
- "description": { },
- "chainId": 0,
- "payerTenantId": { },
- "senderTenantId": { },
- "senderAddress": { },
- "verificationStatus": "UNVERIFIED",
- "payerDecision": "ACCEPTED",
- "payerPaymentId": { },
- "sigExpiresAt": { },
- "createdAt": "string"
}
], - "total": 0
}{- "invoiceId": "string",
- "amountUsd": "string",
- "payerAddress": "string",
- "payeeAddress": "string",
- "payeeName": { },
- "description": { },
- "chainId": 0,
- "payerTenantId": { },
- "senderTenantId": { },
- "senderAddress": { },
- "verificationStatus": "UNVERIFIED",
- "payerDecision": "ACCEPTED",
- "payerPaymentId": { },
- "sigExpiresAt": { },
- "createdAt": "string"
}{- "invoiceId": "string",
- "payeeName": { },
- "description": { },
- "amountUsd": "string",
- "payerAddress": "string",
- "payeeAddress": "string",
- "arbiterAddress": "string",
- "chainId": 0,
- "status": "DRAFT",
- "holdWalletId": { },
- "holdAddress": { },
- "releasePaymentId": { },
- "refundPaymentId": { },
- "expiresAt": { },
- "createdAt": "string"
}Provisions the 2-of-3 hold Safe (202 — async deploy) and returns funding info.
| id required | string |
{- "invoiceId": "string",
- "payeeName": { },
- "description": { },
- "amountUsd": "string",
- "payerAddress": "string",
- "payeeAddress": "string",
- "arbiterAddress": "string",
- "chainId": 0,
- "status": "DRAFT",
- "holdWalletId": { },
- "holdAddress": { },
- "releasePaymentId": { },
- "refundPaymentId": { },
- "expiresAt": { },
- "createdAt": "string"
}| id required | string |
| evidence | string Delivery evidence (note / URL / reference). |
{- "evidence": "string"
}{- "invoiceId": "string",
- "payeeName": { },
- "description": { },
- "amountUsd": "string",
- "payerAddress": "string",
- "payeeAddress": "string",
- "arbiterAddress": "string",
- "chainId": 0,
- "status": "DRAFT",
- "holdWalletId": { },
- "holdAddress": { },
- "releasePaymentId": { },
- "refundPaymentId": { },
- "expiresAt": { },
- "createdAt": "string"
}Proposes the release payment; two of the three owners must sign to execute it.
| id required | string |
| ownerAddress | string Acting owner for the release/refund proposal (defaults to the sole on-chain owner). |
{- "ownerAddress": "string"
}{- "invoiceId": "string",
- "payeeName": { },
- "description": { },
- "amountUsd": "string",
- "payerAddress": "string",
- "payeeAddress": "string",
- "arbiterAddress": "string",
- "chainId": 0,
- "status": "DRAFT",
- "holdWalletId": { },
- "holdAddress": { },
- "releasePaymentId": { },
- "refundPaymentId": { },
- "expiresAt": { },
- "createdAt": "string"
}Proposes the refund payment; two of the three owners must sign to execute it.
| id required | string |
| ownerAddress | string Acting owner for the release/refund proposal (defaults to the sole on-chain owner). |
{- "ownerAddress": "string"
}{- "invoiceId": "string",
- "payeeName": { },
- "description": { },
- "amountUsd": "string",
- "payerAddress": "string",
- "payeeAddress": "string",
- "arbiterAddress": "string",
- "chainId": 0,
- "status": "DRAFT",
- "holdWalletId": { },
- "holdAddress": { },
- "releasePaymentId": { },
- "refundPaymentId": { },
- "expiresAt": { },
- "createdAt": "string"
}| id required | string |
{- "invoiceId": "string",
- "payeeName": { },
- "description": { },
- "amountUsd": "string",
- "payerAddress": "string",
- "payeeAddress": "string",
- "arbiterAddress": "string",
- "chainId": 0,
- "status": "DRAFT",
- "holdWalletId": { },
- "holdAddress": { },
- "releasePaymentId": { },
- "refundPaymentId": { },
- "expiresAt": { },
- "createdAt": "string"
}| id required | string |
{- "invoiceId": "string",
- "amountUsd": "string",
- "payerAddress": "string",
- "payeeAddress": "string",
- "payeeName": { },
- "description": { },
- "chainId": 0,
- "payerTenantId": { },
- "senderTenantId": { },
- "senderAddress": { },
- "verificationStatus": "UNVERIFIED",
- "payerDecision": "ACCEPTED",
- "payerPaymentId": { },
- "sigExpiresAt": { },
- "createdAt": "string"
}| id required | string |
{- "invoiceId": "string",
- "amountUsd": "string",
- "payerAddress": "string",
- "payeeAddress": "string",
- "payeeName": { },
- "description": { },
- "chainId": 0,
- "payerTenantId": { },
- "senderTenantId": { },
- "senderAddress": { },
- "verificationStatus": "UNVERIFIED",
- "payerDecision": "ACCEPTED",
- "payerPaymentId": { },
- "sigExpiresAt": { },
- "createdAt": "string"
}| id required | string |
{- "invoiceId": "string",
- "amountUsd": "string",
- "payerAddress": "string",
- "payeeAddress": "string",
- "payeeName": { },
- "description": { },
- "chainId": 0,
- "payerTenantId": { },
- "senderTenantId": { },
- "senderAddress": { },
- "verificationStatus": "UNVERIFIED",
- "payerDecision": "ACCEPTED",
- "payerPaymentId": { },
- "sigExpiresAt": { },
- "createdAt": "string"
}Direct payment to the payee; rides M-of-N if the source wallet is multi-owner.
| id required | string |
| sourceWalletId required | string The wallet to pay the bill from. |
| ownerAddress | string Acting owner for the payment (if the wallet is M-of-N). |
{- "sourceWalletId": "string",
- "ownerAddress": "string"
}{- "invoiceId": "string",
- "amountUsd": "string",
- "payerAddress": "string",
- "payeeAddress": "string",
- "payeeName": { },
- "description": { },
- "chainId": 0,
- "payerTenantId": { },
- "senderTenantId": { },
- "senderAddress": { },
- "verificationStatus": "UNVERIFIED",
- "payerDecision": "ACCEPTED",
- "payerPaymentId": { },
- "sigExpiresAt": { },
- "createdAt": "string"
}{- "netBalanceUsd": "string",
- "balancePartial": true,
- "wallets": [
- {
- "walletId": "string",
- "name": { },
- "address": { },
- "chainId": { },
- "status": "string",
- "balanceUsd": { }
}
], - "billsOwed": {
- "count": 0,
- "totalUsd": "string",
- "bills": [
- {
- "invoiceId": "string",
- "amountUsd": "string",
- "senderAddress": { },
- "verificationStatus": "UNVERIFIED",
- "payerDecision": "ACCEPTED",
- "createdAt": "string"
}
]
}, - "recentActivity": [
- {
- "id": "string",
- "status": "string",
- "amountUsd": "string",
- "asset": "string",
- "destination": "string",
- "createdAt": "string"
}
], - "agentSpend": [
- {
- "agentId": "string",
- "name": { },
- "active": true,
- "perTransactionUsd": { },
- "limits": [
- {
- "interval": "daily",
- "capUsd": "string",
- "spentUsd": "string",
- "remainingUsd": "string"
}
]
}
], - "generatedAt": "string"
}