Skip to content

KYC

INFO

This documentation is work in progress and subject to change. If you have any questions or feedback, please reach out to us via Support.

This object represents KYC information of your HK 🇭🇰 customer.

Supported Countries

Currently Zetl Embedded API only supports Hong Kong 🇭🇰 and Malaysia 🇲🇾 We're working on expanding our API to other countries!

KYC Object

PropertyTypeDescription
customer_idstringZetl-generated customer ID
typestring | "HK"KYC country type
statusstring (enum)KYC status. Possible values: incomplete, missing_supporting_documents, complete
legal_namestringLegal name of the company
registered_addressAddressRegistered address of the company
operating_addressAddress?Operating address of the company
websitestring?Company website
business_registration_numberstringBusiness registration number
date_of_incorporationstringDate of incorporation
directors_identity_numberarray of Director IdentityIdentity number of directors
shareholders_identity_numberarray of Shareholder Identity)Identity number of major shareholders with ≥25% ownership of company shares
corporate_entities_numbernumericNumber of related corporate entities (0 if there are no related corporate entities)
isicstringCompany ISIC code
is_sensitive_businessboolean? | nullFlag to show whether company runs a sensitive business
has_complex_structureboolean? | nullFlag to show whether company has a complex structure
has_namescan_hitsboolean? | nullFlag to show whether director has namescan screening hits
dow_jones_company_screening_resultobject?Dow Jones company screening result. Optional (Partner-supplied information in any valid JSON key-value format)
dow_jones_batch_screening_resultobject?Dow Jones batch screening result. Optional (Partner-supplied information in any valid JSON key-value format)
supporting_documentsobject (See: Supporting Documents)Status of each supporting documents available for the KYC type
created_atstringResource creation ISO datetime string (UTC)
updated_atstringResource last modified ISO datetime string (UTC)

Address Object

PropertyTypeDescription
address_line_1stringFirst line address information
address_line_2string?Second line address information
address_line_3string?Third line address information
postal_codestringPostal code
citystringCity
countrystringCountry

Director Identity Object

PropertyTypeDescription
typestring (enum)Identity type. Currently supported type: national_id, passport, driver_license
idstringIdentity number

Shareholder Identity Object

PropertyTypeDescription
company_legal_namestringCompany legal name where this shareholder belongs to, use the same value with legal_name for shareholder that belongs to the current company.
typestring (enum)Identity type. Currently supported type: national_id, passport, driver_license
idstringIdentity number

Supporting Documents Object

This property list the status of each supporting documents related with the KYC resource. The key represents the name of the type of the document with its value represents the status of the supporting document.

The possible status values of each supporting documents are: missing, not_uploaded, uploaded.

You can see list of available supporting documents for HK KYC below:

Document TypeDescription
business_registration_certificateRequired. Business registration certificate
directors_identityRequired. Director's identity documents
directors_address_proofRequired. Director's address proof documents
shareholders_identityRequired. Shareholder's identity documents
shareholders_address_proofRequired. Shareholder's address proof documents
company_structure_chartRequired. Company structure chart
litigation_historyOptional. Litigation history document
nnc1Required. Incorporation Form
nar1Required. Annual Return Form

KYC Object Example

json
{
  "customer_id": "b8a1dfe0-c575-4d5c-9840-2fca96b5d96a",
  "type": "HK",
  "status": "missing_supporting_documents",
  "legal_name": "Foo Bar Ltd",
  "registered_address": {
    "address_line_1": "123, Baz Qux Street",
    "address_line_2": "",
    "address_line_3": "",
    "postal_code": "999077",
    "city": "Wan Chai",
    "country": "Hong Kong"
  },
  "operating_address": {
    "address_line_1": "123, Baz Qux Street",
    "address_line_2": "",
    "address_line_3": "",
    "postal_code": "999077",
    "city": "Wan Chai",
    "country": "Hong Kong"
  },
  "website": "https://www.example.com",
  "business_registration_number": "12345678A",
  "date_of_incorporation": "2019-01-01",
  "directors_identity_number": [
    {
      "type": "national_id",
      "id": "Z1234567"
    }
  ],
  "shareholders_identity_number": [
    {
      "company_legal_name": "Foo Bar Ltd",
      "type": "national_id",
      "id": "V1234567"
    },
    {
      "company_legal_name": "Foo Bar Parent Ltd",
      "type": "national_id",
      "id": "X1234567"
    }
  ],
  "corporate_entities_number": 0,
  "isic": "7371",
  "is_sensitive_business": null,
  "has_complex_structure": null,
  "namescan_result": null,
  "dow_jones_company_screening_result": {},
  "dow_jones_batch_screening_result": {},
  "supporting_documents": {
    "company_structure_chart": "missing",
    "business_registration_certificate": "missing",
    "nnc1": "missing",
    "nar1": "missing",
    "directors_identity": "missing",
    "directors_address_proof": "missing",
    "shareholders_identity": "missing",
    "shareholders_address_proof": "missing",
    "litigation_history": "not_uploaded"
  },
  "created_at": "2023-12-01T00:01:00Z",
  "updated_at": "2023-12-01T00:01:00Z"
}

