Skip to main content

KYC API

B2B Know Your Customer (KYC) verification for company accounts and identity validation.

Overview​

The KYC API provides:

  • Company Verification — Business entity validation
  • Document Upload — Identity and business documents
  • Shopify Integration — Sync with Shopify B2B companies
  • Status Tracking — Real-time verification status

Base URL​

https://api.huntrecht.com/api/v1/kyc

Required Scopes​

ScopePermission
kyc:readView KYC status
kyc:writeSubmit KYC documents

KYC Status Levels​

StatusDescriptionAccess Level
pendingInitial stateLimited
documents_submittedDocuments uploadedLimited
in_reviewUnder reviewFull
verifiedApprovedFull
rejectedDocuments rejectedLimited

Get KYC Status​

GET /kyc/status

Retrieve current KYC verification status for a customer.

Query Parameters​

ParameterTypeRequiredDescription
customer_idstringYesCustomer ID

Example Request​

kyc = client.kyc.get_status(customer_id="cust_abc123")

Example Response​

{
"data": {
"customer_id": "cust_abc123",
"status": "in_review",
"level": "company_verified",
"steps": [
{
"step": "email_verified",
"status": "completed",
"completed_at": "2026-01-05T10:00:00Z"
},
{
"step": "company_info",
"status": "completed",
"completed_at": "2026-01-05T10:05:00Z"
},
{
"step": "business_documents",
"status": "completed",
"completed_at": "2026-01-06T14:00:00Z"
},
{
"step": "identity_verification",
"status": "in_progress",
"started_at": "2026-01-07T09:00:00Z"
},
{
"step": "bank_verification",
"status": "pending",
"started_at": null
}
],
"shopify_company_id": "gid://shopify/Company/123",
"submitted_at": "2026-01-07T09:00:00Z",
"reviewed_at": null,
"expires_at": "2026-07-07T00:00:00Z"
}
}

Submit Company Information​

POST /kyc/company

Submit company details for verification.

Request Body​

FieldTypeRequiredDescription
customer_idstringYesCustomer ID
company_namestringYesLegal company name
tax_idstringYesTax ID (EIN/VAT)
business_typestringYesLLC, Corp, Partnership, etc.
date_of_incorporationstringYesISO 8601 date
addressobjectYesRegistered address
websitestringNoCompany website
duns_numberstringNoD-U-N-S number

Example Request​

kyc = client.kyc.submit_company({
"customer_id": "cust_abc123",
"company_name": "Acme Corporation",
"tax_id": "12-3456789",
"business_type": "LLC",
"date_of_incorporation": "2018-03-15",
"address": {
"street": "123 Business Ave",
"city": "Commerce City",
"state": "CA",
"postal_code": "90210",
"country": "US"
},
"website": "https://acme.com"
})

Upload Documents​

POST /kyc/documents

Upload verification documents.

Supported Document Types​

TypeDescriptionRequired
business_licenseBusiness registration certificateYes
tax_certificateTax registration certificateYes
owner_idGovernment-issued IDYes
bank_statementRecent bank statementYes
financial_statementFinancial statementsNo

Request Format​

import requests

# Upload business license
files = {
'document': ('business_license.pdf', open('license.pdf', 'rb'), 'application/pdf')
}

data = {
'customer_id': 'cust_abc123',
'document_type': 'business_license'
}

response = requests.post(
"https://api.huntrecht.com/api/v1/kyc/documents",
files=files,
data=data,
headers={"Authorization": f"Bearer {access_token}"}
)

result = response.json()

Example Response​

{
"data": {
"document_id": "doc_abc123",
"customer_id": "cust_abc123",
"document_type": "business_license",
"status": "pending_review",
"uploaded_at": "2026-01-10T14:00:00Z",
"reviewed_at": null,
"expires_at": "2026-07-10T00:00:00Z"
}
}

Identity Verification​

POST /kyc/identity

Submit identity verification for company contacts.

Request Body​

FieldTypeRequiredDescription
customer_idstringYesCustomer ID
first_namestringYesFirst name
last_namestringYesLast name
date_of_birthstringYesISO 8601 date
nationalitystringYesCountry code
document_typestringYespassport, drivers_license, national_id
document_numberstringYesDocument number
document_expirystringYesDocument expiry date

Example Request​

kyc = client.kyc.submit_identity({
"customer_id": "cust_abc123",
"first_name": "John",
"last_name": "Buyer",
"date_of_birth": "1985-06-15",
"nationality": "US",
"document_type": "passport",
"document_number": "123456789",
"document_expiry": "2030-06-15"
})

Bank Account Verification​

POST /kyc/bank

Link and verify a bank account.

Request Body​

FieldTypeRequiredDescription
customer_idstringYesCustomer ID
bank_namestringYesBank name
account_namestringYesAccount holder name
account_numberstringYesAccount number (encrypted)
routing_numberstringYesRouting number
account_typestringYeschecking, savings

Verification Methods​

MethodDescriptionTimeline
micro_depositSmall deposits verification1-2 business days
plaidInstant Plaid verificationInstant
manualUpload bank statement1-3 business days
kyc = client.kyc.link_bank({
"customer_id": "cust_abc123",
"bank_name": "First National Bank",
"account_name": "Acme Corporation",
"account_number": "XXXX1234",
"routing_number": "021000021",
"account_type": "checking",
"verification_method": "plaid"
})

Shopify B2B Company Sync​

The KYC process automatically syncs with Shopify B2B companies:

sequenceDiagram
participant C as Customer
participant H as Huntrecht KYC
participant S as Shopify B2B

C->>H: Submit KYC information
H->>S: Create/Update Company
H->>H: Verify documents
H->>S: Sync verification status
S-->>C: Company verified in Shopify

Webhook Events​

EventDescription
kyc.submittedKYC documents submitted
kyc.in_reviewKYC under review
kyc.verifiedKYC approved
kyc.rejectedKYC denied
kyc.expiredKYC verification expired

Rejected KYC Resolution​

If KYC is rejected, the response includes reasons:

{
"data": {
"status": "rejected",
"rejection_reasons": [
{
"field": "business_license",
"reason": "Document expired",
"action": "Upload current valid document"
},
{
"field": "owner_id",
"reason": "Photo unclear",
"action": "Upload higher quality image"
}
],
"resubmit_deadline": "2026-01-25T00:00:00Z"
}
}

Error Codes​

CodeDescription
CUSTOMER_NOT_FOUNDCustomer ID not found
DOCUMENT_INVALIDInvalid document format
DOCUMENT_EXPIREDDocument has expired
KYC_ALREADY_VERIFIEDCustomer already verified
VERIFICATION_PENDINGAnother verification in progress

Next Steps​