Skip to main content
POST
Changed in this version.

Authorizations

Authorization
string
header
required

Access token from POST /auth (the data.access_token value).

x-api-key
string
header
required

API key issued by Kira. Required on every request, including /auth.

Headers

X-Api-Version
string

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.

Example:

"2026-04-14"

Idempotency-Key
string<uuid>
required
Example:

"{{idempotency_key}}"

Body

application/json
type
enum<string>
required

Discriminator: individual (KYC) or business (KYB). Selects the required fields and which enum sets apply.

Available options:
individual
first_name
string
required

Given name. Required for individuals.

Minimum string length: 1
last_name
string
required

Family name. Required for individuals.

Minimum string length: 1
email
string<email>
required

Email address. Required for all users.

verification_mode
enum<string>

automatic (default) runs verification on create and emits user.* webhooks. verification_link returns a hosted KYC URL and strips every other field.

Available options:
automatic,
verification_link
capabilities
object

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.

redirect_uri
string<uri>

Where the hosted verification form redirects after completion. Used only with verification_mode: verification_link.

language
enum<string>

Locale for the hosted verification form: en or es. Used only with verification_mode: verification_link.

Available options:
en,
es
middle_name
string

Middle name.

phone
string

Phone in E.164 format, e.g. +14155551234. Spaces and dashes are sanitized before validation.

birth_date
string

Date of birth, YYYY-MM-DD. The user must be at least 18 years old.

Pattern: ^\d{4}-\d{2}-\d{2}$
nationality
string

Nationality as an ISO 3166-1 alpha-3 code (e.g. USA, MEX).

Required string length: 3
gender
enum<string>

One of male, female, other.

Available options:
male,
female,
other
status
enum<string>
default:active

Ignored on create — new users always start as CREATED.

Available options:
active,
inactive,
suspended
external_id
string

Your own reference ID for this user (stored as partnerUserId).

residential_address
object

Structured residential address (V1). You may instead use the flat address_* fields.

address_street
string

Street address (≤ 70 chars). Flat (V2) address form.

Maximum string length: 70
address_street_2
string

Apartment, suite, or unit (≤ 70 chars).

Maximum string length: 70
address_city
string

City.

address_state
string

State or province (US state for USA users).

address_zip_code
string

ZIP or postal code.

address_country
string

Country as ISO alpha-3. With type, selects the user category; users in restricted countries are not VA-eligible.

identifying_information
object[]

Tax IDs and government documents. Each entry requires type and issuing_country.

pep_status
boolean

Whether the user is a Politically Exposed Person.

tos_accepted_version
string

Terms-of-service version the user accepted. Kira stamps tos_accepted_at on receipt.

source_of_funds
enum<string>

Origin of funds. The accepted enum differs for individuals vs businesses.

Available options:
salary,
self_employment_income,
investment_proceeds,
savings_inheritance_gift,
gifts,
inheritance,
investments_loans,
pension_retirement,
sale_of_assets_real_estate,
savings,
someone_elses_funds
account_purpose
enum<string>

Intended account use. 14 values for individuals, 8 (different) values for businesses.

Available options:
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
expected_monthly_payments
string

Free-form string. Prefer expected_monthly_volume + expected_transaction_count for bucketed values.

expected_monthly_volume
enum<string>

Expected monthly volume bucket. Buckets differ for individuals vs businesses.

Available options:
less_than_10000,
10000_to_49999,
50000_to_199999,
200000_to_999999,
1000000_or_more
expected_transaction_count
enum<string>

Expected monthly transaction-count bucket. Buckets differ for individuals vs businesses.

Available options:
1_to_10,
11_to_50,
51_to_200,
more_than_200
employment_status
enum<string>

One of employed, self_employed, unemployed, retired, student.

Available options:
employed,
self_employed,
unemployed,
retired,
student
occupation
string

Occupation. Required (for eligibility) when employment_status = employed.

current_employer
string

Employer. Required (for eligibility) when employment_status = employed.

income_source
string

Income source. Required (for eligibility) unless employment_status = employed.

documents
object[]

Legacy flat document array. Prefer identifying_information[].documents[].

immigration_status
string

Exact string, e.g. U.S. Citizen, Permanent U.S. Resident, Non-Resident of U.S. Required for international individuals.

government_document_type
string
additional_info
object

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).

metadata
object

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.

kyc_id
string

Optional partner-supplied KYC session ID.

Response

Created.

The created user plus create-time verification details.

id
string<uuid>
required

User UUID.

type
enum<string>
required

individual or business.

Available options:
individual,
business
email
string<email>
required

Email address.

status
string
required

Lifecycle status: CREATED, VERIFYING, REVIEW, VERIFIED, or REJECTED. Gate product readiness on this, not on verification_status.

created_at
string<date-time>
required

Creation timestamp (ISO 8601).

updated_at
string<date-time>
required

Last-update timestamp (ISO 8601).

verification_status
enum<string>
default:unverified

KYC/KYB status: unverified, started, in_review, verified, rejected, or needs_action.

Available options:
unverified,
started,
in_review,
verified,
rejected,
needs_action
verification_mode
string

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.

Available options:
deferred,
failed
metadata
object

Your key-value pairs, plus any client-level default metadata configured for your account (merged at create time; your request keys win on conflict).

first_name
string

Given name (individual users).

last_name
string

Family name (individual users).

middle_name
string

Middle name (individual users), when provided.

phone
string

Contact phone in E.164 form (e.g. +525512345678).

birth_date
string

Date of birth, YYYY-MM-DD (individual users).

nationality
string

Nationality as an ISO alpha-3 country code (e.g. MEX, USA). Users use alpha-3; recipients use alpha-2 — map accordingly.

gender
enum<string>

male, female, or other, when provided.

Available options:
male,
female,
other
residential_address
object

The individual's address. The response renests and renames the flat create-request fields: address_streetstreet_line_1, address_statesubdivision, address_zip_codepostal_code, address_citycity, address_countrycountry. Parse this nested shape — the flat address_* request fields do not round-trip.

formation_country
string
company_name
string
business_type
string
business_trade_name
string
business_description
string
business_industry
string[]
registered_address
object
physical_address
object
has_material_intermediary_ownership
boolean
account_purpose
string

Write-only in practice: accepted on create/update but currently NOT returned by GET — do not depend on reading it back.

source_of_funds
string

Write-only in practice: accepted on create/update but currently NOT returned by GET — do not depend on reading it back.

eligible_products
object[]

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.

missing_fields
object

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.

capabilities
object

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.

verification_triggered
boolean

Whether a KYC/KYB verification job was enqueued on create.

warnings
string[]

Non-fatal issues (e.g. a document that failed to upload). Present only when non-empty.