Create a virtual account
Open a virtual account for one of your users.
The account is opened in the background. A 201 means the request was accepted, not that the account can take money: it comes back without deposit details, and the bank assigns them afterwards. Wait for the virtual_account.activated webhook — see Webhooks — then read the deposit details off the account.
Headers
Version applied to this request. It wins over your account's pinned version — see Versioning.
"2026-04-14"
A UUID you generate for this call. Retrying with the same key returns the first account instead of opening a second one; reusing it with a different body is rejected with a 409.
"3fa85f64-5717-4562-b3fc-2c963f66afa6"
Body
Send bank or provider — one of the two is required. Everything else is optional.
The user the account belongs to. The user has to be a business with status: VERIFIED and be eligible for the product, or the call is refused.
Account type.
US_BANK Which bank the account runs on, and with it the rail — see Virtual account values. Required unless you send provider instead.
A bank your account is not authorized for is rejected with Invalid bank.
austin_capital_trust, jp_morgan A short name for a bank: act means austin_capital_trust, and jp_morgan means the bank of the same name. Send this instead of bank, not as well.
act, jp_morgan What the account does with a deposit, and it cannot be changed later: fiat keeps it as a USD balance, crypto converts it and sends it to destination. See Virtual account values.
Omit it and a destination means crypto, none means fiat. fiat with a destination is rejected.
fiat, crypto Where a converted deposit is sent. Omit it for a fiat account.
You can also open a crypto account without one — the address is then created on the first payout.
Your own label for the account. It comes back on every read.
Your own key/value pairs, returned unchanged. Up to 50 keys. A key is 1 to 40 characters and cannot contain [ or ]; a value is up to 500 characters.
Your fees on this account, each a decimal string such as "1.50". Negative values are rejected, and so is any key not listed here. Ask your Kira contact before setting these.
Response
The account was accepted and is being opened.
The account as it exists right after the call. Deposit details are not assigned yet, so source_deposit_instructions is null on every new account.
Virtual account UUID. Use it to read the account later.
Where the account is in its lifecycle — see Virtual account values. A new account always comes back as approved, which means it was accepted, not that it can take money yet.
Account type.
US_BANK Which bank the account runs on — see Virtual account values. When you sent provider, this is the bank it stands for.
What the account does with a deposit. Available options: fiat, crypto. See Virtual account values.
The destination you sent, returned unchanged. null when you sent none.
The bank details a payer sends to. Always null here — the bank assigns them while it opens the account.
The label you sent. Absent when you sent none.
The fees you sent, returned unchanged. Absent when you sent none.
When the account was created, as an ISO 8601 timestamp.
The key/value pairs you sent, returned unchanged. {} when you sent none.