curl --request POST \
--url https://api.platform.dakota.xyz/applications/{application_id}/associated-individuals \
--header 'Content-Type: application/json' \
--header 'X-Application-Token: <api-key>' \
--header 'x-idempotency-key: <x-idempotency-key>' \
--data '
{
"roles": [
"ubo",
"control_person"
],
"name": {
"first": "John",
"middle": "Michael",
"last": "Doe"
},
"title": "ceo",
"ownership_percentage": 25.5,
"date_of_birth": "1985-06-15",
"ssn": "123-45-6789",
"nationalities": [
"US"
],
"address": {
"street1": "123 Main St",
"street2": "Apt 4B",
"street3": "Building C",
"city": "San Francisco",
"region": "CA",
"postal_code": "94105",
"country": "US"
},
"email_address": "john.doe@acme.com"
}
'const options = {
method: 'POST',
headers: {
'x-idempotency-key': '<x-idempotency-key>',
'X-Application-Token': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
roles: ['ubo', 'control_person'],
name: {first: 'John', middle: 'Michael', last: 'Doe'},
title: 'ceo',
ownership_percentage: 25.5,
date_of_birth: '1985-06-15',
ssn: '123-45-6789',
nationalities: ['US'],
address: {
street1: '123 Main St',
street2: 'Apt 4B',
street3: 'Building C',
city: 'San Francisco',
region: 'CA',
postal_code: '94105',
country: 'US'
},
email_address: 'john.doe@acme.com'
})
};
fetch('https://api.platform.dakota.xyz/applications/{application_id}/associated-individuals', 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"
payload = {
"roles": ["ubo", "control_person"],
"name": {
"first": "John",
"middle": "Michael",
"last": "Doe"
},
"title": "ceo",
"ownership_percentage": 25.5,
"date_of_birth": "1985-06-15",
"ssn": "123-45-6789",
"nationalities": ["US"],
"address": {
"street1": "123 Main St",
"street2": "Apt 4B",
"street3": "Building C",
"city": "San Francisco",
"region": "CA",
"postal_code": "94105",
"country": "US"
},
"email_address": "john.doe@acme.com"
}
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"
payload := strings.NewReader("{\n \"roles\": [\n \"ubo\",\n \"control_person\"\n ],\n \"name\": {\n \"first\": \"John\",\n \"middle\": \"Michael\",\n \"last\": \"Doe\"\n },\n \"title\": \"ceo\",\n \"ownership_percentage\": 25.5,\n \"date_of_birth\": \"1985-06-15\",\n \"ssn\": \"123-45-6789\",\n \"nationalities\": [\n \"US\"\n ],\n \"address\": {\n \"street1\": \"123 Main St\",\n \"street2\": \"Apt 4B\",\n \"street3\": \"Building C\",\n \"city\": \"San Francisco\",\n \"region\": \"CA\",\n \"postal_code\": \"94105\",\n \"country\": \"US\"\n },\n \"email_address\": \"john.doe@acme.com\"\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))
}{
"id": "1NFHrqBHb3cTfLVkFSGmHZqdDPi"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#invalid-request",
"title": "Invalid request, validation errors, or duplicate individual name",
"status": 400,
"detail": "Invalid request, validation errors, or duplicate individual name",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals",
"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",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#forbidden",
"title": "Application not in pending state or forbidden",
"status": 403,
"detail": "Application not in pending state or forbidden",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#not-found",
"title": "Application not found",
"status": 404,
"detail": "Application not found",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#conflict",
"title": "Application already submitted or individual with same name already exists",
"status": 409,
"detail": "Application already submitted or individual with same name already exists",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals",
"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"
}Add associated individual to business application
Adds a new associated individual (UBO, control person, or applicant) to a business application. Applicants may call this in ‘pending’, ‘request_for_information’ or ‘compliance_review’; Dakota admins may additionally call it in ‘admin_revision’. Each individual must have a unique first and last name combination within the application.
curl --request POST \
--url https://api.platform.dakota.xyz/applications/{application_id}/associated-individuals \
--header 'Content-Type: application/json' \
--header 'X-Application-Token: <api-key>' \
--header 'x-idempotency-key: <x-idempotency-key>' \
--data '
{
"roles": [
"ubo",
"control_person"
],
"name": {
"first": "John",
"middle": "Michael",
"last": "Doe"
},
"title": "ceo",
"ownership_percentage": 25.5,
"date_of_birth": "1985-06-15",
"ssn": "123-45-6789",
"nationalities": [
"US"
],
"address": {
"street1": "123 Main St",
"street2": "Apt 4B",
"street3": "Building C",
"city": "San Francisco",
"region": "CA",
"postal_code": "94105",
"country": "US"
},
"email_address": "john.doe@acme.com"
}
'const options = {
method: 'POST',
headers: {
'x-idempotency-key': '<x-idempotency-key>',
'X-Application-Token': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
roles: ['ubo', 'control_person'],
name: {first: 'John', middle: 'Michael', last: 'Doe'},
title: 'ceo',
ownership_percentage: 25.5,
date_of_birth: '1985-06-15',
ssn: '123-45-6789',
nationalities: ['US'],
address: {
street1: '123 Main St',
street2: 'Apt 4B',
street3: 'Building C',
city: 'San Francisco',
region: 'CA',
postal_code: '94105',
country: 'US'
},
email_address: 'john.doe@acme.com'
})
};
fetch('https://api.platform.dakota.xyz/applications/{application_id}/associated-individuals', 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"
payload = {
"roles": ["ubo", "control_person"],
"name": {
"first": "John",
"middle": "Michael",
"last": "Doe"
},
"title": "ceo",
"ownership_percentage": 25.5,
"date_of_birth": "1985-06-15",
"ssn": "123-45-6789",
"nationalities": ["US"],
"address": {
"street1": "123 Main St",
"street2": "Apt 4B",
"street3": "Building C",
"city": "San Francisco",
"region": "CA",
"postal_code": "94105",
"country": "US"
},
"email_address": "john.doe@acme.com"
}
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"
payload := strings.NewReader("{\n \"roles\": [\n \"ubo\",\n \"control_person\"\n ],\n \"name\": {\n \"first\": \"John\",\n \"middle\": \"Michael\",\n \"last\": \"Doe\"\n },\n \"title\": \"ceo\",\n \"ownership_percentage\": 25.5,\n \"date_of_birth\": \"1985-06-15\",\n \"ssn\": \"123-45-6789\",\n \"nationalities\": [\n \"US\"\n ],\n \"address\": {\n \"street1\": \"123 Main St\",\n \"street2\": \"Apt 4B\",\n \"street3\": \"Building C\",\n \"city\": \"San Francisco\",\n \"region\": \"CA\",\n \"postal_code\": \"94105\",\n \"country\": \"US\"\n },\n \"email_address\": \"john.doe@acme.com\"\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))
}{
"id": "1NFHrqBHb3cTfLVkFSGmHZqdDPi"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#invalid-request",
"title": "Invalid request, validation errors, or duplicate individual name",
"status": 400,
"detail": "Invalid request, validation errors, or duplicate individual name",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals",
"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",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#forbidden",
"title": "Application not in pending state or forbidden",
"status": 403,
"detail": "Application not in pending state or forbidden",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#not-found",
"title": "Application not found",
"status": 404,
"detail": "Application not found",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals",
"request_id": "req_01hzy6y7v8w9x0y1z2a3b4c5d6"
}{
"type": "https://docs.dakota.xyz/api-reference/errors#conflict",
"title": "Application already submitted or individual with same name already exists",
"status": 409,
"detail": "Application already submitted or individual with same name already exists",
"instance": "https://api.platform.dakota.xyz/applications/example-id/associated-individuals",
"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"
}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
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
An individual person (used for both business associated persons and standalone individual applications).
Several fields are required for one role and refused for another, so they cannot be listed in
required. employment_status is required when roles is [individual] and rejected with
400 for any other role; purpose_of_account and source_of_wealth are needed for
[individual] before the application can be submitted. title is required for ubo and
control_person and rejected for individual. See
PUT /applications/{application_id}/individual-details for the full table.
Role(s) of this person (individual cannot be combined with other types)
1ubo, control_person, applicant, individual ["ubo", "control_person"]
Full name of a person
Show child attributes
Show child attributes
Date of birth (ISO 8601 format, person must be at least 18 years old)
"1985-06-15"
ISO 3166-1 alpha-2 country codes for nationalities
12["US"]
Standardized physical address format used throughout the Dakota platform for user and entity addresses.
Show child attributes
Show child attributes
Email address (cannot use example or test domains)
"john.doe@acme.com"
Job title (required for UBO/control person, optional for applicant, invalid for individual)
ceo, coo, cfo, cto, cco, director, other_officer "ceo"
Employment status. Required when roles is [individual]. Must be omitted for every other
role (ubo, control_person, applicant): a request that sends it for those roles is
rejected with 400.
employed, self_employed, unemployed, student, retired "employed"
Ownership percentage (required for UBO role, optional for others, must be > 0 and <= 100)
0.01 <= x <= 10025.5
Social Security Number (required for US persons, format: XXX-XX-XXXX). On an update, leave it out to keep the SSN already on file, for example one imported from a share token.
^\d{3}-\d{2}-\d{4}$"123-45-6789"
Mobile phone number (optional). Card security codes are sent to it, so it must be current.
Spaces, dashes, dots and brackets are accepted and removed; the number is stored and returned in
E.164 format (a plus sign and 8 to 15 digits, for example +14155550123). The country code is
required: a number without + and a country code is rejected with 400. A number under +1 (North America) must have exactly 10 digits after the +1, and its area code and exchange cannot start with 0 or 1; otherwise it is rejected with 400. Leave it out (or send an empty
string) to keep the number already on file, but only while the request still describes the same
person: the same first name, last name and date of birth (case and surrounding spaces are
ignored). If the name or the date of birth changes, the stored number is not carried over: it is
cleared, and the response carries a phone_number entry in warnings, so send the number again.
Otherwise a phone number cannot be cleared through the API. A request without a phone number
succeeds and the response carries a phone_number entry in warnings.
"+14155550123"
Intended purposes for the account (required when roles includes 'individual')
1investing, sending_and_receiving_payments, storage_of_funds_or_digital_assets, making_online_payments, trading_on_other_platforms [
"investing",
"storage_of_funds_or_digital_assets"
]
Sources of wealth (required when roles includes 'individual')
1investments, employment, court_settlement, lottery_winnings, retirement_income, savings, sale_of_assets, family_funds, gambling_winnings, gift, inheritance, insurance_claim, loan, redundancy_severance, benefits ["employment", "savings"]
Response
Individual added successfully
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"
Non-blocking findings about the saved data. The request succeeded; the listed fields are optional today and may become required. Omitted when there are none.
Show child attributes
Show child attributes
Was this page helpful?

