Create a user
Creates an end client (your user) and starts identity verification — KYC for individual, KYB for business. The required field set depends on type (individual | business) and address_country (ISO alpha-3, e.g. USA, MEX). See Creating users for the full per-category field tables, conditional rules, and country restrictions.
Required to create: individuals need type, first_name, last_name, email; businesses need type, business_legal_name, email. A bare payload returns 201, but the user will not be product-eligible.
The Idempotency-Key header is required and must be a UUID; reusing a key with a different body returns 409.
Enums differ by type. account_purpose accepts 14 values for individuals and 8 (different) values for businesses; source_of_funds, expected_monthly_volume, and expected_transaction_count likewise differ between individuals and businesses. expected_monthly_payments is a free-form string on this endpoint — use expected_monthly_volume + expected_transaction_count for bucketed values. Any out-of-set value → 400 invalid_enum_value.
Verification modes (verification_mode):
automatic(default) — verification runs on create and you receiveuser.*webhooks. Sendsource_of_fundsand the full category field set.verification_link— every other field is stripped and a hosted KYC URL is returned asverification_link. Passredirect_urito control the post-completion redirect andlanguage(en/es) for the form locale. The created user echoes placeholder values for the stripped fields (nationality: "---",birth_date: "1900-01-01", emptyresidential_address) until the hosted flow completes — treateligible_products[].missing_fieldsas the authoritative outstanding-fields signal, not the echoed field values.
Documents (identifying_information[].documents[].file) accept a base64 data URI (JPEG/PNG/PDF) or — on version 2026-04-14+ — an https:// URL (http:// is rejected). A two-sided ID (any type except passport/visa) that includes a front must also include a back. The whole request body is capped at 10 MB and inline base64 counts against it (≈ +33% overhead), so prefer the https:// URL form for large files — it’s fetched asynchronously, doesn’t count toward the body limit, and accepts files up to 30 MB each.
Sandbox verification behavior: identity verification triggers automatically once the user is complete for at least one product (verification_triggered: true) and the sandbox approves within seconds — no manual step. An incomplete user is NOT rejected: verification does not trigger and the user stays CREATED with the gaps listed in missing_fields. A terminal REJECTED means the provider evaluated the submitted data and declined it (user.verification.failed webhook; verification_status may still read unverified — gate on status). The rejection reason is delivered ONLY in the user.verification.failed webhook (data.reasons[]) — GET /v1/users/{id} never exposes it. A data rejection is distinct from a verification-provider call failure (network / 5xx / timeout reaching the provider): a call failure is a retryable system error — the user stays non-terminal (VERIFYING), no user.verification.failed fires, and the transition surfaces via user.status_changed.
Response (201) returns the user plus verification_triggered, eligible_products[], missing_fields (per-product field tokens; populated once verification has run), verification_link (link mode only), and warnings[] (non-fatal document-upload issues).
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-04-14"
"{{idempotency_key}}"
Body
- Option 1
- Option 2
Discriminator: individual (KYC) or business (KYB). Selects the required fields and which enum sets apply.
individual Given name. Required for individuals.
1Family name. Required for individuals.
1Email address. Required for all users.
automatic (default) runs verification on create and emits user.* webhooks. verification_link returns a hosted KYC URL and strips every other field.
automatic, verification_link Per-subclient bank intent — records which bank(s) this subclient plans to use, distinct from bank-account authorization (which lives in your account's own configuration). Optional; omit it to use the standard verification path.
Where the hosted verification form redirects after completion. Used only with verification_mode: verification_link.
Locale for the hosted verification form: en or es. Used only with verification_mode: verification_link.
en, es Middle name.
Phone in E.164 format, e.g. +14155551234. Spaces and dashes are sanitized before validation.
Date of birth, YYYY-MM-DD. The user must be at least 18 years old.
^\d{4}-\d{2}-\d{2}$Nationality as an ISO 3166-1 alpha-3 code (e.g. USA, MEX).
3One of male, female, other.
male, female, other Ignored on create — new users always start as CREATED.
active, inactive, suspended Your own reference ID for this user (stored as partnerUserId).
Structured residential address (V1). You may instead use the flat address_* fields.
Street address (≤ 70 chars). Flat (V2) address form.
70Apartment, suite, or unit (≤ 70 chars).
70City.
State or province (US state for USA users).
ZIP or postal code.
Country as ISO alpha-3. With type, selects the user category; users in restricted countries are not VA-eligible.
Tax IDs and government documents. Each entry requires type and issuing_country.
Whether the user is a Politically Exposed Person.
Terms-of-service version the user accepted. Kira stamps tos_accepted_at on receipt.
Origin of funds. The accepted enum differs for individuals vs businesses.
salary, self_employment_income, investment_proceeds, savings_inheritance_gift, gifts, inheritance, investments_loans, pension_retirement, sale_of_assets_real_estate, savings, someone_elses_funds Intended account use. 14 values for individuals, 8 (different) values for businesses.
receive_payments, manage_professional_income, make_payments, manage_personal_funds, investment_trading, charitable_donations, investment_purposes, operating_a_company, payments_to_friends_or_family_abroad, personal_or_living_expenses, purchase_goods_and_services, protect_wealth, receive_salary, receive_payment_for_freelancing Free-form string. Prefer expected_monthly_volume + expected_transaction_count for bucketed values.
Expected monthly volume bucket. Buckets differ for individuals vs businesses.
less_than_10000, 10000_to_49999, 50000_to_199999, 200000_to_999999, 1000000_or_more Expected monthly transaction-count bucket. Buckets differ for individuals vs businesses.
1_to_10, 11_to_50, 51_to_200, more_than_200 One of employed, self_employed, unemployed, retired, student.
employed, self_employed, unemployed, retired, student Occupation. Required (for eligibility) when employment_status = employed.
Employer. Required (for eligibility) when employment_status = employed.
Income source. Required (for eligibility) unless employment_status = employed.
Legacy flat document array. Prefer identifying_information[].documents[].
Exact string, e.g. U.S. Citizen, Permanent U.S. Resident, Non-Resident of U.S. Required for international individuals.
Free-form string map. International users must include has_us_bank_account and has_denied_bank_account (Yes/No, case-sensitive; lowercase is not accepted by ACT provisioning).
Your key-value pairs. ≤ 50 keys; key 1–40 chars with no [ or ]; value ≤ 500 chars. Kira can additionally configure client-level default metadata for your account; defaults are merged in at create time (your keys win on conflict), so the stored and returned metadata may include keys you did not send.
Optional partner-supplied KYC session ID.
Response
Created.
The created user plus create-time verification details.
User UUID.
individual or business.
individual, business Email address.
Lifecycle status: CREATED, VERIFYING, REVIEW, VERIFIED, or REJECTED. Gate product readiness on this, not on verification_status.
Creation timestamp (ISO 8601).
Last-update timestamp (ISO 8601).
KYC/KYB status: unverified, started, in_review, verified, rejected, or needs_action.
unverified, started, in_review, verified, rejected, needs_action automatic or verification_link.
Hosted KYC URL — present only in verification_link mode.
Populated if hosted-link generation failed, or on PUT /v1/users/{user_id} when a bank-migration triggered by the request was deferred or failed. Freeform, human-readable text — branch on verification_link_error_severity, not this string.
Machine-readable companion to verification_link_error, present only alongside it on the PUT /v1/users/{user_id} response. deferred means nothing is wrong — the triggered bank migration is waiting on something expected or was correctly skipped by a business rule. failed means the migration hit a genuine problem.
deferred, failed Your key-value pairs, plus any client-level default metadata configured for your account (merged at create time; your request keys win on conflict).
Given name (individual users).
Family name (individual users).
Middle name (individual users), when provided.
Contact phone in E.164 form (e.g. +525512345678).
Date of birth, YYYY-MM-DD (individual users).
Nationality as an ISO alpha-3 country code (e.g. MEX, USA). Users use alpha-3; recipients use alpha-2 — map accordingly.
male, female, or other, when provided.
male, female, other The individual's address. The response renests and renames the flat create-request fields: address_street → street_line_1, address_state → subdivision, address_zip_code → postal_code, address_city → city, address_country → country. Parse this nested shape — the flat address_* request fields do not round-trip.
Write-only in practice: accepted on create/update but currently NOT returned by GET — do not depend on reading it back.
Write-only in practice: accepted on create/update but currently NOT returned by GET — do not depend on reading it back.
Per-product eligibility, computed from the user's supplied fields against the product matrix — present on the create response and on the single-resource GET (GET /v1/users/{user_id}), even before verification. On the list (GET /v1/users), present only when the request passed include_eligibility=true; omitted otherwise. Each product carries eligible (false until the user reaches the product's minimum status, e.g. VERIFIED) and its own missing_fields. Verification flips eligible to true and clears missing_fields; it does not populate the array. A product that is eligible: false for a reason no field can clear carries unsupported_reason instead of missing_fields — verification will not flip it.
Map of product_code → outstanding field tokens, plus a general key with the deduplicated union across products. It is populated before verification too; the sole exception is that this top-level aggregate is omitted on the create response for verification_link-mode users or when there are zero gaps.
Per-subclient bank intent — which banks this subclient has declared it needs. Always present on GET /v1/users/{id}, including { "requested_banks": [] } when nothing is declared — never omitted there. On the list (GET /v1/users), present only when the request passed include_eligibility=true; omitted otherwise.
Whether a KYC/KYB verification job was enqueued on create.
Non-fatal issues (e.g. a document that failed to upload). Present only when non-empty.