Retrieve a KYC resource

GET   /v1/kyc/hk/{customer_id}

https://api.zetl.com/v1/kyc/hk/{customer_id}

Get KYC details of your customer.

Response Properties

Refer to KYC object

Possible Error

See Handling Error for generic possible errors.

Update a KYC

PUT   /v1/kyc/hk/{customer_id}

https://api.zetl.com/v1/kyc/hk/{customer_id}

Update KYC information for your HK customer. This endpoint expect you to fully send the complete KYC properties with its updated values.

Request Properties

PropertyTypeDescription
customer_idstringZetl-generated customer ID
legal_namestringLegal name of the company
registered_addressAddressRegistered address of the company
operating_addressAddress?Operating address of the company
websitestring?Company website
business_registration_numberstringBusiness registration number
date_of_incorporationstringDate of incorporation
directors_identity_numberarray of Director IdentityIdentity number of directors
shareholders_identity_numberarray of Shareholder Identity)Identity number of major shareholders with ≥25% ownership of company shares
corporate_entities_numbernumericNumber of related corporate entities (0 if there are no related corporate entities)
isicstringCompany ISIC code
is_sensitive_businessboolean? | nullFlag to show whether company runs a sensitive business
has_complex_structureboolean? | nullFlag to show whether company has a complex structure
has_namescan_hitsboolean? | nullFlag to show whether director has namescan screening hits
dow_jones_company_screening_resultobject?Dow Jones company screening result. Optional (Partner-supplied information in any valid JSON key-value format)
dow_jones_batch_screening_resultobject?Dow Jones batch screening result. Optional (Partner-supplied information in any valid JSON key-value format)

Request Example

http
PUT /v1/kyc/hk/b8a1dfe0-c575-4d5c-9840-2fca96b5d96a HTTP/1.1
Host: api.zetl.com
Content-Type: application/json
Authorization: Bearer <your-private-key>

{
  "legal_name": "Foo Bar Ltd",
  "registered_address": {
    "address_line_1": "123, Baz Qux Street",
    "address_line_2": "",
    "address_line_3": "",
    "postal_code": "999077",
    "city": "Wan Chai",
    "country": "Hong Kong"
  },
  "operating_address": {
    "address_line_1": "123, Baz Qux Street",
    "address_line_2": "",
    "postal_code": "999077",
    "city": "Wan Chai",
    "country": "Hong Kong"
  },
  "website": "https://www.example.com",
  "business_registration_number": "12345678A",
  "date_of_incorporation": "2019-01-01",
  "directors_identity_number": [
    {
      "type": "national_id",
      "id": "Z1234567"
    }
  ],
  "shareholders_identity_number": [
    {
      "company_legal_name": "Foo Bar Ltd",
      "type": "national_id",
      "id": "V1234567"
    },
    {
      "company_legal_name": "Foo Bar Parent Ltd",
      "type": "national_id",
      "id": "X1234567"
    }
  ],
  "corporate_entities_number": 1,
  "isic": "7371"
}
shell
curl --request PUT \
  --url https://api.zetl.com/v1/kyc/hk/b8a1dfe0-c575-4d5c-9840-2fca96b5d96a \
  --header 'Authorization: Bearer <your-private-key>' \
  --header 'Content-Type: application/json' \
  --data '{
	"legal_name": "Foo Bar Ltd",
	"registered_address": {
    "address_line_1": "123, Baz Qux Street",
    "address_line_2": "",
    "address_line_3": "",
    "postal_code": "999077",
    "city": "Wan Chai",
    "country": "Hong Kong"
	},
	"operating_address": {
		"address_line_1": "123, Baz Qux Street",
    "address_line_2": "",
    "postal_code": "999077",
    "city": "Wan Chai",
    "country": "Hong Kong"
	},
  "website": "https://www.example.com",
  "business_registration_number": "12345678A",
  "date_of_incorporation": "2019-01-01",
  "directors_identity_number": [
		{ "type": "national_id", "id": "Z1234567" }
	],
  "shareholders_identity_number": [
    {
			"company_legal_name": "Foo Bar Ltd",
      "type": "national_id",
      "id": "V1234567"
    },
    {
			"company_legal_name": "Foo Bar Parent Ltd",
      "type": "national_id",
      "id": "X1234567"
    }
  ],
	"corporate_entities_number": 1,
  "isic": "7371"
}'

