| name | 1claw |
| version | 1.15.0 |
| description | HSM-backed secret management for AI agents — store, retrieve, rotate, and share secrets via the 1Claw vault without exposing them in context. 1Claw is also a JWKS-published OIDC issuer for Workload Identity Federation (Anthropic WIF, GCP STS, AWS STS). |
| homepage | https://1claw.xyz |
| repository | https://github.com/1clawAI/1claw |
| metadata | {"openclaw":{"requires":{"env":["ONECLAW_AGENT_API_KEY"],"bins":[]},"primaryEnv":"ONECLAW_AGENT_API_KEY","install":[{"id":"npm","kind":"node","package":"@1claw/mcp","bins":["1claw-mcp"],"label":"1Claw MCP Server"}],"credentials":["ONECLAW_AGENT_API_KEY"],"optional_credentials":["ONECLAW_AGENT_ID","ONECLAW_VAULT_ID"],"permissions":["vault:read","vault:write","vault:delete","secret:read","secret:write","secret:delete","policy:create","share:create","tx:sign","tx:simulate"]}} |
1Claw — HSM-Backed Secret Management for AI Agents
1Claw is a cloud HSM-backed secrets manager. Agents access API keys, passwords, and credentials at runtime without them ever entering the conversation context. Secrets are encrypted with keys that never leave the HSM.
API base URL: https://api.1claw.xyz
Shroud (TEE proxy): https://shroud.1claw.xyz
MCP endpoint: https://mcp.1claw.xyz/mcp
Dashboard: https://1claw.xyz
Docs: https://docs.1claw.xyz
Pinata / OpenClaw
Only ONECLAW_AGENT_API_KEY is a secret in the host environment (e.g. Pinata → Environment Variables). Do not instruct users to set ONECLAW_VAULT_ID or ONECLAW_AGENT_ID as required — those UUIDs are optional identifiers, not credentials; the OpenClaw plugin auto-resolves agent and default vault from the API key. Mention ONECLAW_VAULT_ID only when pinning a specific vault among several.
When to use this skill
- You need an API key, password, or credential to complete a task
- You want to store a newly generated credential securely
- You need to share a secret with a user or another agent
- You need to rotate a credential after regenerating it
- You want to check what secrets are available before using one
- You need to sign or simulate an EVM transaction without exposing private keys
- You need to sign an EIP-191 personal message or EIP-712 typed data
- You want to provision multi-chain signing keys (Ethereum, Bitcoin, Solana, XRP, Cardano, Tron)
- You want to sign arbitrary XRPL transaction types (TrustSet, OfferCreate, NFTokenMint, AMMCreate, EscrowCreate, etc.) via
xrpl_tx_json
- You want TEE-grade key isolation for transaction signing (use Shroud at
shroud.1claw.xyz)
- Your vault uses MPC secret storage — DEKs split across GCP/AWS/Azure HSMs (Shamir 2-of-3) or XOR 2-of-2 client custody; provide
X-Client-Share header when reading from client-custody vaults
- Your org uses LLM token billing (Stripe AI Gateway): enable in the dashboard; agent JWTs include
llm_token_billing / stripe_customer_id for Shroud routing
- You need to request access to a Safe multisig treasury (agent access requests)
- You want to manage or deploy agent EVM addresses and Safe smart accounts (ERC-4337, one per chain;
POST /v1/agents/{id}/smart-accounts to add a Safe)
- You want to propose, sign, or execute multisig treasury proposals (Safe transactions requiring threshold signatures)
- You want to set up agent delegation for treasury signing (owner mode or delegated mode with per-delegation guardrails)
- You want to generate native multi-chain treasury wallets (Ethereum, Bitcoin, Solana, XRP, Cardano, Tron) — human-only, Pro+ tier
- You are building a platform integration on 1Claw (register a
plt_ platform app, create bootstrap templates, provision users via OIDC or email)
- You want to approve or reject pending agent actions from the mobile app (approval queue with risk tiers)
- You are working with the 1Claw mobile companion app (Expo, React Native, passkey/biometric auth)
- You want to sign in with a passkey (WebAuthn, passwordless) or manage passkey credentials
- You want to request a policy change as an agent (approval workflow, human-in-the-loop)
- You want to register webhooks for wallet, proposal, transaction, policy, or signing key events (live async delivery with retries)
- You want to check the balance of a treasury wallet or an agent's signing key address
- You want to send a gasless treasury wallet transfer (ERC-4337 UserOperation with Pimlico paymaster sponsorship)
- You need a short-lived Bankr wallet API key for LLM Gateway or agent API access (dynamic key vending via
lease_bankr_key — preferred over static put_secret for Bankr)
- You want to implement passwordless login for an embedded wallet (Email OTP via
POST /v1/auth/email-otp/send + verify)
- You want to add "Sign in with 1Claw" OAuth2 flow to a third-party app (OAuth2 authorization server:
/v1/oauth/authorize, /v1/oauth/token, /v1/oauth/userinfo)
- You want to set spend policies on embedded wallets (per-app or per-user limits, allowlists, daily caps via Platform API spend policy endpoints)
- You want to monitor risk events for your org (geo-velocity, ASN drift, honeytoken triggers via
GET /v1/risk/events)
- You want to deploy honeytoken canary secrets to detect unauthorized access (
POST /v1/risk/honeytokens)
- You want to check the risk verdict for a principal (
GET /v1/risk/verdicts/{type}/{id})
- You want to enable DPoP token binding for proof-of-possession security (
dpop: true in SDK config, ONECLAW_DPOP=true in MCP/CLI)
Setup
Option 0: Self-enrollment (new agents)
If you don't have credentials yet, self-enroll. The API creates a pending enrollment; the human approves in the dashboard (or via the emailed link). After approval, the API key is emailed.
With the human's email — Allow/Deny links are emailed, and the JSON response usually includes approval_url as a fallback if mail is delayed or lost:
curl -s -X POST https://api.1claw.xyz/v1/agents/enroll \
-H "Content-Type: application/json" \
-d '{"name":"my-agent","human_email":"human@example.com"}'
import { AgentsResource } from "@1claw/sdk";
await AgentsResource.enroll("https://api.1claw.xyz", {
name: "my-agent",
human_email: "human@example.com",
});
npx @1claw/cli agent enroll my-agent --email human@example.com
Name only (omit human_email) — response includes approval_url; the human opens it while signed in to approve into their org (no email required to start):
curl -s -X POST https://api.1claw.xyz/v1/agents/enroll \
-H "Content-Type: application/json" \
-d '{"name":"my-agent"}'
npx @1claw/cli agent enroll my-agent
The human receives the Agent ID + API key by email after approval. They then configure policies for your access.
Option 1: MCP server (recommended for AI agents)
Add to your MCP client configuration. Only the API key is required — agent ID and vault are auto-discovered.
{
"mcpServers": {
"1claw": {
"command": "npx",
"args": ["-y", "@1claw/mcp"],
"env": {
"ONECLAW_AGENT_API_KEY": "<agent-api-key>"
}
}
}
}
Optional overrides: ONECLAW_AGENT_ID (explicit agent), ONECLAW_VAULT_ID (explicit vault).
stdio refresh: The MCP server rebuilds its Vault API client from current environment variables on each tool call (no long-lived cached client tied to startup env), so updating ONECLAW_VAULT_ID or keys in the client config takes effect without restarting the process.
Hosted HTTP streaming (advanced only): Use only when the client cannot run the stdio server above. Pass your ocv_ API key as a Bearer token — the server exchanges it for a JWT and auto-discovers the vault. For Cursor, Claude Code, Codex, and Claude Desktop, always use stdio + ONECLAW_AGENT_API_KEY so @1claw/mcp handles token refresh automatically.
URL: https://mcp.1claw.xyz/mcp
Headers:
Authorization: Bearer ocv_your_agent_api_key
Option 2: TypeScript SDK
npm install @1claw/sdk
import { createClient } from "@1claw/sdk";
const client = createClient({
baseUrl: "https://api.1claw.xyz",
apiKey: process.env.ONECLAW_AGENT_API_KEY,
});
Option 3: Direct REST API
Authenticate, then pass the Bearer token on every request.
RESP=$(curl -s -X POST https://api.1claw.xyz/v1/auth/agent-token \
-H "Content-Type: application/json" \
-d '{"api_key":"<key>"}')
TOKEN=$(echo "$RESP" | jq -r .access_token)
AGENT_ID=$(echo "$RESP" | jq -r .agent_id)
curl -H "Authorization: Bearer $TOKEN" https://api.1claw.xyz/v1/vaults
Alternative: 1ck_ API keys (personal or agent) can be used directly as Bearer tokens — no JWT exchange needed.
Authentication
Agent auth flow
- Human registers an agent in the dashboard or via
POST /v1/agents with an auth_method (api_key default, mtls, or oidc_client_credentials). For api_key agents → receives agent_id + api_key (prefix ocv_). For mTLS/OIDC agents → receives agent_id only (no API key).
- All agents auto-receive an Ed25519 SSH keypair (public key on agent record, private key in
__agent-keys vault).
- API key agents exchange credentials:
POST /v1/auth/agent-token with { "api_key": "<key>" } (or { "agent_id": "<uuid>", "api_key": "<key>" }) → returns { "access_token": "<jwt>", "expires_in": 3600, "agent_id": "<uuid>", "vault_ids": ["..."] }. Agent ID is optional — the server resolves it from the key prefix.
- Agent uses
Authorization: Bearer <jwt> on all subsequent requests.
- JWT scopes derive from the agent's access policies (path patterns). If no policies exist, scopes are empty (zero access). The agent's
vault_ids are also included in the JWT — requests to unlisted vaults are rejected.
- Token TTL defaults to ~1 hour but can be set per-agent via
token_ttl_seconds. The MCP server auto-refreshes 60s before expiry.
API key auth
Tokens starting with 1ck_ (human personal API keys), ocv_ (agent API keys), or plt_ (platform API keys) can be used as Bearer tokens directly on any authenticated endpoint.
All three key types support optional expiration via api_key_expires_at. Expired keys are rejected at authentication time with 401. Platform apps can rotate keys via POST /v1/platform/apps/{id}/rotate-key.
Human password reset (email/password accounts)
- Dashboard: Forgot password? on the login page → email link →
/reset-password?token=….
- API:
POST /v1/auth/forgot-password { "email" } and POST /v1/auth/reset-password { "token", "new_password" } (public; forgot returns a generic message).
- CLI:
1claw forgot-password, 1claw reset-password (use --api-url for self-hosted).
- Session revocation on password change/reset: Both
change-password and reset-password invalidate all existing JWTs for the user (revoked_before timestamp). Any previously issued token returns 401.
- Account lockout: 10 consecutive failed login attempts lock the account for 15 minutes. The lockout is per-user and resets on successful login.
Shroud & Intents hosts
- Shroud (
shroud.1claw.xyz): TEE LLM proxy + transaction signing; full Intents API surface. Supported providers: OpenAI, Anthropic, Google (Gemini), Mistral, Cohere, OpenRouter, Darkbloom (E2E encrypted Apple Silicon TEE), Venice AI (zero-retention + TEE/E2EE), Bankr LLM Gateway (X-Shroud-Provider: bankr), Stripe AI Gateway.
- Intents (
intents.1claw.xyz): Additional ingress for signing/health checks; production smoke tests hit /healthz.
Bankr Dynamic Key Vending
Partner-key secret engine for short-lived Bankr wallet API keys. Store the long-lived partner key (bk_ptr_) server-side via BANKR_PARTNER_KEY; Vault issues scoped, TTL-bound bk_usr_ keys per agent through the Bankr Partner API.
Prefer vending over static put_secret for Bankr: leased keys auto-revoke on agent delete/deactivation/TTL; partner key never enters the agent vault; Shroud can resolve leases without get_secret.
| Property | Value |
|---|
| Access | Deny-by-default — explicit policy on agents/{id}/bankr/* in __agent-keys |
| Agent default TTL | 15 min (when ttl_seconds omitted) |
| Recommended TTL (agents) | 5–15 min; revoke after task |
| Max TTL | 24 hours |
| Max concurrent leases | 5 per agent |
| Default permissions | LLM Gateway enabled, read-only, agent API disabled |
| Secret output | Agent/MCP responses omit api_key; Shroud resolves leased keys |
MCP: lease_bankr_key — privileged; returns lease metadata only (no bk_usr_ in tool output).
CLI: 1claw agent bankr-key lease|list|revoke <agent-id>
SDK: client.agents.leaseBankrKey(), .listBankrKeys(), .revokeBankrKey()
Shroud fallback order (X-Shroud-Provider: bankr): (1) active lease, (2) providers/bankr/api-key, (3) X-Shroud-Api-Key header.
Docs: https://docs.1claw.xyz/docs/guides/bankr-key-vending
MCP Tools Reference
list_secrets
List all secrets in the vault. Returns paths, types, and versions — never values.
| Parameter | Type | Required | Description |
|---|
prefix | string | no | Path prefix to filter (e.g. api-keys/) |
get_secret
Fetch the decrypted value of a secret. Use immediately before the API call that needs it. Never store the value or include it in summaries.
| Parameter | Type | Required | Description |
|---|
path | string | yes | Secret path (e.g. api-keys/stripe) |
put_secret
Store a new secret or update an existing one. Each call creates a new version.
| Parameter | Type | Required | Default | Description |
|---|
path | string | yes | | Secret path |
value | string | yes | | The secret value |
type | string | no | api_key | One of: api_key, password, private_key, certificate, file, note, ssh_key, env_bundle |
metadata | object | no | | Arbitrary JSON metadata |
expires_at | string | no | | ISO 8601 expiry datetime |
max_access_count | number | no | | Max reads before auto-expiry (0 = unlimited) |
delete_secret
Soft-delete a secret. Reversible by an admin.
| Parameter | Type | Required | Description |
|---|
path | string | yes | Secret path to delete |
describe_secret
Get metadata (type, version, expiry) without fetching the value. Use to check existence.
| Parameter | Type | Required | Description |
|---|
path | string | yes | Secret path |
rotate_and_store
Store a new value for an existing secret, creating a new version. Use after regenerating a key.
| Parameter | Type | Required | Description |
|---|
path | string | yes | Secret path |
value | string | yes | New secret value |
get_env_bundle
Fetch an env_bundle secret and parse its KEY=VALUE lines as JSON.
| Parameter | Type | Required | Description |
|---|
path | string | yes | Path to an env_bundle secret |
create_vault
Create a new vault for organizing secrets.
| Parameter | Type | Required | Description |
|---|
name | string | yes | Vault name (1–255 chars) |
description | string | no | Short description |
list_vaults
List all vaults accessible to you. No parameters.
grant_access
Grant a user or agent access to a vault path pattern.
| Parameter | Type | Required | Default | Description |
|---|
vault_id | string (UUID) | yes | | Vault ID |
principal_type | user | agent | yes | | Who to grant access to |
principal_id | string (UUID) | yes | | The user or agent UUID |
permissions | string[] | no | ["read"] | ["read"], ["write"], or ["read","write"] |
secret_path_pattern | string | no | ** | Glob pattern for secret paths |
share_secret
Share a secret via link, with your creator, or with a specific user/agent.
| Parameter | Type | Required | Description |
|---|
secret_id | string (UUID) | yes | The secret's UUID |
recipient_type | user | agent | anyone_with_link | creator | yes | creator shares with the human who registered this agent — no ID needed |
recipient_id | string (UUID) | conditional | Required for user and agent types |
expires_at | string | yes | ISO 8601 expiry |
max_access_count | number | no (default 5) | Max reads (0 = unlimited) |
Targeted shares (creator/user/agent) require the recipient to explicitly accept before access.
simulate_transaction
Simulate an EVM transaction via Tenderly without signing. Returns balance changes, gas estimates, success/revert status.
| Parameter | Type | Required | Default | Description |
|---|
to | string | yes | | Destination address (0x-prefixed) |
value | string | yes | | Value in ETH (e.g. "0.01") |
chain | string | yes | | Chain name or chain ID (see Supported Chains) |
data | string | no | | Hex-encoded calldata |
signing_key_path | string | no | auto-resolved | Vault path to signing key (auto-resolves per-chain key) |
gas_limit | number | no | 21000 | Gas limit |
submit_transaction
Submit a transaction for signing and optional broadcast. Requires intents_api_enabled. Works for EVM and non-EVM chains (Bitcoin, Solana, XRP, Cardano, Tron) — the server dispatches by chain family and auto-fetches the chain data it needs.
| Parameter | Type | Required | Default | Description |
|---|
to | string | yes | | Destination address (chain-native format) |
value | string | yes | | Value in the chain's major unit as a decimal string (ETH / BTC / SOL / XRP / ADA / TRX) |
chain | string | yes | | Chain name or chain ID |
data | string | no | | Hex-encoded calldata (EVM) |
signing_key_path | string | no | auto-resolved | Vault path to signing key (auto-resolves per-chain key) |
nonce | number | no | auto-resolved | Transaction nonce (EVM) |
gas_price | string | no | | Gas price in wei (EVM legacy mode) |
gas_limit | number | no | 21000 | Gas limit (EVM) |
max_fee_per_gas | string | no | | EIP-1559 max fee in wei (triggers Type 2) |
max_priority_fee_per_gas | string | no | | EIP-1559 priority fee in wei |
simulate_first | boolean | no | true | Run Tenderly simulation before signing (EVM-only; no-op on non-EVM) |
gasless | boolean | no | false | Sponsor gas via Pimlico paymaster (ERC-4337) |
destination_tag | number | no | | XRP destination tag |
memo | string | no | | XRP / Solana memo |
fee_rate_sat_per_vbyte | number | no | fetched | Bitcoin fee rate override |
fee_limit_sun | number | no | | Tron TRC-20 energy fee limit |
token_mint | string | no | | Solana (SPL) / Tron (TRC-20) token mint/contract; omit for native transfer |
token_decimals | number | no | 6 | Solana / Tron token decimals |
ttl | number | no | | Cardano time-to-live (absolute slot) |
xrpl_tx_json | object | no | | XRP raw XRPL transaction JSON for full tx type coverage (TrustSet, OfferCreate, NFTokenMint, AMMCreate, EscrowCreate, etc.). Account/Sequence/Fee/SigningPubKey are auto-filled. |
Non-EVM responses use raw_tx for the signed payload and a chain-native tx_hash (reversed-hex txid for Bitcoin, base58 signature for Solana, uppercase hex for XRP, blake2b-256 hex for Cardano, SHA-256 txID hex for Tron).
sign_transaction
Sign a transaction without broadcasting (EVM or non-EVM). Returns signed_tx/raw_tx + tx_hash + from address. Same guardrails and chain-specific fields as submit_transaction.
| Parameter | Type | Required | Default | Description |
|---|
to | string | yes | | Destination address |
value | string | yes | | Value in ETH |
chain | string | yes | | Chain name or chain ID |
data | string | no | | Hex-encoded calldata |
signing_key_path | string | no | auto-resolved | Vault path to signing key (auto-resolves per-chain key) |
nonce | number | no | auto-resolved | Transaction nonce |
gas_price | string | no | | Gas price in wei (legacy mode) |
gas_limit | number | no | 21000 | Gas limit |
max_fee_per_gas | string | no | | EIP-1559 max fee in wei (triggers Type 2) |
max_priority_fee_per_gas | string | no | | EIP-1559 priority fee in wei |
xrpl_tx_json | object | no | | XRP raw XRPL transaction JSON (same as submit_transaction) |
list_transactions
List an agent's past transactions. Returns transaction history with status, chain, value, and timestamps.
No parameters required (uses the authenticated agent's context).
get_transaction
Get details of a specific transaction.
| Parameter | Type | Required | Description |
|---|
tx_id | string | yes | Transaction ID |
simulate_bundle
Simulate multiple EVM transactions as a sequence via Tenderly. Returns per-transaction results.
| Parameter | Type | Required | Description |
|---|
transactions | array | yes | Array of transaction objects (same fields as simulate_transaction) |
inspect_content
Inspect text content through the Shroud security pipeline. Returns threat detections and policy violations without sending to an LLM.
| Parameter | Type | Required | Description |
|---|
content | string | yes | Text content to inspect |
list_signing_keys
List all multi-chain signing keys for an agent. Returns key IDs, chains, curves, public keys, and addresses.
| Parameter | Type | Required | Description |
|---|
agent_id | string | no | Agent ID (uses authenticated agent if omitted) |
provision_signing_key
Generate a signing key for an agent on a given blockchain. Returns the public key, on-chain address (when applicable), and key metadata. The private key is stored securely in the vault.
| Parameter | Type | Required | Description |
|---|
agent_id | string | no | Agent ID (uses authenticated agent if omitted) |
chain | string | yes | One of: ethereum, bitcoin, solana, xrp, cardano, tron |
sign_message
Sign a message using EIP-191 personal_sign. Agent must have message_signing_enabled.
| Parameter | Type | Required | Default | Description |
|---|
agent_id | string | no | | Agent ID (uses authenticated agent if omitted) |
message | string | yes | | Hex-encoded message (0x-prefixed or raw) |
chain | string | no | ethereum | Chain name |
signing_key_path | string | no | auto-resolved | Vault path to signing key (auto-resolves per-chain key) |
lease_bankr_key
Privileged — deny-by-default. Requires explicit policy on agents/{id}/bankr/* plus BANKR_PARTNER_KEY on Vault. Does not return the bk_usr_ key in tool output; use Shroud for LLM traffic.
| Parameter | Type | Required | Default | Description |
|---|
agent_id | string | no | | Agent ID (uses authenticated agent if omitted) |
wallet_id | string | no | org default | Bankr wallet ID (wlt_...) |
ttl_seconds | number | no | 900 | Lease TTL — recommend 300–900; max 86400 |
llm_gateway_enabled | boolean | no | true | Enable LLM gateway access |
agent_api_enabled | boolean | no | false | Enable agent API access |
read_only | boolean | no | true | Read-only key |
sign_typed_data
Sign EIP-712 typed structured data. Agent must pass EIP-712 guardrail enforcement (domain allowlist).
| Parameter | Type | Required | Default | Description |
|---|
agent_id | string | no | | Agent ID (uses authenticated agent if omitted) |
typed_data | object | yes | | EIP-712 object (types, primaryType, domain, message) |
chain | string | no | ethereum | Chain name |
signing_key_path | string | no | auto-resolved | Vault path to signing key (auto-resolves per-chain key) |
sign_digest
Sign a client-computed 32-byte digest directly (raw/blind signing) → 65-byte r‖s‖v signature. For ERC-1271/ERC-7739 nested EIP-712 flows (e.g. Polymarket CLOB orders) where the canonical hash is computed client-side. Requires the agent's raw_signing_enabled flag (human-set; off by default); bypasses guardrails; audit-logged.
| Parameter | Type | Required | Default | Description |
|---|
agent_id | string | no | | Agent ID (uses authenticated agent if omitted) |
hash | string | yes | | 0x-prefixed 32-byte (64 hex char) digest |
chain | string | no | ethereum | Chain name |
signing_key_path | string | no | auto-resolved | Vault path to signing key (auto-resolves per-chain key) |
rotate_generate
Generate a new random value and rotate a secret to it. Combines generation and rotation in one step.
| Parameter | Type | Required | Default | Description |
|---|
path | string | yes | | Secret path |
type | string | no | api_key | Secret type |
length | number | no | 32 | Length of the generated value |
list_versions
List all versions of a secret. Returns version numbers, timestamps, and status.
| Parameter | Type | Required | Description |
|---|
path | string | yes | Secret path |
treasury_propose
Create a multisig proposal for a treasury Safe. The agent must have an active delegation for the treasury.
| Parameter | Type | Required | Default | Description |
|---|
treasury_id | string | yes | | Treasury UUID |
to | string | yes | | Destination address (0x-prefixed) |
value | string | yes | | Value in ETH (e.g. "0.01") |
chain | string | yes | | Chain name or chain ID |
data | string | no | | Hex-encoded calldata |
treasury_sign_proposal
Sign (approve or reject) a pending treasury proposal with an EIP-712 signature.
| Parameter | Type | Required | Default | Description |
|---|
treasury_id | string | yes | | Treasury UUID |
proposal_id | string | yes | | Proposal UUID |
decision | string | no | approve | approve or reject |
treasury_list_proposals
List proposals for a treasury, optionally filtered by status.
| Parameter | Type | Required | Description |
|---|
treasury_id | string | yes | Treasury UUID |
status | string | no | Filter: pending, approved, executed, etc. |
platform_list_apps
List all platform apps registered in the current organization. No parameters.
platform_create_app
Register a new platform app. Returns the app record and a one-time plt_ API key.
| Parameter | Type | Required | Description |
|---|
name | string | yes | App display name |
slug | string | yes | Unique slug (3–64 chars, lowercase, hyphens) |
description | string | no | Short description |
billing_model | string | no | platform_pays (default), user_pays, hybrid |
auth_mode | string | no | silent, user_signin, configurable |
platform_bootstrap_user
Bootstrap a connected platform user — provisions vaults, agents, policies, and signing keys from a template. Returns a claim URL the user opens to activate their account. The response also includes summary.agent_api_key (one-time ocv_ key) and summary.signing_keys[] (each with chain, address, public_key, curve).
| Parameter | Type | Required | Description |
|---|
connection_id | string | yes | Connection ID from upsert_user or list_users |
template_id | string | no | Template ID to provision from (uses app default if omitted) |
return_to | string | no | URL to redirect the user to after claiming |
REST API Quick Reference
Base URL: https://api.1claw.xyz. All authenticated endpoints require Authorization: Bearer <token>.
Auth (public — no token required)
| Method | Path | Description |
|---|
POST | /v1/auth/token | Login (email + password) → { access_token } |
POST | /v1/auth/agent-token | Agent login (agent_id + api_key) → { access_token } |
POST | /v1/auth/federated-token | RFC 8693 token exchange → RS256 JWT for external relying parties |
POST | /v1/auth/google | Google OAuth (ID token verified via JWKS) |
POST | /v1/auth/signup | Create account → sends verification email |
POST | /v1/auth/verify-email | Verify email token → creates user |
POST | /v1/auth/mfa/verify | Verify MFA code during login |
POST | /v1/auth/passkeys/assert/begin | Start passkey login (accepts { email }) |
POST | /v1/auth/passkeys/assert/complete | Complete passkey login → JWT |
POST | /v1/auth/email-otp/send | Send 6-digit OTP code to email (5-min TTL) |
POST | /v1/auth/email-otp/verify | Verify OTP → JWT + user_id + wallet_address |
POST | /v1/oauth/token | Exchange auth code for access_token + id_token |
GET | /.well-known/openid-configuration | OIDC discovery (issuer, jwks_uri, supported algs) |
GET | /.well-known/jwks.json | Public JWKS (EdDSA + RS256 key versions, keyed by kid) |
Auth (authenticated)
| Method | Path | Description |
|---|
GET | /v1/auth/me | Get current user profile |
PATCH | /v1/auth/me | Update profile (display_name, marketing_emails) |
DELETE | /v1/auth/me | Delete account (body: { "confirmation": "DELETE MY ACCOUNT" }) |
DELETE | /v1/auth/token | Revoke current token |
POST | /v1/auth/change-password | Change password |
POST | /v1/auth/set-password | Set first password (platform OIDC/Google users only) |
POST | /v1/auth/change-email | Initiate email change (sends code to new address) |
POST | /v1/auth/verify-email-change | Complete email change with verification code |
POST | /v1/auth/passkeys/register/begin | Start passkey registration ceremony |
POST | /v1/auth/passkeys/register/complete | Complete passkey registration |
GET | /v1/auth/passkeys | List registered passkeys |
DELETE | /v1/auth/passkeys/{id} | Delete a passkey |
POST | /v1/auth/export-data | GDPR data export (returns JSON archive of user's personal data) |
POST | /v1/auth/email-otp/send | Send 6-digit OTP code to email (public, 5-min TTL) |
POST | /v1/auth/email-otp/verify | Verify OTP code → JWT + user_id + wallet_address (public) |
GET | /v1/oauth/authorize | Get OAuth consent info (app_name, scopes, already_consented) |
POST | /v1/oauth/authorize | Approve/deny OAuth authorization (issues authorization code) |
POST | /v1/oauth/token | Exchange authorization code for access_token + id_token (public) |
GET | /v1/oauth/userinfo | Get user info (sub, email, name, wallet_address) |
Vaults
| Method | Path | Description |
|---|
POST | /v1/vaults | Create vault ({ name, description? }) → 201 |
GET | /v1/vaults | List vaults → { vaults: [...] } |
GET | /v1/vaults/{id} | Get vault details |
DELETE | /v1/vaults/{id} | Delete vault → 204 |
POST | /v1/vaults/{id}/cmek | Enable CMEK ({ fingerprint }) |
DELETE | /v1/vaults/{id}/cmek | Disable CMEK |
POST | /v1/vaults/{id}/cmek-rotate | Start CMEK key rotation (headers: X-CMEK-Old-Key, X-CMEK-New-Key) |
GET | /v1/vaults/{id}/cmek-rotate/{job_id} | Get rotation job status |
Secrets
| Method | Path | Description |
|---|
PUT | /v1/vaults/{id}/secrets/{path} | Store/update secret ({ type, value, metadata?, expires_at?, max_access_count? }) → 201 |
GET | /v1/vaults/{id}/secrets/{path} | Read secret → { path, type, value, version, metadata } |
DELETE | /v1/vaults/{id}/secrets/{path} | Delete secret → 204 |
GET | /v1/vaults/{id}/secrets?prefix=... | List secrets (metadata only, no values) |
GET | /v1/vaults/{id}/secret-versions/{path} | List all versions of a secret |
GET | /v1/vaults/{id}/secret-version/{path}/{version} | Get a specific secret version |
POST | /v1/vaults/{id}/secret-version-disable/{path}/{version} | Disable a secret version |
POST | /v1/vaults/{id}/secret-rotate/{path} | Server-side secret rotation |
Agents
| Method | Path | Description |
|---|
POST | /v1/agents | Create agent → { agent: {...}, api_key: "ocv_..." } |
GET | /v1/agents | List agents → { agents: [...] } |
GET | /v1/agents/{id} | Get agent |
GET | /v1/agents/me | Get current agent (self) |
PATCH | /v1/agents/{id} | Update agent (is_active, scopes, intents_api_enabled, guardrails) — user-only; agents cannot PATCH their own record |
DELETE | /v1/agents/{id} | Delete agent → 204 |
POST | /v1/agents/{id}/rotate-key | Rotate agent API key → { api_key: "ocv_..." } |
POST | /v1/agents/{id}/rotate-identity-keys | Rotate agent SSH + ECDH keypairs (user-only; keys in __agent-keys vault) |
POST | /v1/agents/{id}/bankr-keys/lease | Lease Bankr key (privileged; policy on agents/{id}/bankr/*; agent response omits api_key) |
GET | /v1/agents/{id}/bankr-keys | List active Bankr key leases for agent |
DELETE | /v1/agents/{id}/bankr-keys/{lease_id} | Revoke lease (calls Bankr API) |
Policies (Access Control)
| Method | Path | Description |
|---|
POST | /v1/vaults/{id}/policies | Create policy ({ principal_type, principal_id, secret_path_pattern, permissions, conditions?, expires_at? }) |
GET | /v1/vaults/{id}/policies | List policies for vault |
PUT | /v1/vaults/{id}/policies/{pid} | Update policy (permissions, conditions, expires_at only) |
DELETE | /v1/vaults/{id}/policies/{pid} | Delete policy → 204 |
Sharing
| Method | Path | Description |
|---|
POST | /v1/secrets/{id}/share | Create share link |
GET | /v1/shares/outbound | List shares you created |
GET | /v1/shares/inbound | List shares sent to you |
POST | /v1/shares/{id}/accept | Accept an inbound share |
POST | /v1/shares/{id}/decline | Decline an inbound share |
DELETE | /v1/share/{id} | Revoke a share |
GET | /v1/share/{id} | Access a share (public, may require passphrase) |
Intents API (requires intents_api_enabled)
| Method | Path | Description |
|---|
POST | /v1/agents/{id}/transactions | Submit transaction for signing. Set gasless: true for Pimlico paymaster gas sponsorship. Optional Idempotency-Key header (24h TTL) |
POST | /v1/agents/{id}/transactions/sign | Sign transaction without broadcasting (returns signed_tx, tx_hash, from) |
POST | /v1/agents/{id}/sign | Unified signing intent: personal_sign (EIP-191), typed_data (EIP-712), eip712_digest (raw digest; requires raw_signing_enabled), or transaction (types 0–4) |
GET | /v1/agents/{id}/transactions | List agent's transactions. signed_tx redacted unless ?include_signed_tx=true |
GET | /v1/agents/{id}/transactions/{txid} | Get transaction details. signed_tx redacted unless ?include_signed_tx=true |
POST | /v1/agents/{id}/transactions/simulate | Simulate single transaction |
POST | /v1/agents/{id}/transactions/simulate-bundle | Simulate transaction bundle |
POST | /v1/agents/{id}/signing-keys | Provision a multi-chain signing key ({ chain }) — human-only |
GET | /v1/agents/{id}/signing-keys | List all signing keys for an agent |
POST | /v1/agents/{id}/signing-keys/{chain}/rotate | Rotate signing key for a chain — human-only |
DELETE | /v1/agents/{id}/signing-keys/{chain} | Deactivate signing key for a chain — human-only |
POST | /v1/agents/{id}/signing-keys/{chain}/export | Export signing key with private key (requires X-Auth-Confirm password) — human-only |
GET | /v1/agents/{id}/signing-keys/{chain}/balance | Query native + ERC-20 balances for the signing key address |
Shroud Activity
| Method | Path | Description |
|---|
GET | /v1/shroud/activity | List recent Shroud inspection events |
POST | /v1/shroud/activity | Query filtered Shroud activity |
GET | /v1/shroud/threat-summary | Shroud threat detection summary |
Approvals
| Method | Path | Description |
|---|
GET | /v1/approvals | List approval requests (user-only, filterable by status) |
GET | /v1/approvals/{id} | Get approval details |
POST | /v1/approvals/{id}/decide | Approve or reject (auto-executes policy changes on approval) |
POST | /v1/approvals/request | Agent-initiated approval request (agent-only) |
Audit
| Method | Path | Description |
|---|
GET | /v1/audit/events?limit=N&action=...&from=...&to=... | Query audit events |
Billing
| Method | Path | Description |
|---|
GET | /v1/billing/subscription | Subscription status, usage, credit balance |
GET | /v1/billing/llm-token-billing | LLM add-on status; optional credit_balance, billing_cycle_usage.metered_lines (Stripe preview) |
GET | /v1/billing/credits/balance | Credit balance + expiring credits |
GET | /v1/billing/credits/transactions | Credit transaction ledger |
PATCH | /v1/billing/overage-method | Set overage method (credits or x402) |
GET | /v1/billing/usage | Usage summary (current month) |
GET | /v1/billing/history | Usage event history |
Chains
| Method | Path | Description |
|---|
GET | /v1/chains | List supported chains |
GET | /v1/chains/{name_or_id} | Get chain details |
Treasury (Safe multisig, agent access)
| Method | Path | Description |
|---|
POST | /v1/treasury | Create treasury (Safe multisig) |
GET | /v1/treasury | List treasuries |
GET | /v1/treasury/{treasury_id} | Get treasury details |
PATCH | /v1/treasury/{treasury_id} | Update name and/or threshold |
DELETE | /v1/treasury/{treasury_id} | Delete treasury |
POST | /v1/treasury/{treasury_id}/signers | Add signer to treasury |
DELETE | /v1/treasury/{treasury_id}/signers/{signer_id} | Remove signer from treasury |
POST | /v1/treasury/{treasury_id}/access-requests | Request access (agent-only; requires EVM address) |
GET | /v1/treasury/{treasury_id}/access-requests | List access requests → { requests: [...] } |
POST | /v1/treasury/{treasury_id}/access-requests/{request_id}/approve | Approve access request (optional delegation setup) |
POST | /v1/treasury/{treasury_id}/access-requests/{request_id}/deny | Deny access request |
Treasury Proposals (multisig propose/sign/execute)
| Method | Path | Description |
|---|
POST | /v1/treasury/{treasury_id}/proposals | Create proposal (agent or user; agent must have delegation) |
GET | /v1/treasury/{treasury_id}/proposals | List proposals (filterable by ?status=) |
GET | /v1/treasury/{treasury_id}/proposals/{proposal_id} | Get proposal details + collected signatures |
POST | /v1/treasury/{treasury_id}/proposals/{proposal_id}/sign | Sign proposal (approve/reject with EIP-712 sig; auto-executes at threshold) |
POST | /v1/treasury/{treasury_id}/proposals/{proposal_id}/execute | Force-execute if threshold met (user-only) |
DELETE | /v1/treasury/{treasury_id}/proposals/{proposal_id} | Cancel pending proposal (proposer only) |
Treasury Delegations
Agent signing mode is configured per-agent via agents.treasury_signing_mode (owner | delegated | both). Delegations are created when approving access requests with delegation_mode and optional per-delegation guardrails.
- Owner mode: Agent's EOA added as on-chain Safe signer; agent signs UserOps with own key.
- Delegated mode: Agent signs using the treasury wallet key via Intents API; key never leaves
__treasury-keys vault.
- Auto-approve rules:
treasury_delegations.auto_approve_rules JSONB — when a proposal matches a rule, the agent's signature is auto-inserted; if threshold is met, auto-execute fires immediately.
Treasury Wallets (native multi-chain, human-only, Pro+)
| Method | Path | Description |
|---|
POST | /v1/treasury/wallets/generate | Generate wallets for specified or all chains |
GET | /v1/treasury/wallets | List all active wallets for the calling user |
GET | /v1/treasury/wallets/{chain} | Get wallet for a specific chain |
POST | /v1/treasury/wallets/{chain}/export | Export wallet with private key (requires X-Auth-Confirm password header; audit-logged) |
POST | /v1/treasury/wallets/{chain}/rotate | Rotate wallet keypair (deactivates old, creates new) |
DELETE | /v1/treasury/wallets/{chain} | Deactivate wallet |
GET | /v1/treasury/wallets/{chain}/balance | Query native + ERC-20 token balances via chain RPC |
POST | /v1/treasury/wallets/{chain}/send | Signed transfer from treasury wallet (requires X-Auth-Confirm re-auth). Set gasless: true for ERC-4337 UserOp with Pimlico paymaster |
POST | /v1/treasury/wallets/{chain}/swap | DEX aggregator token swap via 0x API (requires X-Auth-Confirm re-auth) |
GET | /v1/treasury/wallets/spend-policy | View effective spend policy (user-only) |
Platform API (v0.20)
| Method | Path | Description |
|---|
POST | /v1/platform/apps | Register platform app (user-only, returns plt_ key) |
GET | /v1/platform/apps | List platform apps for org → { apps: [...] } |
GET | /v1/platform/apps/{id} | Get platform app |
PATCH | /v1/platform/apps/{id} | Update platform app |
DELETE | /v1/platform/apps/{id} | Delete platform app |
POST | /v1/platform/apps/{id}/templates | Create bootstrap template (JSON spec) |
GET | /v1/platform/apps/{id}/templates | List templates → { templates: [...] } |
PATCH | /v1/platform/apps/{id}/templates/{tid} | Update template |
DELETE | /v1/platform/apps/{id}/templates/{tid} | Delete template |
POST | /v1/platform/users/upsert | Provision/find user (platform-only, OIDC or email) |
POST | /v1/platform/connections/{id}/bootstrap | Bootstrap resources from template (incl. signing keys) |
GET | /v1/platform/claim/{token} | Preview claim token (public, no auth) |
POST | /v1/platform/claim/{token} | Redeem claim token (public; 409 reused, 410 expired) |
GET | /v1/platform/apps/{id}/users | List connected users → { users: [...] } |
POST | /v1/platform/apps/{id}/rotate-key | Rotate platform API key (optional api_key_expires_at) |
POST | /v1/platform/connections/{id}/reissue-claim | Reissue expired claim URL without re-provisioning |
GET | /v1/platform/connected-apps | List apps connected to calling user (user-only) |
DELETE | /v1/platform/connected-apps/{connection_id} | Disconnect from a platform app |
POST | /v1/platform/connections/{id}/grant | Grant platform app access to vaults/agents (user-only) |
GET | /v1/platform/connections/{id}/grants | List active resource grants for a connection |
DELETE | /v1/platform/connections/{id}/grants/{grant_id} | Revoke a specific resource grant |
POST | /v1/platform/apps/{id}/spend-policies | Create app-level wallet spend policy (platform-only) |
GET | /v1/platform/apps/{id}/spend-policies | List active spend policies for the app |
PUT | /v1/platform/connections/{id}/spend-policy | Set per-user spend policy override |
DELETE | /v1/platform/apps/{id}/spend-policies/{pid} | Deactivate a spend policy |
Other
| Method | Path | Description |
|---|
POST | /v1/webhooks | Register a webhook for wallet/proposal/transaction/policy/signing_key events (live delivery with retries) |
GET | /v1/webhooks | List webhook registrations |
GET | /v1/webhooks/{id} | Get webhook details |
PATCH | /v1/webhooks/{id} | Update webhook (URL, events, active status) |
DELETE | /v1/webhooks/{id} | Delete webhook registration |
GET | /v1/health | Health check → { status, service, version } |
GET | /v1/health/hsm | HSM health → { status, hsm_provider, connected } |
POST/GET/DELETE | /v1/auth/api-keys[/{id}] | Manage personal API keys |
GET/POST/DELETE | /v1/security/ip-rules[/{id}] | Manage IP allowlist/blocklist |
GET/PATCH/DELETE | /v1/org/members[/{id}] | Manage org members |
SDK Method Reference
All methods return Promise<OneclawResponse<T>>. Access via client.<resource>.<method>(...).
| Resource | Method | Description |
|---|
vaults | create({ name, description? }) | Create vault |
vaults | get(vaultId) | Get vault |
vaults | list() | List vaults |
vaults | delete(vaultId) | Delete vault |
secrets | set(vaultId, key, value, { type?, metadata?, expires_at?, max_access_count? }) | Store/update secret |
secrets | get(vaultId, key) | Read secret (decrypted) |
secrets | list(vaultId, prefix?) | List secret metadata |
secrets | delete(vaultId, key) | Delete secret |
secrets | rotate(vaultId, key, newValue) | Rotate secret to new version |
agents | create({ name, description?, scopes?, expires_at?, intents_api_enabled?, token_ttl_seconds?, vault_ids? }) | Create agent → returns agent + api_key |
agents | get(agentId) | Get agent |
agents | list() | List agents |
agents | update(agentId, { is_active?, scopes?, intents_api_enabled?, tx_*? }) | Update agent |
agents | delete(agentId) | Delete agent |
agents | rotateKey(agentId) | Rotate agent API key |
agents | submitTransaction(agentId, { to, value, chain, ... }) | Submit transaction (EVM + non-EVM) |
agents | simulateTransaction(agentId, { to, value, chain, ... }) | Simulate transaction |
agents | simulateBundle(agentId, bundle) | Simulate transaction bundle |
agents | getTransaction(agentId, txId) | Get transaction |
agents | listTransactions(agentId) | List agent transactions |
agents | signIntent(agentId, { intent_type, chain, message?, typed_data?, tx_type?, ... }) | Unified signing (EIP-191, EIP-712, EIP-2718 types 0–4) |
signingKeys | create(agentId, { chain }) | Provision a multi-chain signing key |
signingKeys | list(agentId) | List all signing keys for an agent |
signingKeys | rotate(agentId, chain) | Rotate signing key for a chain |
signingKeys | deactivate(agentId, chain) | Deactivate signing key |
signingKeys | export(agentId, chain, { password }) | Export signing key with private key (requires password re-auth) |
access | grantAgent(vaultId, agentId, permissions, { path?, conditions?, expires_at? }) | Grant agent access |
access | grantHuman(vaultId, userId, permissions, { path?, conditions?, expires_at? }) | Grant user access |
access | listGrants(vaultId) | List policies |
access | update(vaultId, policyId, { permissions?, conditions?, expires_at? }) | Update policy |
access | revoke(vaultId, policyId) | Revoke policy |
sharing | create(secretId, { recipient_type, recipient_id?, expires_at, max_access_count? }) | Create share |
sharing | access(shareId) | Access shared secret |
sharing | listOutbound() | Shares you created |
sharing | listInbound() | Shares sent to you |
sharing | accept(shareId) | Accept inbound share |
sharing | decline(shareId) | Decline inbound share |
sharing | revoke(shareId) | Revoke outbound share |
audit | query({ action?, actor_id?, from?, to?, limit?, offset? }) | Query audit events |
billing | usage() | Current month usage |
billing | history(limit?) | Usage event history |
billing | llmTokenBilling(), subscribeLlmTokenBilling(), disableLlmTokenBilling() | LLM token billing add-on (Stripe AI Gateway) |
auth | login({ email, password }) | Human login |
auth | agentToken({ agent_id, api_key }) | Agent JWT exchange |
auth | logout() | Revoke token |
auth | sendEmailOtp({ email, platform_app_id? }) | Send 6-digit OTP code to email |
auth | verifyEmailOtp({ email, code, platform_app_id?, auto_provision_chains? }) | Verify OTP → JWT + wallet_address |
auth | socialLogin({ provider, id_token, ... }) | Social login (Google/Apple/Discord) |
auth | exchangeOAuthCode({ code, redirect_uri, code_verifier? }) | Exchange OAuth authorization code |
apiKeys | create({ name, scopes?, expires_at? }) | Create personal API key |
apiKeys | list() | List API keys |
apiKeys | revoke(keyId) | Revoke key |
chains | list() | List supported chains |
chains | get(identifier) | Get chain by name or ID |
treasury | create({ name, safe_address, chain?, chain_id?, threshold?, signers? }) | Create treasury (Safe multisig) |
treasury | list(), get(treasuryId), update(treasuryId, { name?, threshold? }), delete(treasuryId) | List/get/update/delete treasuries |
treasury | addSigner(treasuryId, { signer_type, signer_id, signer_address }) | Add signer to treasury |
treasury | removeSigner(treasuryId, signerId) | Remove signer |
treasury | requestAccess(treasuryId, { reason }) | Request access (agent-only) |
treasury | listAccessRequests(treasuryId) | List access requests |
treasury | approveAccess(treasuryId, requestId), denyAccess(treasuryId, requestId) | Approve or deny access request |
treasury | propose(treasuryId, { to, value, chain, data? }) | Create multisig proposal |
treasury | listProposals(treasuryId, { status? }) | List proposals |
treasury | getProposal(treasuryId, proposalId) | Get proposal + signatures |
treasury | signProposal(treasuryId, proposalId, { decision? }) | Sign proposal (approve/reject) |
treasury | executeProposal(treasuryId, proposalId) | Force-execute if threshold met |
treasuryWallets | generate({ chains? }) | Generate multi-chain wallets (human-only, Pro+) |
treasuryWallets | list() | List active treasury wallets |
treasuryWallets | get(chain) | Get wallet by chain |
treasuryWallets | export(chain, { password }) | Export wallet with private key (requires password re-auth via X-Auth-Confirm) |
treasuryWallets | rotate(chain) | Rotate wallet keypair |
treasuryWallets | deactivate(chain) | Deactivate wallet |
treasuryWallets | getEffectiveSpendPolicy() | View effective spend policy |
depositDestinations | create({ chain, label?, treasury_wallet_id? }) | Create inbound deposit address |
depositDestinations | list(chain?, status?) | List deposit destinations |
internalAccounts | create({ name }) | Create internal ledger account |
internalAccounts | transfer({ from_account_id, to_account_id, asset, amount }) | Off-chain transfer between accounts |
fiat | createOnrampSession({ chain, amount_usd? }) | Fiat-to-crypto widget URL |
fiat | initiateOfframp({ chain, asset, amount }) | Crypto-to-fiat widget URL |
platform | createApp({ name, slug, billing_model?, auth_mode?, ... }) | Register platform app (returns plt_ key) |
platform | listApps() | List platform apps |
platform | getApp(appId) | Get platform app |
platform | updateApp(appId, { ... }) | Update platform app |
platform | deleteApp(appId) | Delete platform app |
platform | createTemplate(appId, { name, spec }) | Create bootstrap template |
platform | listTemplates(appId) | List templates |
platform | upsertUser({ subject_token?, email? }) | Provision/find user (platform-only) |
platform | bootstrapUser(connectionId, { template_id?, return_to? }) | Bootstrap from template |
platform | claimPreview(token) | Preview claim token (public) |
platform | claimRedeem(token) | Redeem claim token (public) |
platform | listConnectedApps() | List connected apps (user-only) |
platform | createSpendPolicy(appId, { ... }) | Create app-level wallet spend policy |
platform | listSpendPolicies(appId) | List active spend policies |
platform | setUserSpendPolicy(connectionId, { ... }) | Set per-user spend policy override |
platform | deleteSpendPolicy(appId, policyId) | Deactivate a spend policy |
org | listMembers() | List org members |
org | updateMemberRole(userId, role) | Update member role |
org | removeMember(userId) | Remove member |
OpenAPI spec for custom SDKs
The API spec is published as an npm package for generating clients in any language:
npm install @1claw/openapi-spec
Ships openapi.yaml and openapi.json. Use with any OpenAPI 3.1 codegen tool:
npx openapi-typescript node_modules/@1claw/openapi-spec/openapi.yaml -o ./types.ts
openapi-generator generate -i node_modules/@1claw/openapi-spec/openapi.yaml -g python -o ./oneclaw-py
oapi-codegen -package oneclaw node_modules/@1claw/openapi-spec/openapi.yaml > oneclaw.go
SDK also re-exports generated types: import type { ApiSchemas } from "@1claw/sdk".
Supported Chains
Default chain registry (query GET /v1/chains for live list):
| Name | Chain ID | Testnet |
|---|
| ethereum | 1 | no |
| base | 8453 | no |
| optimism | 10 | no |
| arbitrum-one | 42161 | no |
| polygon | 137 | no |
| sepolia | 11155111 | yes |
| base-sepolia | 84532 | yes |
| arc-testnet | 5042002 | yes |
Use chain names (e.g. "base", "sepolia", "arc-testnet") or numeric chain IDs in transaction requests.
Access Control Model
Agents do not get blanket access. A human must create a policy to grant an agent access to specific secret paths.
- Path patterns: Glob syntax —
api-keys/*, db/**, ** (all)
- Permissions:
read, write (delete requires write)
- Conditions: IP allowlist, time windows (JSON)
- Expiry: Optional ISO 8601 date
If no policy matches → 403 Forbidden. Vault creators always have full access (owner bypass).
Vault binding and token scoping
Agents can be restricted beyond policies:
vault_ids: Restrict the agent to specific vaults. If non-empty, any request to a vault not in the list returns 403.
token_ttl_seconds: Custom JWT expiry per agent (e.g., 300 for 5-minute tokens).
- Scopes from policies: JWT scopes are derived from the agent's access policies. If an agent has no policies and no explicit scopes, it has zero access.
Set via dashboard, CLI (--token-ttl, --vault-ids), SDK, or API.
Customer-Managed Encryption Keys (CMEK)
Enterprise opt-in feature (Business tier and above). A human generates a 256-bit AES key in the dashboard — the key never leaves their device. Only its SHA-256 fingerprint is stored on the server.
- Enable:
POST /v1/vaults/{id}/cmek with { fingerprint }
- Disable:
DELETE /v1/vaults/{id}/cmek
- Rotate:
POST /v1/vaults/{id}/cmek-rotate (server-assisted, batched in 100s)
- Secrets stored in a CMEK vault have
cmek_encrypted: true in responses