Skip to main content
A client is a customer’s account that your integrator account acts for, one per customer. Read it with GET /dapi/v1/client, then verify a business client with PUT /dapi/v1/client/kyb. Both routes return the cl_… id. Send it as X-Hevn-Account to read the client with GET /dapi/v1/client.
POST /dapi/v1/clients/link 200
The fields are described on Connect an existing account and Create a client. A field with no value is omitted. A client created with POST /dapi/v1/clients has no wallet at HEVN, so it has no baseSmartWallet. A linked individual has no KYB progress. Poll verifiedAt after they verify their identity. POST /dapi/v1/clients creates companies. Which routes take X-Hevn-Account is covered in Acting as a client. For who signs a client’s payouts, see Who can spend.

Statuses

A linked client is usually ready when you exchange the code. HEVN reviews a POST /dapi/v1/clients request unless your integrator agreement waives the review, so a created client can stay provisioning for longer. Until its account exists, routes that take the new id, other than GET /dapi/v1/client, return 404 account_not_found. GET /dapi/v1/client returns the client in each status, and an unknown id returns 404 client_not_found. poll_until is defined in HTTP client.

List clients

GET /dapi/v1/clients lists your clients: the accounts linked to you, the clients you created and the creation requests still open. Use it to recover a lost id. Filters are on List clients, and paging follows Pagination.

Update phone and address

PATCH /dapi/v1/client writes the phone and the postal address. The fields are on Update a client profile.
Changing a locked field returns 409 profile_locked with details.fields.

Phone numbers

A company’s virtual account requires a phone number. Either phone satisfies the check: company.phone in the KYB document, or the account phone written with PATCH /dapi/v1/client.

Write the document

A business client is verified from one KYB document that you write, submit for review and correct on request. Write it with PUT /dapi/v1/client/kyb until the response returns ready: true. Then call POST /dapi/v1/client/kyb/complete. The KYB and document routes are client-scoped, so send X-Hevn-Account. The flow is the same for a linked business and for a created company. An individual client verifies in the sign-in window. The document has the sections company, people[] and documents[]. Field types, enum values and slot names are on Provide applicant information.
1

Write the company

The example has the required fields. company.legalName must be unique across HEVN. A US taxId in a format other than XX-XXXXXXX counts as missing.Also send the optional fields you hold, such as identityDocuments, operatingCountries, highRiskActivities, hasPep, isRegulated and the per-method volume split. Optional fields are not listed in missing[], but a reviewer often asks for them in an RFI.
Response 200
ready: false means the write succeeded. Read each missing[] entry as described in Missing paths.
2

Add the people

people[] lists the client’s owners, directors and signers. Give each person a stable key and at least one role: ownershipPercentage, hasControl, isDirector or isSigner.
Response 200
Sending people replaces the roster you created, so a person you omit is removed. "people": [] removes them all. For a holding company in the chain, see Complex ownership.
3

Upload the files

Upload each file with POST /dapi/v1/documents, base64-encoded in content, with the target slot in slot.
Responses and limits are on Upload a document. File each returned id into a slot on the next PUT. Company files go in the top-level documents[] and a person’s files in that person’s documents[].
An unknown slot returns 422 document_type_unsupported with details.field. An uploadId of another client returns 404 document_not_found with details.uploadId.Required slots:A reviewer can request any other slot in an RFI.
4

Complete the submission

Call POST /dapi/v1/client/kyb/complete with no body. It is the only call that starts a review.
Response 201
Replays and refusals are on Complete the verification submission.

Missing paths

Each missing[] entry is a path into the document. Set the value at that path and write again. The index in people[0] is the position in document.people[] of GET /dapi/v1/client/kyb. It can differ from the order you sent.

Complex ownership

The flat document describes one company held by people. Set company.hasIntermediateEntityOwnership to true when a holding company stands in the chain. Write such a chain through HEVN’s entity-graph routes. They are outside this API and available on request. A flat write leaves entities added through those routes in place. A write that would remove one returns 409 kyb_roster_conflict with details.entityIds.

Track the application

GET /dapi/v1/client/kyb returns readiness, the application if one is filed, and the stored document. Poll it as described in polling.
In the sandbox, set the status with POST /dapi/v1/sandbox/kyb/status.

Answer an RFI

  1. Read application.comment.
  2. Correct the document with PUT /dapi/v1/client/kyb. To replace a file, file a new upload into the same slot. To correct a person, send that person’s key and the new value.
  3. Call POST /dapi/v1/client/kyb/complete again. attemptNo increments, kybStatus returns to pending, and the next review replaces comment.
When the reviewer could not read a value on a file, comment names the file and the value. Upload a legible copy, or write the value onto the upload.

Fill a document’s fields by hand

Call PUT /dapi/v1/documents/{documentId}/content with the upload id from the document block of GET /dapi/v1/client/kyb. Company uploads are in documents[] and a person’s are in people[].documents[].
Key format and refusals are on Fill the typed fields read off a document.

Next: Virtual accounts