v2026-XX-XX revamp resolves.
Identity / user lifecycle
status and verification_status can contradict each other on the same user. Observed in production data: status: VERIFIED paired with verification_status: unverified / in_review / started. The relationship between the two fields is undefined today. Gate your state machine on status, and treat verification_status as advisory only.Undocumented user
status values exist in real tenants: ACTIVE and REVIEW are common but not enumerated anywhere. Handle them as “non-terminal, do not gate flow on them.”- Field renames between request and response. For example,
address_streetbecomesresidential_address.street_line_1,address_zip_codebecomespostal_code, andaddress_statebecomessubdivision. Always parse the response shape — never assume request fields round-trip. - Country codes are inconsistent across resources. ISO-3 (
MEX,USA) on users, ISO-2 (MX,US) on recipients. Make sure your client maps correctly.
Virtual accounts
GET /v1/virtual-accounts/{id}/balancereturns200withavailable_balanceon an active ACT VA, andpayout/preview+payoutreturn200/201with a fee breakdown. While the VA is still activating, balance returns400— confirm readiness viaaccount_numberbeing a real account number — non-null AND not equal to"PENDING-ACT-ACCOUNT"(the sentinel is ACT-only; SWIFT-capable / crypto VAs showaccount_number: nulluntil provisioned) — and thevirtual_account.deposit_*webhooks.approveddoes not mean funds-ready.providerandcurrencycome backnullin the list view. UseGET /v1/virtual-accounts/{id}if you need them.
One ACT virtual account per user. Re-creating returns
409 Conflict. Use the existing VA via List/Get.Pre-verified test users (current ACT-product fields gap)
The seed user we ship was verified via AiPrise but is missing the field set required for ACT VA creation (
immigration_status, additional_info:has_us_bank_account, additional_info:has_denied_bank_account, etc.). You can still read/list/operate the existing VAs on that user. To create a fresh ACT VA on a user, the user must be re-verified with the full ACT field set — coordinate with your Kira contact.Recipients
- Recipient response uses
recipient_id, notid, andcreated_ts(non-ISO 8601), notcreated_at. The User and VA resources use the standardid/created_at— recipients are the outlier. account.bank_address.stateand.postal_codeare silently dropped to empty strings in the response, even when sent on the request. Read-after-write does NOT preserve them today.
Payouts
- No fee schedule endpoint and no
dry_runmode. Preview Payout will return400 "Total fees exceed or equal the payout amount"for amounts below the minimum (~$3 for SWIFT) — there’s no way to know the minimum without iterating. - Duplicate fields in fee response.
fees.totalandfees.total_feesare identical. Use either. - Unit ambiguity.
bank_account_fee_percentage: "0.0004"is a ratio;bank_account_fee: "0.01"is dollars. Different units, sibling fields.
Deposits
simulate-deposit returns 201 with status: "completed" immediately — but the simulated deposit does NOT appear in GET /v1/virtual-accounts/{id}/deposits (the list stays empty) and does NOT change GET /…/balance (the sandbox balance is a fixed provider value; the endpoint itself still works — 200 with available_balance on an active ACT VA). Confirmation of a simulated deposit is the 201 response itself plus the (hand-delivered) virtual_account.deposit_funds_received webhook — NOT the deposits list, NOT a balance delta. Note settlement_triggered: false on a fiat deposit is normal (fiat is already completed), not an error.- Snake_case + camelCase mixed in the same response object —
deposit_idnext tointernalPaymentId. Tolerate both casings in your parser.
Webhooks
- Webhook router is on a different stack. The path is
/webhooks/register(NO/v1/prefix). Naming usesclient_uuidhere instead ofclient_ideverywhere else. - No webhook CRUD endpoints today. You cannot list, update, or delete a registered webhook via the API. The register endpoint doesn’t return an
ideither, so you have no handle to manage what’s been registered. Coming inv2026-XX-XX. - No retry policy on failed deliveries. Your endpoint must be highly available or you lose events.
For webhook setup and event payloads, see Webhooks. For the complete event catalog and per-resource state machines, see State machines & webhook catalog.