Response Properties

Refer to KYC object

Possible Error

See Handling Error for generic possible errors.

KYC Documents

Upload KYC Documents

POST   /v1/kyc/documents/{customer_id}

https://api.zetl.com/v1/kyc/documents/{customer_id}

Upload one type of supporting document for the customer KYC. (Max 10 documents per request). We limit 10 files per upload request and limit maximum request body to 100MB but each files can be of any size.

Unlike other endpoints which uses application/json as its content type, this endpoint require you to send multipart/form-data request.

Documents Upload Mechanism

A single upload request may only contain a single document type, which might consist of multiple files, and should always be uploaded together in a single request.

For example, you should upload director_identity documents for several people in a single request (preferably in the same order as directors_identity_number information).

Uploading documents will overwrite any existing documents of the same document type that might have been previously uploaded before.

Request Body

The endpoint expect request using multipart/form-data body with the following form parts:

PartTypeDescription
metadataobjectMetadata of the upload request. See Metadata Part for more details.
Regex:
^file[1-9]?$
fileFile(s) to be uploaded, at least one file, up to 10 files (file, file1, file2, ...., file9), with NO duplicating field name should be present.

Metadata Part

The metadata of the upload request with the following properties:

PropertyTypeDescription
typestringType of the uploaded document(s).
See Supporting Documents Object to check available document types.
filesobjectMetadata of the uploaded file(s), corresponding the uploaded file(s).
See Files Metadata Field for more details.

Files Metadata Property

The files property value contains request's uploaded files metadata that's represented as JSON object which contains keys that corresponds to the uploaded file(s) part name in the same request matching that match regex rule ^file[1-9]?$ (Ex: file, file1, file2, ...., file9).

NO duplicating part name should be present. The value of each key is an object with the following properties:

PropertyTypeDescription
filenamestringFilename of the uploaded file (without extension, we are going to append the extension ourselves based on mime_type key sent).
mime_typestringMime type of the uploaded file.
hashstringSHA-256 hash result of the uploaded file content.

Supported Mime Types

Currently, we only support the following types:

  • image/jpeg
  • image/png
  • application/pdf
Request Example
http
POST /v1/kyc/documents/b8a1dfe0-c575-4d5c-9840-2fca96b5d96a HTTP/1.1
Host: api.zetl.com
Authorization: Bearer <your-private-key>
Content-Type: multipart/form-data; boundary=------WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="metadata"

{"type": "shareholders_address_proof", "files": {"file": {"filename": "ShareholderAddressProof", "hash": "046a9aaa83711158c3c4afa585a30be3bee8a34231ee72caac625faef48b4abe", "mime_type": "image/png"}, "file1": {"filename": "ShareholderAddressProof1", "hash": "146a9aaa83711158c3c4afa585a30be3bee8a34231ee72caac625faef48b4abf", "mime_type": "image/png"}}}
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="ShareholderAddressProof.png"
Content-Type: image/png

<binary data>
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file1"; filename="ShareholderAddressProof1.png"
Content-Type: image/png

<binary data>
------WebKitFormBoundary7MA4YWxkTrZu0gW--
shell
curl --request \
  --url https://api.zetl.com/v1/kyc/documents/b8a1dfe0-c575-4d5c-9840-2fca96b5d96a \
  --header 'Authorization: Bearer <your-private-key>' \
  --form 'metadata={"type": "shareholders_address_proof", "files": {"file": {"filename": "ShareholderAddressProof", "hash": "046a9aaa83711158c3c4afa585a30be3bee8a34231ee72caac625faef48b4abe", "mime_type": "image/png"}, "file1": {"filename": "ShareholderAddressProof1", "hash": "146a9aaa83711158c3c4afa585a30be3bee8a34231ee72caac625faef48b4abf", "mime_type": "image/png"}}}' \
  --form 'file=@ShareholderAddressProof.png;type=image/png' \
  --form 'file1=@ShareholderAddressProof1.png;type=image/png'

WARNING

Do not manually set Content-Type header, as it might be missing required boundary value. Let your request package/library automatically detect the content type so that it can automatically generate properly formed Content-Type header.

We also highly recommend to put required metadata field part first on top of the request body before placing any binary data.

