curl --request POST \
--url https://api.platform.dakota.xyz/applications/{application_id}/associated-individuals/{individual_id}/documents \
--header 'Content-Type: application/json' \
--header 'X-Application-Token: <api-key>' \
--header 'x-idempotency-key: <x-idempotency-key>' \
--data '
{
"type": "passport",
"file_type": "pdf",
"file_content": "JVBERi0xLjQKJeLjz9MKMw==",
"id_number": "AB1234567",
"country": "US",
"filename": "passport_front.jpg",
"valid_until": "2027-04-20"
}
'const options = {
method: 'POST',
headers: {
'x-idempotency-key': '<x-idempotency-key>',
'X-Application-Token': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
type: 'passport',
file_type: 'pdf',
file_content: 'JVBERi0xLjQKJeLjz9MKMw==',
id_number: 'AB1234567',
country: 'US',
filename: 'passport_front.jpg',
valid_until: '2027-04-20'
})
};
fetch('https://api.platform.dakota.xyz/applications/{application_id}/associated-individuals/{individual_id}/documents', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.platform.dakota.xyz/applications/{application_id}/associated-individuals/{individual_id}/documents"
payload = {
"type": "passport",
"file_type": "pdf",
"file_content": "JVBERi0xLjQKJeLjz9MKMw==",
"id_number": "AB1234567",
"country": "US",
"filename": "passport_front.jpg",
"valid_until": "2027-04-20"
}
headers = {
"x-idempotency-key": "<x-idempotency-key>",
"X-Application-Token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.platform.dakota.xyz/applications/{application_id}/associated-individuals/{individual_id}/documents"
payload := strings.NewReader("{\n \"type\": \"passport\",\n \"file_type\": \"pdf\",\n \"file_content\": \"JVBERi0xLjQKJeLjz9MKMw==\",\n \"id_number\": \"AB1234567\",\n \"country\": \"US\",\n \"filename\": \"passport_front.jpg\",\n \"valid_until\": \"2027-04-20\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-idempotency-key", "<x-idempotency-key>")
req.Header.Add("X-Application-Token", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"document_id": "1NFHrqBHb3cTfLVkFSGmHZqdDPi"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#invalid-request",
"title": "Invalid request or validation failed",
"status": 400,
"detail": "Invalid request or validation failed",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals/example-id/documents",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#authentication-error",
"title": "Unauthorized",
"status": 401,
"detail": "Unauthorized",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals/example-id/documents",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#forbidden",
"title": "Forbidden",
"status": 403,
"detail": "Forbidden",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals/example-id/documents",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#not-found",
"title": "Application or individual not found",
"status": 404,
"detail": "Application or individual not found",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals/example-id/documents",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#payload-too-large",
"title": "File size exceeds 500MB limit",
"status": 413,
"detail": "File size exceeds 500MB limit",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals/example-id/documents",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#not-found",
"title": "Customer Not Found",
"status": 404,
"detail": "Customer cst_2abc123 was not found in your organization.",
"instance": "https://api.platform.dakota.xyz/customers/cst_2abc123",
"request_id": "req_7f3a8b2c"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#internal-error",
"title": "Unexpected error",
"status": 500,
"detail": "Unexpected error",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals/example-id/documents",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}Upload an individual document
Uploads a document for an individual using base64-encoded content. Supports identity documents (passport, driverās license, etc.) and EDD documents. For files larger than 10MB, use the presigned URL endpoint instead.
Authentication: Accepts Application Token (X-Application-Token header).
curl --request POST \
--url https://api.platform.dakota.xyz/applications/{application_id}/associated-individuals/{individual_id}/documents \
--header 'Content-Type: application/json' \
--header 'X-Application-Token: <api-key>' \
--header 'x-idempotency-key: <x-idempotency-key>' \
--data '
{
"type": "passport",
"file_type": "pdf",
"file_content": "JVBERi0xLjQKJeLjz9MKMw==",
"id_number": "AB1234567",
"country": "US",
"filename": "passport_front.jpg",
"valid_until": "2027-04-20"
}
'const options = {
method: 'POST',
headers: {
'x-idempotency-key': '<x-idempotency-key>',
'X-Application-Token': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
type: 'passport',
file_type: 'pdf',
file_content: 'JVBERi0xLjQKJeLjz9MKMw==',
id_number: 'AB1234567',
country: 'US',
filename: 'passport_front.jpg',
valid_until: '2027-04-20'
})
};
fetch('https://api.platform.dakota.xyz/applications/{application_id}/associated-individuals/{individual_id}/documents', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.platform.dakota.xyz/applications/{application_id}/associated-individuals/{individual_id}/documents"
payload = {
"type": "passport",
"file_type": "pdf",
"file_content": "JVBERi0xLjQKJeLjz9MKMw==",
"id_number": "AB1234567",
"country": "US",
"filename": "passport_front.jpg",
"valid_until": "2027-04-20"
}
headers = {
"x-idempotency-key": "<x-idempotency-key>",
"X-Application-Token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.platform.dakota.xyz/applications/{application_id}/associated-individuals/{individual_id}/documents"
payload := strings.NewReader("{\n \"type\": \"passport\",\n \"file_type\": \"pdf\",\n \"file_content\": \"JVBERi0xLjQKJeLjz9MKMw==\",\n \"id_number\": \"AB1234567\",\n \"country\": \"US\",\n \"filename\": \"passport_front.jpg\",\n \"valid_until\": \"2027-04-20\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-idempotency-key", "<x-idempotency-key>")
req.Header.Add("X-Application-Token", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"document_id": "1NFHrqBHb3cTfLVkFSGmHZqdDPi"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#invalid-request",
"title": "Invalid request or validation failed",
"status": 400,
"detail": "Invalid request or validation failed",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals/example-id/documents",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#authentication-error",
"title": "Unauthorized",
"status": 401,
"detail": "Unauthorized",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals/example-id/documents",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#forbidden",
"title": "Forbidden",
"status": 403,
"detail": "Forbidden",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals/example-id/documents",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#not-found",
"title": "Application or individual not found",
"status": 404,
"detail": "Application or individual not found",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals/example-id/documents",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#payload-too-large",
"title": "File size exceeds 500MB limit",
"status": 413,
"detail": "File size exceeds 500MB limit",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals/example-id/documents",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#not-found",
"title": "Customer Not Found",
"status": 404,
"detail": "Customer cst_2abc123 was not found in your organization.",
"instance": "https://api.platform.dakota.xyz/customers/cst_2abc123",
"request_id": "req_7f3a8b2c"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#internal-error",
"title": "Unexpected error",
"status": 500,
"detail": "Unexpected error",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals/example-id/documents",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}Authorizations
Application-specific token for public URL access. Generated when a customer is created. Provides access to a single application without requiring an API key. Token is valid for 90 days and rate-limited to 250 requests per hour.
Headers
Unique key (UUID) to ensure request idempotency on POST, PUT and PATCH requests.
A key is scoped to your client, the HTTP method and the path, and is remembered for 24 hours after a
successful (below 400) response. Repeating the same request (same JSON body, whatever the key order or
whitespace) with the same key within that window returns the original response with
X-Idempotent-Replayed: true instead of executing the request again. Using the same key on the same
endpoint with a different body returns 422 with problem type idempotency-key-reused; the request is
not executed. Error responses (4xx and 5xx) are not remembered, so a request refused for a fixable reason
can be corrected and retried under the same key. Request bodies that are not JSON (for example file
uploads) are not compared.
Path Parameters
The unique identifier for the application KSUID is a 27-character globally unique ID that combines a timestamp with a random component. Used for all entity identifiers in the Dakota platform.
27^[0-9A-Za-z]{27}$"1NFHrqBHb3cTfLVkFSGmHZqdDPi"
The unique identifier for the individual KSUID is a 27-character globally unique ID that combines a timestamp with a random component. Used for all entity identifiers in the Dakota platform.
27^[0-9A-Za-z]{27}$"1NFHrqBHb3cTfLVkFSGmHZqdDPi"
Body
Request to upload a document for an individual (identity or EDD document). For identity documents (passport, drivers_license_front, drivers_license_back, residence_permit_front, residence_permit_back, national_id_front, national_id_back), id_number is required.
Type of document that can be uploaded for individuals (identity documents + EDD documents).
Identity documents: passport (single-sided), drivers_license_front + drivers_license_back,
residence_permit_front + residence_permit_back, national_id_front + national_id_back.
Two-sided documents need both sides before the identity requirement is met when you
upload them here. Documents imported from a verification provider are the exception:
a Sumsub share token is issued for an applicant that provider already verified against
its own per-country rules, and some countries are one-sided there (a German driver's
license has no back), so an imported identity document satisfies the requirement on
its own.
national_id_front / national_id_back are accepted only for national ID cards issued by
Colombia (country = CO); other issuing countries are rejected. An individual who submits
a national ID card is always reviewed by a compliance analyst and is never approved automatically.
other is a supporting document of no fixed type, such as a file attached to the answer
to a request for information on an individual application.
passport, drivers_license_front, drivers_license_back, residence_permit_front, residence_permit_back, national_id_front, national_id_back, proof_of_address, bank_statement, utility_bill, source_of_wealth, payslip, employment_contract, income_verification_letter, savings_statement, crypto_statement, investment_statement, other "passport"
Supported file type
pdf, jpeg, png "pdf"
Base64-encoded file content. Maximum size after decoding is 10MB.
"JVBERi0xLjQKJeLjz9MKMw=="
ISO 3166-1 alpha-2 country code of the issuing country. Required for identity documents, not required for EDD documents.
2"US"
REQUIRED for identity documents (passport, driver's license, residence permit, national ID). The ID number on the document (e.g., passport number, driver's license number, national ID number). Not required for EDD documents like bank statements.
"AB1234567"
Optional original filename. Will be sanitized for safe storage and display.
100"passport_front.jpg"
Optional expiration date of the identity document in YYYY-MM-DD format
"2027-04-20"
Response
Document uploaded successfully
Response after successfully uploading a document
KSUID is a 27-character globally unique ID that combines a timestamp with a random component. Used for all entity identifiers in the Dakota platform.
27^[0-9A-Za-z]{27}$"1NFHrqBHb3cTfLVkFSGmHZqdDPi"
Was this page helpful?

