A valid request URL is required to generate request examples{
"data": {
"type": "DEPOSIT",
"slug": "stable-vault",
"chainId": 1,
"blockNumber": 26147329,
"vault": {
"address": "0xcDA323c2DF692d989B24BA51D0aCCa924cf9a344",
"symbol": "USDst",
"shareDecimals": 18
},
"depositAsset": {
"address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"symbol": "USDC",
"decimals": 6
},
"amount": "1000000000",
"expectedShares": "997382077837769004220",
"fees": {
"entryBps": 0
},
"steps": [
"approve",
"deposit"
],
"notes": [
"Send the transactions in step order and wait for each receipt before you send the next.",
"Shares are minted at the vault price when the deposit executes; expectedShares uses the price at blockNumber.",
"Build again after a 409, or when more than 10 minutes have passed."
],
"sender": "0x1111111111111111111111111111111111111111",
"receiver": "0x1111111111111111111111111111111111111111",
"referral": "0x0000000000000000000000000000000000000000",
"transactions": [
{
"step": 1,
"label": "approve",
"description": "Approve the vault to transfer exactly the deposit amount of the deposit asset.",
"chainId": 1,
"from": "0x1111111111111111111111111111111111111111",
"to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"data": "0x095ea7b3000000000000000000000000cda323c2df692d989b24ba51d0acca924cf9a344000000000000000000000000000000000000000000000000000000003b9aca00",
"value": "0"
},
{
"step": 2,
"label": "deposit",
"description": "Deposit assets into the vault and receive vault shares in the same transaction.",
"chainId": 1,
"from": "0x1111111111111111111111111111111111111111",
"to": "0xcDA323c2DF692d989B24BA51D0aCCa924cf9a344",
"data": "0xd01d073a000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000011111111111111111111111111111111111111110000000000000000000000000000000000000000000000000000000000000000",
"value": "0"
}
],
"simulation": {
"status": "passed",
"method": "eth_simulateV1",
"blockNumber": 26147329
}
},
"asOf": 1791458270
}Build a transaction
Builds a DEPOSIT or a REDEEM_REQUEST for the vault slug names: it runs the checks below in order (the first failure answers), returns the unsigned transactions and simulates them. Nothing is signed or sent.
DEPOSIT (syncDeposit: the shares are minted in the same transaction):
- Checks: the amount is at least the minimum and within the per-request limit (400
amount_below_minimum/invalid_amount);receiver, when sent, equalssender, compared case-insensitively (400 onbody.receiver); the vault exists (404vault_not_found) and is active (409vault_not_active); the vault is not paused (409vault_paused); it accepts synchronous deposits and its NAV is valid (409deposits_unavailable); the cap has room, counting the deposits waiting for settlement (409deposit_cap_reached); the vault’s allow list (isAllowed) accepts the sender and the receiver (403wallet_not_allowed); the sender holds the amount (422insufficient_balance); the simulation passes (422simulation_failed). - The transactions are an exact-amount
approveof the deposit asset when the allowance is short, thensyncDeposit(amount, sender, referral)on the vault: the shares go to the sender.referraldefaults to the zero address.
REDEEM_REQUEST, a redeem request (requestRedeem(shares, sender, sender): the shares leave the wallet at once, and the assets become claimable when the vault settles the request, usually within window.maxDays):
- Checks: the vault exists and is active (404 / 409); the vault is not paused (409
vault_paused); the vault’s allow list accepts the sender (403wallet_not_allowed);sharesis at most the sender’s balance (422insufficient_shares); the sender has no redeem request waiting for settlement in this vault (409redeem_request_already_pending); the simulation passes (422simulation_failed). - If the sender has a settled redeem request it has not claimed,
requestRedeempays those assets to the sender first, in the same transaction;claimFirstshows them (null otherwise). Once the new redeem request settles, the wallet claims its assets in the Kamui app, or its next redeem request pays them out. - No approval is needed: the sender owns the shares.
Both types:
simulation.statusispassed(the bundle ran witheth_simulateV1, or a single transaction witheth_call),partial(the node cannot simulate a bundle and the deposit needs the approval first, so only the checks ran) orskipped(skipSimulation: true).- A legacy slug resolves to its canonical vault, and the response carries the canonical slug.
- Transaction building must be enabled for your API client (403
actions_not_enabled) and can be switched off (503actions_disabled). ADEPOSIT’s amount and receiver checks answer first.
A valid request URL is required to generate request examples{
"data": {
"type": "DEPOSIT",
"slug": "stable-vault",
"chainId": 1,
"blockNumber": 26147329,
"vault": {
"address": "0xcDA323c2DF692d989B24BA51D0aCCa924cf9a344",
"symbol": "USDst",
"shareDecimals": 18
},
"depositAsset": {
"address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"symbol": "USDC",
"decimals": 6
},
"amount": "1000000000",
"expectedShares": "997382077837769004220",
"fees": {
"entryBps": 0
},
"steps": [
"approve",
"deposit"
],
"notes": [
"Send the transactions in step order and wait for each receipt before you send the next.",
"Shares are minted at the vault price when the deposit executes; expectedShares uses the price at blockNumber.",
"Build again after a 409, or when more than 10 minutes have passed."
],
"sender": "0x1111111111111111111111111111111111111111",
"receiver": "0x1111111111111111111111111111111111111111",
"referral": "0x0000000000000000000000000000000000000000",
"transactions": [
{
"step": 1,
"label": "approve",
"description": "Approve the vault to transfer exactly the deposit amount of the deposit asset.",
"chainId": 1,
"from": "0x1111111111111111111111111111111111111111",
"to": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"data": "0x095ea7b3000000000000000000000000cda323c2df692d989b24ba51d0acca924cf9a344000000000000000000000000000000000000000000000000000000003b9aca00",
"value": "0"
},
{
"step": 2,
"label": "deposit",
"description": "Deposit assets into the vault and receive vault shares in the same transaction.",
"chainId": 1,
"from": "0x1111111111111111111111111111111111111111",
"to": "0xcDA323c2DF692d989B24BA51D0aCCa924cf9a344",
"data": "0xd01d073a000000000000000000000000000000000000000000000000000000003b9aca0000000000000000000000000011111111111111111111111111111111111111110000000000000000000000000000000000000000000000000000000000000000",
"value": "0"
}
],
"simulation": {
"status": "passed",
"method": "eth_simulateV1",
"blockNumber": 26147329
}
},
"asOf": 1791458270
}Authorizations
The client's own API key (kmi_<id>_<secret>), issued by Kamui. A missing, malformed, unknown, revoked or expired key answers 401 unauthorized.
Headers
Your id for this request: 1 to 128 letters, digits, ., _, : or -. It is echoed in the response. Any other value is replaced with a new UUID.
^[A-Za-z0-9._:-]{1,128}$Body
- DEPOSIT
- REDEEM_REQUEST
"DEPOSIT"Vault slug, matched exactly: lowercase letters, digits and single hyphens (stable-vault). Case and whitespace count, so Stable-Vault and stable-vault answer 400. A legacy slug works; the response carries the canonical one.
1 - 64^[a-z0-9]+(?:-[a-z0-9]+)*$"stable-vault"
1 - 30^[1-9][0-9]{0,29}$"1000000000"
Ethereum address: 0x and 40 hex characters, in lowercase or with a valid EIP-55 checksum. Other mixed case, all-uppercase hex, a 0X prefix and the zero address answer 400.
42^0x[0-9a-fA-F]{40}$"0x1111111111111111111111111111111111111111"
Ethereum address: 0x and 40 hex characters, in lowercase or with a valid EIP-55 checksum. Other mixed case, all-uppercase hex, a 0X prefix and the zero address answer 400.
42^0x[0-9a-fA-F]{40}$Ethereum address: 0x and 40 hex characters, in lowercase or with a valid EIP-55 checksum. Other mixed case, all-uppercase hex and a 0X prefix answer 400.
42^0x[0-9a-fA-F]{40}$