Skip to main content

Submit KYC Details

Writes the applicant's details onto the customer's verification record. It does not change the status and does not start verification: request it when the details and documents are in.

This is a whole-applicant write, not a merge: every field lands on the record, and a field you leave out is cleared. Send the full set each time. Every field is optional here; Request Verification is where first_name, last_name, date_of_birth, identity_document.number and identity_document.type become required.

Takes a workspace-scoped API key or a dashboard session. An account-scoped key is refused with 401.

Replaces, with Open KYC Record, POST /api/v2/kyc/banking-verification/individual.

Authorization:

Every request is signed with your API key: a short-lived JWT, signed with your private key, sent in one header on /v3/* and /api/v2/* alike.

Headers:
Authorization: APIKey {SIGNED_JWT}

How to build and sign the JWT: Authentication.

Endpoint

PATCH

/v3/customers/{customer_id}/kyc

Path parameters​

ParameterTypeDescription
customer_idstring (cst_…)Required. The customer. Its record must be open and pending or needs_update.

Request Body Sample​

{
"email": "samantha@example.com",
"first_name": "Samantha",
"last_name": "Reyes",
"phone": "+14155550123",
"date_of_birth": "1990-04-12",
"nationality": "US",
"address": {
"line1": "742 Evergreen Terrace",
"line2": "Apt 2",
"city": "Springfield",
"state": "OR",
"postal_code": "97477",
"country": "US"
},
"identity_document": {
"number": "X1234567",
"type": "passport",
"issue_date": "2018-03-01",
"expiry_date": "2028-03-01",
"country_of_issue": "US"
},
"occupation": "Engineer",
"employed_company_name": "Northwind Traders",
"employed_job_title": "Staff Engineer",
"source_of_funds": ["salary"]
}

Request Body Schema​

FieldTypeDescription
emailstringA valid email.
first_namestringAt most 255 characters.
last_namestringAt most 255 characters.
phonestringE.164, e.g. +14155550123.
date_of_birthstringYYYY-MM-DD.
nationalitystringISO 3166-1 alpha-2, e.g. US.
addressobjectThe residential address. Either omitted, or with line1, city, state, postal_code and country all filled in.
address.line1stringAt most 255 characters.
address.line2stringOptional. At most 255 characters.
address.citystringAt most 100 characters.
address.statestringAt most 100 characters.
address.postal_codestringA valid postal code for address.country.
address.countrystringISO 3166-1 alpha-2.
identity_documentobjectThe government identity document. Either omitted, or with at least number and type.
identity_document.numberstring2 to 20 characters.
identity_document.typestringpassport, driver_license, national_id, ssn, itin, ein or other.
identity_document.issue_datestringOptional. YYYY-MM-DD.
identity_document.expiry_datestringOptional. YYYY-MM-DD.
identity_document.country_of_issuestringOptional. ISO 3166-1 alpha-2.
occupationstringAt most 255 characters.
employed_company_namestringAt most 255 characters.
employed_job_titlestringAt most 255 characters.
source_of_fundsarray of stringAny of salary, savings, investments, loans, self_employed, other.

Response Sample​

The record with the details written. ready turns true once the fields a provider needs are in.

{
"id": "kyc_01k8x494z0e2escqpt6bde8hag",
"customer_id": "cst_01k8x40x9gfx6sv8a99hswy9bd",
"type": "banking",
"status": "pending",
"status_reason": "verification record created",
"email": "samantha@example.com",
"first_name": "Samantha",
"last_name": "Reyes",
"phone": "+14155550123",
"date_of_birth": "1990-04-12",
"nationality": "US",
"address": {
"line1": "742 Evergreen Terrace",
"line2": "Apt 2",
"city": "Springfield",
"state": "OR",
"postal_code": "97477",
"country": "US"
},
"identity_document": {
"number": "X1234567",
"type": "passport",
"issue_date": "2018-03-01",
"expiry_date": "2028-03-01",
"country_of_issue": "US"
},
"occupation": "Engineer",
"employed_company_name": "Northwind Traders",
"employed_job_title": "Staff Engineer",
"source_of_funds": ["salary"],
"ready": true,
"event_history": [
{
"status": "pending",
"status_reason": "verification record created",
"date": "2025-10-31T12:36:04Z"
}
],
"created_at": "2025-10-31T12:36:04Z",
"updated_at": "2025-10-31T12:36:04Z"
}

Response Schema​

See Open KYC Record.

Errors​

StatusmessageWhen
400invalid_addressaddress is partly filled in: line1, city, state or postal_code is missing.
400invalid_countryaddress is filled in without a country.
400invalid_id_numberidentity_document is filled in without a number.
400invalid_id_document_typeidentity_document has a number but no type.
400failed to parse requestThe body is not valid JSON, identity_document.type or a source_of_funds entry is not one of its values, or customer_id is not a cst_… TypeID.
401unauthorizedMissing or invalid signature, or the caller is an account-scoped key or a customer session.
403forbiddenA dashboard member whose role does not allow this. A workspace-scoped key always may.
404kyc_not_foundThe customer has no record: open one first.
409kyc_verification_in_flightThe record is in_review: the provider is looking at it.
409kyc_already_approvedThe record is approved.
409kyc_rejectedThe record is rejected.
422Validation failedA value breaks its format or length (email, phone, a date, a country, a postal code, an id number); details names it.

Coming from v2​

v2 (POST /api/v2/kyc/banking-verification/individual)v3
accountId in the bodycustomer_id in the path, on a record opened first
dateOfBirth, phone, address required hereall optional here; required fields are checked at Request Verification
a left-out field keeps its old valuea left-out field is cleared
documentId.idNumber, idDocumentType, idIssueDate, idExpiryDate, idCountryOfIssueidentity_document.number, type, issue_date, expiry_date, country_of_issue
documentId.nationalitynationality (top-level)
address.address1, address2, postalCodeaddress.line1, line2, postal_code
response { accountId, verificationUrl }the whole record; no verification link
noneemail, first_name, last_name, occupation, employed_company_name, employed_job_title, source_of_funds

Support and Resources​

If you need assistance or have any questions, our support team is here to help. You can contact our support team at support@blockwyre.com.

Stay Updated​

Stay up-to-date with the latest news, updates, and features from BlockWyre by following us on social media:

We are excited to have you on board and look forward to seeing how you leverage BlockWyre's powerful tools to enhance your financial operations. Happy integrating!