Use after PUTting a file to the presigned URL. The server verifies that the upload exists, checks size and MIME, and stores the document with status PENDING.
Max file size 25 MB. Allowed MIME: application/pdf, image/jpeg, image/png. Files that fail these checks return 422.
Formation documents are required for verification. When you call POST /api/external/customer/{customer}/submit, at least one document of a formation type must be present. Formation types are: CERTIFICATE_OF_INCORPORATION, ARTICLES_OF_INCORPORATION, BENEFICIAL_OWNERSHIP_CERTIFICATE, INCORPORATION_DOCUMENTS, CAC_STATUS_REPORT. Other types may be required by your compliance reviewer depending on the business profile.
All uploaded documents must be clear, legible, and authentic. Blurry, cropped, obscured, or otherwise unclear images will be rejected. Fraudulent or falsified documents will not be tolerated — repeated attempts to submit false or invalid documents will result in the customer being permanently blacklisted from the platform. There are no exceptions or compromises.
The customer must be of type business. Required scope: customer:write.
Authorization
oauth2ClientCredentials customer:writeUse your OAuth client credentials to obtain a short-lived Bearer token from POST /oauth/token.
In: header
Scope: customer:write
Path Parameters
uuidRequest Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
curl --request POST \ --url 'https://example.com/api/external/customer/497f6eca-6276-4993-bfeb-53cbbbba6f08/document' \ --header 'Content-Type: application/json' \ --data '{ "type": "CERTIFICATE_OF_INCORPORATION", "name": "string", "file_id": "8a0cfb4f-ddc9-436d-91bb-75133c583767"}'{ "message": "Document created successfully", "data": { "id": "019a6e10-1fb3-7b2f-8f8b-ad1e92c4017a", "business_customer_id": "019a6da3-4a9a-7033-81b9-12489eff13ee", "type": "CERTIFICATE_OF_INCORPORATION", "name": "Acme Inc — Certificate of Incorporation.pdf", "extension": "pdf", "description": "Filed 2019-03-12, Companies House", "status": "PENDING", "admin_comments": null, "url": "https://s3.amazonaws.com/...?X-Amz-Signature=...", "created_at": "2026-04-20T10:14:31.000000Z", "updated_at": "2026-04-20T10:14:31.000000Z" }}POSTGet a KYB document upload URL
Two-step upload, step one. Returns a `file_id`, a presigned `url`, and the headers required to PUT the file directly to S3. The URL is valid for 5 minutes and accepts a single PUT. Step two: call `POST /api/external/customer/{customer}/document` with the same `file_id` to register the document. Max file size 25 MB. Allowed types: `application/pdf`, `image/jpeg`, `image/png`. Files outside these limits are rejected at registration time. The customer must be of type `business`. Individual customers do not use this endpoint — they use the legacy file flow (`POST /api/external/file/get-presigned-url` followed by `POST /api/external/customer/{id}/files`). Required scope: `customer:write`.
PUTUpdate a KYB document
Edit `type`, `name`, `description`, or replace the underlying file by supplying a new `file_id` from a fresh presigned URL call. Send only the fields you want to change. Not allowed when the document is locked for review (status `APPROVED` or `PROCESSING`) — these return 400. `PENDING` and `REJECTED` documents are editable. Required scope: `customer:write`.