https://api.balampay.com/sandbox.
1
Get your credentials
Kira provides three credentials for your tenant:
api_key— sent as thex-api-keyheader on every request, including/auth.client_idandpassword— exchanged atPOST /authfor a short-lived access token.
2
Authenticate
Call The response wraps the token in the success envelope:Use the returned See Authentication for the full token lifecycle.
POST /auth with your client_id and password in the body and your x-api-key header. The /auth endpoint itself needs only x-api-key — no bearer token yet.access_token as your bearer token on every other request. It is valid for 3600 seconds, so refresh it before it expires.3
Pin your version
Send the
X-Api-Version: 2026-04-14 header on every request. The header always selects the documented schema, always wins over your account’s stored default, and works no matter which version your account is pinned to — every example below includes it.Optionally, if your account’s current default is 2026-04-14 or older, you can also pin your account once with POST /v1/versioning/upgrade, after which the header becomes optional. Re-pinning to the same version is a safe no-op. See Versioning for details.4
Create a user
Create a user with This minimal body returns
POST /v1/users. A user is either an individual or a business. source_of_funds is optional at create — the call returns 201 without it — but it is a KYC questionnaire field that business (KYB) products require, so omitting it doesn’t reject the user outright; it leaves verification unable to proceed until you supply it. Send it on create to keep the flow moving.201 as-is. To take the user all the way to VERIFIED, send the complete field set for its category (documents, address, questionnaire) — see Creating users for full example payloads.5
Create a virtual account
Create a virtual account for the user with
POST /v1/virtual-accounts.bank: "slovak_savings_bank" selects the recommended default rail. The bank value is environment-scoped: in production the same rail is bank: "portage" (sending portage in sandbox returns 400 "Invalid bank").A VA being
approved does not mean funds are ready: confirm readiness via account_number being a real value (it stays null while provisioning; on the ACT rail — bank: "austin_capital_trust" — it shows the "PENDING-ACT-ACCOUNT" placeholder instead, and ACT allows one VA per user: re-creating returns 409 Conflict). A new sandbox VA activates automatically — the sandbox polls provider status every 15 seconds, so expect activation (and the virtual_account.activated webhook) within about a minute (see Known limitations).6
Make a payout
In the sandbox there’s no deposit to run first — an active VA reports a fixed provider
available_balance (check it with GET /v1/virtual-accounts/{id}/balance).Payouts are a two-step flow: price it, then create it.Price with POST /v1/quotations. Pin X-Api-Version: 2026-06-01 on this call to get the itemized breakdown — one object per fee, plus the conversion rate and tier context. The quote is redeemable for 15 minutes.rail is the bank rail you intend to pay out on (ACH_STANDARD, ACH_SAME_DAY, WIRE_DOMESTIC) — declare it so the quote prices that rail’s fixed fee. Paying from the VA’s on-book balance instead of a fresh deposit? Add "from_held_balance": true. Funding the payout with stablecoin? Send payment_instructions instead. Both, and the full response shape, are in Itemized quotations.payout/preview is deprecated as of July 16, 2026 and is not shown here. It still works for existing integrations — see Payouts, quotations, and recipients — but do not build new integrations on it.There is no fee schedule endpoint and no
dry_run mode. For amounts below the minimum, POST /v1/quotations returns 400 with code: "fees_exceed_amount" and the message "The fees exceed the provided amount. Please increase the amount.", plus a details object (amount, total_fees) you can use to size the next attempt. The 201 create response returns lowercase status: "created", while GET /v1/payouts/{id} returns CREATED for the same payout — compare statuses case-insensitively.Next steps
Authentication
The full token lifecycle, required headers, and credential handling.
Webhooks
Register an endpoint and consume deposit, user, and payout events.
API reference
Browse every endpoint, request shape, and response in the interactive reference.