/address-proofstransfers:readList self-hosted wallet ownership requests
200 List of address proofserror Error object
Base URL https://www.chainvara.com/api/v1. Authenticate with Authorization: Bearer fos_live_… (or fos_test_… for the sandbox); each endpoint shows the scope its key needs. 65 operations, generated from the OpenAPI file.
/address-proofstransfers:read200 List of address proofserror Error object
/address-proofstransfers:writeBody { network, address, label }. Returns the message to sign and the link (url, valid 14 days) to send the owner. EVM (personal_sign or EIP-1271), Solana, Bitcoin, Litecoin and Dogecoin signed messages. Webhook address.ownership_verified.
201 Address proof with urlerror Error object
/address-proofs/{id}/signaturetransfers:writeBody { signature }. Verified against the address before the proof counts.
| id * | path | string (uuid) |
200 Address prooferror Error object
/addressestransfers:read200 List of trusted addresseserror Error object
/addressesaddresses:writeBody { network, address, label, note? }. Validated and sanctions-screened; trusted only after the policy's security cooldown. Webhook address.added.
201 Trusted addresserror Error object
/addresses/{id}/revokeaddresses:write| id * | path | string (uuid) |
200 Revokederror Error object
/auditaudit:readThe organization's audit events in chain order. Poll with after=<last seq received>. Each event carries seq (gapless per organization), prev_hash and hash = sha256 of the previous hash, the seq and every field.
| after | query | integer | Return events with seq greater than this. |
| since | query | string (date-time) | |
| action | query | string | Action name or prefix, e.g. transfer. or api_key.created |
| limit | query | integer |
200 A list of audit_event objects, has_more and next_after.error Error object
/audit/verifyaudit:readRecomputes every hash, link and sequence number. Store head.hash outside Chainvara to detect a later rewrite.
200 audit_verification: valid, events, head, problems.error Error object
/deposit-addresseswallets:writeBody { external_user_id, networks?, label? }: one wallet per network, idempotent (calling again returns the same addresses). Deposits arrive as deposit.received webhooks carrying the same external_user_id.
200 deposit_addresses (all existed)201 deposit_addresses (some created)error Error object
/embedded/backupwallets:writestep store { external_user_id, network, backup } or fetch { external_user_id, network }. The backup is encrypted on the device under a 125-bit recovery code Chainvara never sees.
200 OKerror Error object
/embedded/walletswallets:writeCalls relayed by your backend for the device SDK (/sdk/chainvara-embedded.js). Solana (FROST): start (device_round1) then finish (device_round2, public_key). EVM networks (threshold ECDSA): start → commit (device_message, device_commitment) → prove (device_proof) → finish (public_key); each answer carries the next session_id. Bodies up to 2 MB.
| step * | "start" | "commit" | "prove" | "finish" | |
| external_user_id * | string | |
| network | string | |
| label | string | |
| device_round1 | string | |
| session_id | string | |
| device_round2 | string | |
| device_message | string | |
| device_commitment | string | |
| device_proof | string | |
| public_key | string |
200 Round answer201 Wallet createderror Error object
/embedded/signtransfers:writeSolana: start (device_commitments) returns the signing package and the transfer to show; the device checks the exact transaction, then finish (device_share) broadcasts. EVM: start (sign_id) returns the unsigned transaction, which the device decodes and hashes itself; sign (device_message1, device_message2); finish (device_message) broadcasts.
| step * | "start" | "sign" | "finish" | |
| external_user_id * | string | |
| transfer_id | string | |
| device_commitments | string | |
| sign_id | string | |
| session_id | string | |
| device_share | string | |
| device_message1 | string | |
| device_message2 | string | |
| device_message | string |
200 Submittederror Error object
/eventsevents:read| type | query | string | |
| limit | query | integer |
200 OKerror Error object
/network/requeststransfers:read| direction | query | "incoming" | "outgoing" | |
| status | query | "open" | "paying" | "paid" | "declined" | "canceled" | "expired" |
200 OKerror Error object
/network/requeststransfers:writeThe payer pays it to your published address on that network, from their console or API, under their own policy and approvals.
| to * | string | |
| network * | string | |
| asset * | string | Symbol or asset id |
| amount * | string | |
| reference * | string | |
| note | string | |
| ttl_days | integer |
201 Createderror Error object
/network/requests/{id}/paytransfers:write| id * | path | string (uuid) |
| wallet_id * | string (uuid) |
201 OKerror Error object
/network/requests/{id}/closetransfers:write| id * | path | string (uuid) |
200 OKerror Error object
/network/obligationstransfers:read200 OKerror Error object
/network/obligationstransfers:writeCounts in the net position only once the counterparty confirms it.
| counterparty * | string | |
| direction * | "they_owe" | "we_owe" | |
| network * | string | |
| asset * | string | |
| amount * | string | |
| reference * | string |
201 Createderror Error object
/network/obligations/{id}/{action}transfers:write| id * | path | string (uuid) | |
| action * | path | "confirm" | "dispute" | "cancel" |
200 OKerror Error object
/network/positionstransfers:read200 OKerror Error object
/network/settlementstransfers:read200 OKerror Error object
/network/settlementstransfers:write| counterparty * | string | |
| asset_id * | string | |
| wallet_id * | string (uuid) |
201 Createderror Error object
/networks/{id}/feeswallets:readA typical transfer's fee at each fee_level (low, medium, high), in the native coin's smallest unit.
| id * | path | string |
200 network_feeserror Error object
/networks200 OKerror Error object
/operationstransfers:readToken, staking and swap operations (plain transfers are under /transfers).
| limit | query | integer |
200 OKerror Error object
/operationstransfers:writeCreate, mint, burn or profile a token, swap, stake or unstake. Same policy, approvals, co-signer and vault signing as transfers. Token decimals are read from the chain; a swap's guaranteed minimum comes from a fresh quote.
| Idempotency-Key | header | string | Retries with the same key return the original response and never repeat the side effect. |
| wallet_id * | string (uuid) | |
| type * | "token_create" | "nft_create" | "nft_transfer" | "token_mint" | "token_burn" | "token_metadata" | "token_freeze" | "token_thaw" | "token_lock_supply" | "stake" | "unstake" | "stake_withdraw" | "liquid_stake" | "swap" | |
| freezable | boolean | token_create: the issuer can freeze holders |
| fixed_supply | boolean | token_create: minting closed after the initial supply |
| holder | string | token_freeze, token_thaw: holder address |
| amount | string | Initial supply (token_create), tokens (mint/burn), amount sold (swap), native coin (stake, liquid_stake), items (nft_transfer, default 1) |
| name | string | token_create |
| symbol | string | token_create: 2–10 capital letters or digits |
| decimals | integer | token_create (default 6; Solana 0–9, EVM 0–18) |
| token | string | token_mint, token_burn, token_metadata: mint or contract address |
| to | string | token_mint: recipient (default: the wallet); nft_transfer: recipient |
| contract | string | nft_transfer: ERC-721 or ERC-1155 collection contract |
| token_id | string | nft_transfer: token id (decimal) |
| sell | string | swap: native, a symbol or a token address |
| buy | string | swap: native, a symbol or a token address |
| slippage_bps | integer | swap (default 50 = 0.5%) |
| validator | string | stake: validator vote account (Solana) |
| stake_account | string | unstake, stake_withdraw |
| note | string |
200 Idempotent replay201 Createderror Error object
/payeestransfers:readConnected organizations of the payment network and the networks they receive on. Pay one with destination "@handle" on POST /transfers or /payouts.
200 OKerror Error object
/payoutstransfers:readRecent batches with per-status counts.
| limit | query | integer |
200 OKerror Error object
/payoutstransfers:writeUp to 500 lines { destination, amount, note? } from one wallet and asset. Every line is validated first; if any is invalid nothing is created and the errors are listed per line. Send an Idempotency-Key so a retry never pays twice.
| Idempotency-Key | header | string | Retries with the same key return the original response and never repeat the side effect. |
| wallet_id * | string (uuid) | |
| asset * | string | |
| reference | string | |
| items * | object[] |
201 payout_batcherror Error object
/payouts/{id}transfers:read| id * | path | string (uuid) |
200 payout_batcherror Error object
/policytransfers:readLimits, tiers, address book, Travel Rule, KYT and transaction rules, with the version and the latest versions.
200 policyerror Error object
/policy/impacttransfers:readBody { policy } in the shape GET /policy returns. Validated, then replayed on the last 200 requests (24-hour totals and velocity recomputed). Nothing is published.
200 policy_impact: checked, stricter, looser, unchanged, changeserror Error object
/prices200 OKerror Error object
/reports/ledgertransfers:read| from | query | string (date) | |
| to | query | string (date) |
200 OKerror Error object
/reports/gainstransfers:readPooled per asset across the organization's wallets (moves between own wallets excluded). Unknown costs are null, never guessed.
| from | query | string (date) | |
| to | query | string (date) | |
| method | query | "fifo" | "average" |
200 OKerror Error object
/reserves/snapshotsreserves:writeBody { customers: [{ user_id, balances: { BTC: "0.25" } }] }. Commits liabilities in a Merkle sum tree (ids hashed) and reads reserves from your wallets.
201 por_snapshoterror Error object
/reserves/snapshots/{id}/proofreserves:write| id * | path | string (uuid) | |
| user_id * | query | string |
200 por_proof: give it to that customer to check on the public pageerror Error object
/screeningwallets:read| network * | query | string | |
| address * | query | string |
200 screening_resulterror Error object
/screening/inboundtransfers:readEvery incoming movement's sender is screened (sanctions and your KYT providers). Never credit a flagged deposit before deposit.released.
| status | query | "clear" | "flagged" | "released" | "reported" | |
| limit | query | integer |
200 OKerror Error object
/securityevents:readScore 0-100 and every check with its fix, for SIEM and GRC dashboards.
200 security_postureerror Error object
/swap/quotetransfers:read| wallet_id * | query | string | |
| sell * | query | string | |
| buy * | query | string | |
| amount * | query | string | |
| slippage_bps | query | string |
200 OKerror Error object
/tokenswallets:readTokens the organization created, with live supply, market price, market cap and public profile.
200 OKerror Error object
/transferstransfers:readNewest first. When has_more, pass next_cursor as starting_after for the next page (stable while new transfers arrive).
| status | query | string | |
| wallet_id | query | string (uuid) | |
| external_id | query | string | |
| tag | query | string | |
| starting_after | query | string (uuid) | |
| limit | query | integer |
200 OKerror Error object
/transferstransfers:writeEvaluated against the environment policy (limits, allow/blocklists, approval tiers). Approved transfers are signed in the vault and broadcast by the worker when execution is enabled.
| Idempotency-Key | header | string | Retries with the same key return the original response and never repeat the side effect. |
| wallet_id * | string (uuid) | |
| asset * | string | Symbol (USDC, ETH…), asset id, or any token address on Solana (SPL, Token-2022) and EVM networks (ERC-20): symbol and decimals are read from the chain |
| amount * | string | |
| destination * | string | |
| note | string | |
| fee_level | "low" | "medium" | "high" | Network fee priority (EVM, Bitcoin-family, Solana). Default medium. |
| external_id | string | Your own reference, unique per environment; GET /transfers?external_id= finds it. |
200 Idempotent replay201 Createderror Error object
/transfers/previewtransfers:readSame body as POST /transfers. Returns the policy decision, destination status, USD value, network fee and a chain simulation (funds, fees, gas estimate). Nothing is created, signed or sent.
200 transfer_previewerror Error object
/transfers/{id}/tagstransfers:writeBody { tags: ["payroll", "vendor:acme"] }. Tags are never part of what was approved or signed.
| id * | path | string (uuid) |
200 OKerror Error object
/transfers/{id}| id * | path | string (uuid) |
200 OKerror Error object
/transfers/{id}/cancel| id * | path | string (uuid) |
200 OKerror Error object
/transfers/{id}/speed-uptransfers:writeEVM: re-signs the same transaction (same nonce, recipient, amount and data). Bitcoin and Litecoin: replace-by-fee spending the same coins, the higher fee taken from the change. Fees rise by at least 12.5% or to the network price, at most ten times the approved fee. Webhook transfer.sped_up.
| id * | path | string (uuid) |
200 OKerror Error object
/transfers/{id}/cancel-onchaintransfers:writeEVM: spends the same nonce on a 0-value transaction to the wallet itself. Bitcoin and Litecoin: spends the same coins back to the wallet. Whichever transaction is included first decides: the transfer ends confirmed, or canceled with nothing sent.
| id * | path | string (uuid) |
200 OKerror Error object
/travel-rule/messagestransfers:read| direction | query | "incoming" | "outgoing" |
200 OKerror Error object
/travel-rule/messages/{id}/acknowledgetransfers:write| id * | path | string (uuid) |
200 OKerror Error object
/vaultswallets:read200 List of vaultserror Error object
/vaultswallets:writeBody { name, description? }.
201 Vaulterror Error object
/vaults/{id}/freezewallets:writeBody { reason }. Nothing can leave the vault, approved transfers included, until an owner, admin or CFO unfreezes it in the console. Webhook vault.frozen.
| id * | path | string (uuid) |
200 Vaulterror Error object
/walletswallets:read| purpose | query | "treasury" | "end_user" | |
| custody | query | "managed" | "watch" | |
| external_user_id | query | string | |
| limit | query | integer |
200 OKerror Error object
/walletswallets:writeGenerates a new key in the vault (omit `address`), or watches an existing address (pass `address`). With `external_user_id`, creation is idempotent per network: one wallet per end user.
| Idempotency-Key | header | string | Retries with the same key return the original response and never repeat the side effect. |
| network * | string | |
| label | string | |
| external_user_id | string | |
| address | string | |
| kind | "hot" | "warm" | "cold" |
200 Existing end-user wallet returned201 Createderror Error object
/wallets/{id}| id * | path | string (uuid) |
200 OKerror Error object
/wallets/{id}/balances| id * | path | string (uuid) | |
| refresh | query | boolean | Read the chain now. |
200 OKerror Error object
/wallets/{id}/transactions| id * | path | string (uuid) | |
| limit | query | integer |
200 OKerror Error object
/wallets/{id}/allowancesERC-20 allowances, NFT operators and Permit2 allowances, read live, riskiest first; at_risk = min(allowance, balance).
| id * | path | string (uuid) |
200 allowanceserror Error object
/wallets/{id}/allowancestransfers:writeBody { kind: erc20 | nft_operator | permit2, token, spender }. Requested as a contract_call operation under the policy and co-signer.
| id * | path | string (uuid) |
201 OKerror Error object
/wallets/{id}/vaultwallets:writeBody { vault_id } (null: out of its vault).
| id * | path | string (uuid) |
200 wallet_vaulterror Error object
/wallets/{id}/refresh-keyswallets:write| id * | path | string (uuid) |
200 OKerror Error object