curl --request POST \
--url https://api.platform.dakota.xyz/applications/{application_id}/associated-individuals/{individual_id}/document-uploads \
--header 'Content-Type: application/json' \
--header 'X-Application-Token: <api-key>' \
--header 'x-idempotency-key: <x-idempotency-key>' \
--data '
{
"document_type": "passport",
"id_number": "AB1234567",
"country": "US",
"file_type": "pdf",
"filename": "passport_front.jpg"
}
'const options = {
method: 'POST',
headers: {
'x-idempotency-key': '<x-idempotency-key>',
'X-Application-Token': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
document_type: 'passport',
id_number: 'AB1234567',
country: 'US',
file_type: 'pdf',
filename: 'passport_front.jpg'
})
};
fetch('https://api.platform.dakota.xyz/applications/{application_id}/associated-individuals/{individual_id}/document-uploads', 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}/document-uploads"
payload = {
"document_type": "passport",
"id_number": "AB1234567",
"country": "US",
"file_type": "pdf",
"filename": "passport_front.jpg"
}
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}/document-uploads"
payload := strings.NewReader("{\n \"document_type\": \"passport\",\n \"id_number\": \"AB1234567\",\n \"country\": \"US\",\n \"file_type\": \"pdf\",\n \"filename\": \"passport_front.jpg\"\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))
}{
"upload_url": "https://storage.googleapis.com/bucket/path?...",
"upload_id": "2rftx8ofdxg4xIGC68EnhUc8xWD",
"object_path": "applications/2hCjxJzUAW6JVRkZqaF9E0KpM3a/individuals/2hCjxJzUAW6JVRkZqaF9E0KpM3b/documents/2rftx8ofdxg4xIGC68EnhUc8xWD",
"expires_at": "2025-01-15T18:30:00Z"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#invalid-request",
"title": "Invalid request",
"status": 400,
"detail": "Invalid request",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals/example-id/document-uploads",
"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/document-uploads",
"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/document-uploads",
"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/document-uploads",
"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/document-uploads",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}Get presigned URL for individual document upload
Generates a presigned URL for uploading large individual documents directly to cloud storage. Supports identity documents and EDD documents. Use this endpoint for files larger than 10MB. After uploading to the presigned URL, call the verify endpoint to complete the upload process.
Authentication: Accepts Application Token (X-Application-Token header).
Post-decision PoA upload
Uploading a PoA-equivalent document (proof_of_address, bank_statement, or
utility_bill) on an already-decided individual application (status approved or
completed) automatically transitions the application to compliance_review and sets
poa_status to submitted_pending_review.
curl --request POST \
--url https://api.platform.dakota.xyz/applications/{application_id}/associated-individuals/{individual_id}/document-uploads \
--header 'Content-Type: application/json' \
--header 'X-Application-Token: <api-key>' \
--header 'x-idempotency-key: <x-idempotency-key>' \
--data '
{
"document_type": "passport",
"id_number": "AB1234567",
"country": "US",
"file_type": "pdf",
"filename": "passport_front.jpg"
}
'const options = {
method: 'POST',
headers: {
'x-idempotency-key': '<x-idempotency-key>',
'X-Application-Token': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
document_type: 'passport',
id_number: 'AB1234567',
country: 'US',
file_type: 'pdf',
filename: 'passport_front.jpg'
})
};
fetch('https://api.platform.dakota.xyz/applications/{application_id}/associated-individuals/{individual_id}/document-uploads', 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}/document-uploads"
payload = {
"document_type": "passport",
"id_number": "AB1234567",
"country": "US",
"file_type": "pdf",
"filename": "passport_front.jpg"
}
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}/document-uploads"
payload := strings.NewReader("{\n \"document_type\": \"passport\",\n \"id_number\": \"AB1234567\",\n \"country\": \"US\",\n \"file_type\": \"pdf\",\n \"filename\": \"passport_front.jpg\"\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))
}{
"upload_url": "https://storage.googleapis.com/bucket/path?...",
"upload_id": "2rftx8ofdxg4xIGC68EnhUc8xWD",
"object_path": "applications/2hCjxJzUAW6JVRkZqaF9E0KpM3a/individuals/2hCjxJzUAW6JVRkZqaF9E0KpM3b/documents/2rftx8ofdxg4xIGC68EnhUc8xWD",
"expires_at": "2025-01-15T18:30:00Z"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#invalid-request",
"title": "Invalid request",
"status": 400,
"detail": "Invalid request",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals/example-id/document-uploads",
"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/document-uploads",
"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/document-uploads",
"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/document-uploads",
"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/document-uploads",
"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 generate a presigned URL for uploading an individual document (identity or EDD). 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"
ISO 3166-1 alpha-2 country code of the issuing country. Required for identity documents, not required for EDD documents.
2"US"
Supported file type
pdf, jpeg, png "pdf"
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"
Response
Presigned URL generated successfully
Response containing a presigned URL for document upload
Presigned URL to upload the document to. Use PUT method with the file content.
"https://storage.googleapis.com/bucket/path?..."
Unique identifier for this upload. Use this when calling the verify endpoint.
"2rftx8ofdxg4xIGC68EnhUc8xWD"
The storage path the uploaded file is written to, ending in upload_id. Informational:
no endpoint takes it as input. To register the upload, call
POST /applications/{application_id}/documents/{document_id}/verifications with
upload_id as document_id.
"applications/2hCjxJzUAW6JVRkZqaF9E0KpM3a/business-documents/2rftx8ofdxg4xIGC68EnhUc8xWD"
ISO 8601 timestamp when upload_url stops accepting the upload, one hour after the
session was created. Upload before then, or request a new session.
"2025-01-15T18:30:00Z"
Was this page helpful?