Response Example
json
{
  "type": "shareholder_address_proof",
  "files": [
    {
      "document_id": "47a62de6-0b5f-4db1-9350-887238641066",
      "filename": "2023-04-04T204749.204Z-ShareholderAddressProof.png",
      "mime_type": "image/png"
    },
    {
      "document_id": "070da6a1-2d95-4967-ae75-e278c813e61d",
      "filename": "2023-04-04T204749.204Z-ShareholderAddressProof1.png",
      "mime_type": "image/png"
    }
  ]
}

Possible Error

See Handling Error for generic possible errors.

CodeDescription
body_invalidMetadata part is a malformed JSON object.
metadata_duplicateRequest has more than one part with the same "metadata" field name
metadata_invalidMetadata has invalid, or unknown properties
file_missingRequest has no file part or missing a valid ^file[1-9]?$ file part that's described inside metadata.
file_duplicateRequest has more than one file part with the same field name.
file_metadata_missingRequest has file part with missing file metadata.
file_metadata_unknownRequest files metadata has unknown property (violates ^file[1-9]?$).
file_metadata_invalidFile metadata object has one or more invalid/missing/unknown parameters.
file_signature_invalidUploaded file and metadata hash signature mismatched.
Error Example
json
{
  "error": {
    "type": "invalid_request_error",
    "code": "file_missing",
    "message": "At least one file must be submitted. Please refer to https://docs.zetl.com/embedded/references/kyc for more information."
  }
}
json
{
  "error": {
    "type": "invalid_request_error",
    "code": "file_duplicate",
    "message": "Field name \"file\" is used more than once. Please refer to https://docs.zetl.com/embedded/references/kyc for more information."
  }
}
json
{
  "error": {
    "type": "invalid_request_error",
    "code": "metadata_duplicate",
    "message": "Field name \"metadata\" is used more than once. Please refer to https://docs.zetl.com/embedded/references/kyc for more information."
  }
}
json
{
  "error": {
    "type": "invalid_request_error",
    "code": "file_metadata_invalid",
    "message": "File metadata property \"files.file\" invalid. Please refer to https://docs.zetl.com/embedded/references/kyc for more information."
  }
}
json
{
  "error": {
    "type": "invalid_request_error",
    "code": "file_metadata_unknown",
    "message": "File metadata property \"rogue_metadata\" unknown. Please refer to https://docs.zetl.com/embedded/references/kyc for more information."
  }
}
json
{
  "error": {
    "type": "invalid_request_error",
    "code": "file_signature_invalid",
    "message": "File \"file1\" signature mismatch. Please refer to https://docs.zetl.com/embedded/references/kyc for more information."
  }
}

Possible Error

See Handling Error for generic possible errors.

Download KYC Documents

GET   /v1/kyc/documents/{customer_id}/{document_id}

https://api.zetl.com/v1/kyc/documents/{customer_id}/{document_id}

Response Properties

PropertyTypeDescription
document_idstringThe unique identifier of the document.
typestringThe document type of the uploaded file. See Supporting Documents List)
filenamestringFinal filename of the uploaded file (with appended extension and generated identifier by us).
mime_typestringMime type of the uploaded file.
urlstringPre-signed URL to download the file. Expire in 5 minutes.
Response Example
json
{
  "document_id": "47a62de6-0b5f-4db1-9350-887238641066",
  "type": "shareholders_address_proof",
  "filename": "2023-04-04T204749.204Z-ShareholderAddressProof.png",
  "mime_type": "image/png",
  "url": "<pre-signed short-lived downloadable link>"
}

Possible Error

See Handling Error for generic possible errors.

Retrieve KYC Documents Information

GET   /v1/kyc/documents/{customer_id}

https://api.zetl.com/v1/kyc/documents/{customer_id}

Get list of uploaded KYC supporting documents summary of a customer.

Response Properties

Refer to Supporting Documents Object for possible key, and array of KYC Document summary as value.

Response Example

json
{
  "business_registration_certificate": [],
  "directors_identity": [],
  "directors_address_proof": [],
  "shareholders_identity": [],
  "shareholders_address_proof": [
    {
      "document_id": "47a62de6-0b5f-4db1-9350-887238641066",
      "filename": "2023-04-04T204749.204Z-ShareholderAddressProof.png",
      "mime_type": "image/png"
    },
    {
      "document_id": "070da6a1-2d95-4967-ae75-e278c813e61d",
      "filename": "2023-04-04T204749.204Z-ShareholderAddressProof1.png",
      "mime_type": "image/png"
    }
  ],
  "company_structure_chart": [],
  "litigation_history": [],
  "nnc1": [],
  "nar1": []
}