curl --request POST \
--url https://partners-api.sandbox.securitize.io/investors/v1/onboarding-reliance/investors/{investorId}/documents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "passport",
"documentNumber": "P-IND1-0000",
"expiresAt": "2032-01-01",
"files": [
{
"mime": "image/png",
"side": "front",
"content": "iVBORw0KGgo..."
}
]
}
'{
"documents": [
{
"id": "6ace7461ab21fd6924a19c09",
"type": "passport",
"documentNumber": "P-IND1-0000",
"expiresAt": "2032-01-01",
"uploadedAt": "2026-10-13T18:11:45.540Z",
"side": "front"
}
],
"verification": {
"status": "awaiting_submission",
"missing": []
}
}Add a document to an investor
Uploads one document, with all of its files, for the investor itself. The body shape follows the investor’s type, chosen by type:
- Individual → an identity document (
passport,driving-licence,national-identity-card,residence-permit). A passport is one file withside: front; the other three are two files, onefrontand oneback, in the same call. The file is read optically, so it must be a real, legible image (JPEG or PNG). - Entity → one of its own company documents (certificate of registration, articles, shareholder register…), filed for Securitize compliance review: exactly one file, PDF allowed, no
side,documentNumberorexpiresAt. Optional: the list of types is a menu, not a checklist — send what you hold. A company has no identity document of its own: send a person’s identity document toPOST /investors/{investorId}/key-parties/{keyPartyId}/documents.
A company type on an individual, or an identity type on an entity, answers 422 before anything is stored.
Two ways to send the files, on this same route and with the same answers. As JSON, each file base64-encoded in files[].content, at most 10 MB a file. Or as multipart/form-data, each file as a part of its own, at most 20 MB a file: the text parts carry type, documentNumber and expiresAt, and the files go in a front part, plus a back part for a two-sided document, or in one file part for a company document. Send files over 10 MB as multipart; a part travels as the file itself, without the third that base64 adds. See Two ways to send the files.
This never starts verification. Read verification.status in the response:
- individual —
awaiting_documentswhile something is still owed (missingnames it, e.g.["IDENTITY"]), thenawaiting_submissiononce the identity document is accepted; - entity —
awaiting_key_partieswhile its key parties still need adding or documenting (missing, e.g.["COMPANY_BENEFICIARIES"]), thenawaiting_submission.
awaiting_submission is not a stuck state: it is waiting for your POST /investors/{investorId}/verification/submit. No verdict arrives from this endpoint, and the investor’s status stays none.
The status code is the outcome; there is no per-file result. A two-sided document is stored only if both sides are accepted. Each call stores a new document, so sending the same document twice keeps two copies. Once the investor is submitted, this route answers 409. For sandbox tests you can use the sample files at /secid-api/fixtures/passport.png and /secid-api/fixtures/company-document.png on this site.
curl --request POST \
--url https://partners-api.sandbox.securitize.io/investors/v1/onboarding-reliance/investors/{investorId}/documents \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"type": "passport",
"documentNumber": "P-IND1-0000",
"expiresAt": "2032-01-01",
"files": [
{
"mime": "image/png",
"side": "front",
"content": "iVBORw0KGgo..."
}
]
}
'{
"documents": [
{
"id": "6ace7461ab21fd6924a19c09",
"type": "passport",
"documentNumber": "P-IND1-0000",
"expiresAt": "2032-01-01",
"uploadedAt": "2026-10-13T18:11:45.540Z",
"side": "front"
}
],
"verification": {
"status": "awaiting_submission",
"missing": []
}
}Authorizations
OAuth 2.0 client credentials. Exchange the client id and secret Securitize issued you for a bearer token at the token URL (the host root, not under the base URL), with grant_type=client_credentials; the token lasts 2 hours and goes in the Authorization: Bearer header of every request. No scope is needed. The token identifies your partner account, so you never send a partner id, and every record you create is scoped to you.
Path Parameters
Body
- Option 1
- Option 2
An identity document for an individual investor or a person key party, as JSON, with all of its files in one call. The whole request body is capped at about 31 MB (31,107,760 bytes), enough for two files at the maximum. The same document can also be sent as multipart/form-data (DocumentUpload), up to 20 MB a file.
type | files | side |
|---|---|---|
passport | exactly 1 | front |
driving-licence, national-identity-card, residence-permit | exactly 2 | one front, one back |
A wrong file count or a missing side answers 400 invalid_document.
Response
Stored. Verification did not start; read verification.status.