Create a quotation
Create a quotation: a priced, itemized fee envelope for a prospective payment. A quotation can optionally be persisted as a redeemable quote_id that locks the fees and FX rate so a later payout settles at the quoted price. All monetary amounts are returned as integer minor units paired with an explicit precision (e.g. 100000 at precision 2 is 1000.00).
Provide exactly one of:
virtual_account_id— price against an existing virtual account (the account pins the funding direction, source currency, and network). This persists the quote and returns a realquote_idyou can redeem on a payout.quote_for— a pre-account preview ({ rail, currency }) that does not persist and returnsquote_id: null.
Sending both, or neither, returns 400. A quote_for preview is standalone — rail, payment_instructions, and from_held_balance are account-bound and cannot be combined with it.
Key request fields:
amount(required) — a positive two-decimal string, e.g."1000.00".target— destination{ currency, network? }.currencyis one ofUSD,USDC,USDT;network(solana,polygon,tron) is required when the target currency is a stablecoin.inverse(defaultfalse) — whentrue,amountis the desired recipient amount and the engine back-solves the source amount.rail— bank-rail hint for account-bound quotes:ACH_STANDARD,ACH_SAME_DAY,WIRE_DOMESTIC.payment_instructions— declare a crypto funding leg{ currency, network }(account-bound quotes only).effective_at— optional ISO 8601 timestamp (with timezone offset); prices the quote as of that time (defaults to now).from_held_balance(defaultfalse) — price a payout from your on-book balance (account-bound quotes only; cannot be combined withpayment_instructions); the response may include an advisorybalance_sufficientflag.client_markup— per-quote markup override{ fixed_minor?, percentage_bps? }. Scalefixed_minorby the precision of the currency you fund with (×100 for USD, ×10⁶ for USDC/USDT);percentage_bpsis basis points. Replaces your configured markup for this quote only.
Response returns source and recipient money objects, a pricing_context, a depeg-aware conversion block, an itemized fees[] array (each line carries code, kind "fixed"/"percentage", charged_by "kira"/"client", status, signed amount), and totals. The quote expires at quote_expires_at (default TTL 15 minutes).
Errors: 400 validation_error or fees_exceed_amount; 401 unauthorized; 404 for an unknown or foreign virtual account.
Note: this itemized response shape is what POST /v1/quotations returns on the 2026-06-01 pin (and later). Versions before 2026-06-01 return a simpler preview shape.
Authorizations
Access token from POST /auth (the data.access_token value).
API key issued by Kira. Required on every request, including /auth.
Headers
Optional. The date-versioned API version to apply for this request (e.g. 2026-04-14). When sent it always wins, even over your pinned account default. When omitted, the API uses your account's pinned version if set, otherwise a baseline default.
"2026-06-01"
Body
- Option 1
- Option 2
Amount to quote, as a 2-decimal DECIMAL STRING (e.g. "1000.00"). For a virtual_account_id quote it's in the virtual account's own currency (USD for a fiat VA; USDC/USDT for a crypto VA — quoting a crypto VA returns source.currency: "USDC"). For a quote_for preview it's in quote_for.currency. When inverse: true, this is instead the desired amount the RECIPIENT should receive. Must be > 0 (the pattern rejects 0.00).
^(?!0+\.0+$)\d+\.\d{2}$Pre-account preview target. rail and currency must be coherent: TRON → USDT, SOLANA/POLYGON → USDC, and bank rails (ACH_STANDARD/ACH_SAME_DAY/WIRE_DOMESTIC) → USD. A mismatch returns 400.
The delivery side you want the recipient to receive: currency (USD, USDC, or USDT) and, for a stablecoin, the delivery network. network is required when currency is USDC/USDT — omitting it returns 400 "network is required when currency is a stablecoin". Omit target entirely for a same-currency quote.
When false (default), amount is the source amount and the engine computes what the recipient receives. When true, amount is the desired recipient amount and the engine grosses up the source amount instead. Quoting amount: "1000.00", inverse: true returned recipient.amount: 100001 ($1000.01, rounded up by 1 cent) and a grossed-up source.amount: 100081 — the recipient receives at least the requested amount.
Optional outbound bank-rail hint, for virtual_account_id quotes only (a fiat VA accepts several rails on one account number). Adding rail: "WIRE_DOMESTIC" adds a wire_domestic_inbound line to the response fees[] that isn't present without it. Rejected with 400 when combined with quote_for — "top-level rail applies to virtual_account_id quotes only; quote_for carries its own rail".
ACH_STANDARD, ACH_SAME_DAY, WIRE_DOMESTIC Supply to price a CRYPTO-FUNDED quote: the stablecoin (currency: USDC/USDT) and blockchain (network: solana/polygon/tron) you will deposit to fund the payout. Adding this to a quote against a FIAT virtual account prices the crypto leg (same result as quoting a crypto virtual account directly) and adds the funding network's fee line to fees[]. A USD-pegged stablecoin is priced on its USD face value (1:1), so source still reports USD with precision: 2 — conversion.pair is what names the stablecoin you deposit.
Optional ISO 8601 timestamp (with timezone offset). Prices the quote as of this time; defaults to the current time.
Per-quote markup override that replaces your configured markup for this quote only. Provide at least one of fixed_minor (minor units of the currency you fund with) or percentage_bps (basis points) with a value greater than 0.
Response
Created.
UUID of the persisted, redeemable quote. null on a quote_for (pre-account preview) quote, which is informational only; a real UUID on a virtual_account_id quote.
ISO-8601 timestamp when this quote (and its locked conversion rate) expires. Always exactly 900 seconds (15 minutes) after conversion.locked_at.
- Option 1
- Option 2