Skip to main content
Every field of the KYB document, with its accepted values. The document is the body of PUT /dapi/v1/client/kyb and the document block of GET /dapi/v1/client/kyb; both use the same shape, and both take the client id in X-Hevn-Account rather than in a path. Onboarding is the flow that fills it. “Required” below means completion is refused without it — the field appears in missing[] until it is set. Everything under “Optional detail” is accepted, never demanded by the gate, and routinely asked for by a reviewer instead: sending what you already hold is how an RFI is avoided rather than answered.

company

company — optional detail

None of these appears in missing[]. All of them are read by a reviewer.

identityDocuments

Both company and people[] take this array. It carries the metadata off an identity document; the file itself is still a POST /dapi/v1/documents upload filed into a documents[] slot, and neither replaces the other.

company.address and people[].address

Both addresses take the same object. Four of its fields are required; state and addressLine2 are not. Write state as the ISO 3166-2 subdivision including its country prefix — US-IL, not IL and not Illinois.

people[]

At least one person is required: a document with an empty roster reports people as missing. Give each person at least one role — ownershipPercentage, hasControl, isDirector or isSigner — or they are in the graph without being anything in it. These six are optional and, like the company’s, are read rather than demanded:

Enums

Send one of the listed members. An unlisted value is refused at the boundary with 422 invalid_enum_value, carrying details.field and the accepted set in details.allowed — nothing is written.
llc · corporation · s_corporation · c_corporation · partnership · limited_partnership · sole_proprietorship · nonprofit · trust · cooperative · dao · foundation · other
technology · finance · healthcare · retail · e_commerce · manufacturing · real_estate · consulting · hospitality · education · transportation · entertainment · agriculture · construction · professional_services · crypto_web3 · other
business_revenue · investment · loan · personal_savings · third_party_funds · grant · other
operations · payroll · vendor_payments · investment · treasury_management · international_transfers · other
officer · employer · accountant · agent
protocol · exchange · investment · lender · market_maker · saas · miner
retail · commercial · government · other
all_operating_expenses · most · some · minimal
<10 · 10-50 · 50-200 · 200-1,000 · 1,000+These members are not identifiers. Send them exactly as printed, punctuation included.
MONEY_SERVICES · LENDING_BANKING · OTC_FX_CRYPTO_BROKERAGE · HOLD_CLIENT_FUNDS · INVESTMENT_SERVICES · SAFE_DEPOSIT_BOX · PRECIOUS_METALS_STONES_JEWELRY · NICOTINE_TOBACCO · MARIJUANA · PHARMACEUTICALS · THIRD_PARTY_PAYMENT_PROCESSING · ADULT_ENTERTAINMENT · WEAPONS_FIREARMS_EXPLOSIVES · GAMBLINGThe one upper-case enum in the API.
passport · id_card · drivers_license · driver_license · residence_permit · government_id · state_or_provincial_id · visa
Two of these break the snake_case rule the rest of the API keeps: highRiskActivities is upper-case and txPerMonth carries digits and punctuation. Match them character for character.

Document slots

A slot is a named place a document goes. You upload a file, get a doc_… id back, and file it into a slot with {"slot": "...", "uploadId": "doc_..."} — on the document’s own documents[] for company papers, on a person’s documents[] for theirs. Every client needs these five on the company: The jurisdiction adds to that list: And every person needs one: Other slots exist and are accepted — passport_front, national_id, articles_of_association, bank_statement, ubo_declaration, power_of_attorney and more — and a reviewer may ask for one in an RFI. Send an unknown slot and the write answers 422 document_type_unsupported with the full accepted list in details.allowed.

Reading a missing[] path

Every entry is a path into the document you sent. Fix it there and write again. The index in people[0] is the person’s position in the people array of GET /dapi/v1/client/kyb, not the order you happened to send. Read the document back and index into that.

Complex ownership

The flat document models one company owned directly by people; hasIntermediateEntityOwnership is where you declare that it does not. A chain with holding companies in it is written through HEVN’s entity-graph routes, which are outside this API and available on request. The two models coexist: the flat document only ever replaces the people it created, and never touches an entity added another way — a write that would drop one answers 409 kyb_roster_conflict with details.entityIds. Gaps belonging to those entities are the graph.entities.<uuid>.<field> rows above.

Next: Errors

The envelope, and every slug the API can answer with.