Workspaces
Tenancy boundary. One per product, per environment. Holds API keys, accounts, transfers, external wallets, webhook endpoints, audit.
zenvault has a small surface on purpose. Every action in the API is a verb on one of six primitives. There is no platform tier hiding more — what's listed is what zenvault is.
Six nouns. If a concept isn't here, it isn't in the API.
Tenancy boundary. One per product, per environment. Holds API keys, accounts, transfers, external wallets, webhook endpoints, audit.
A vault account that owns asset activations. Tagged by purpose — hot, warm, cold, escrow, gas, generic — so your treasury logic can address them by role.
Per-asset deposit addresses, allocated on demand. Stable inputs to your invoicing or merchant flow. Reuse is your call, not ours.
Internal (vault to vault), external (to an allowlisted wallet or a one-time address), contract call, ERC-20 approve. All four use the same state machine.
Asset-scoped destination allowlist. A transfer can only target an address that's allowlisted for that asset.
Outbound delivery of state changes. HMAC-SHA256 over (timestamp.body). AES-GCM-encrypted secrets at rest. Roughly three-day retry window with jitter.
The control plane mutates rarely. The data plane is what your product talks to with a workspace API key. The ops plane runs in the background, guarded by distributed locks so multi-pod deployments don't double-emit.
Every transfer moves through the same state machine. Transitions are compare-and-swap; terminal states never walk back. Reconciliation polls non-terminal transfers every thirty seconds.