# Requires: npm i -g @infinite_dev/cli && export INFINITE_API_KEY=sk_sandbox_...
# Escape hatch for any endpoint: infinite api <METHOD> <path>
infinite api POST /v1/customers/cus_abc123/associated_businesses \
--body '<request-json>'Create a new associated business (cus_abc123).
# Infinite MCP is read-only for this endpoint — use a dedicated MCP tool when one exists, otherwise run the CLI tab.import requests
url = "https://sandbox.api.infinite.dev/v1/customers/{customerId}/associated_businesses"
payload = {
"countryCode": "US",
"hasOwnership": True,
"hasControl": True,
"businessName": "Acme Holdings LLC",
"parentEntityId": "asp_abc123",
"email": "<string>",
"phone": "<string>",
"ownershipPercentage": 50,
"isSigner": True,
"isDirector": True,
"attestedOwnershipStructureAt": "2026-06-01T10:45:05Z",
"relationshipDate": "2020-01-15",
"generateVerificationLink": True,
"sendInvite": True,
"registrationNumber": "<string>",
"dateOfIncorporation": "2018-06-15",
"supportingDocuments": [
{
"file": "doc_abc123",
"requirementId": "<string>",
"type": "PROOF_OF_ADDRESS",
"subtype": "UTILITY_BILL",
"description": "Passport issued in 2020",
"remarks": "Uploaded to support proof of business address"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
countryCode: 'US',
hasOwnership: true,
hasControl: true,
businessName: 'Acme Holdings LLC',
parentEntityId: 'asp_abc123',
email: '<string>',
phone: '<string>',
ownershipPercentage: 50,
isSigner: true,
isDirector: true,
attestedOwnershipStructureAt: '2026-06-01T10:45:05Z',
relationshipDate: '2020-01-15',
generateVerificationLink: true,
sendInvite: true,
registrationNumber: '<string>',
dateOfIncorporation: '2018-06-15',
supportingDocuments: [
{
file: 'doc_abc123',
requirementId: '<string>',
type: 'PROOF_OF_ADDRESS',
subtype: 'UTILITY_BILL',
description: 'Passport issued in 2020',
remarks: 'Uploaded to support proof of business address'
}
]
})
};
fetch('https://sandbox.api.infinite.dev/v1/customers/{customerId}/associated_businesses', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox.api.infinite.dev/v1/customers/{customerId}/associated_businesses",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'countryCode' => 'US',
'hasOwnership' => true,
'hasControl' => true,
'businessName' => 'Acme Holdings LLC',
'parentEntityId' => 'asp_abc123',
'email' => '<string>',
'phone' => '<string>',
'ownershipPercentage' => 50,
'isSigner' => true,
'isDirector' => true,
'attestedOwnershipStructureAt' => '2026-06-01T10:45:05Z',
'relationshipDate' => '2020-01-15',
'generateVerificationLink' => true,
'sendInvite' => true,
'registrationNumber' => '<string>',
'dateOfIncorporation' => '2018-06-15',
'supportingDocuments' => [
[
'file' => 'doc_abc123',
'requirementId' => '<string>',
'type' => 'PROOF_OF_ADDRESS',
'subtype' => 'UTILITY_BILL',
'description' => 'Passport issued in 2020',
'remarks' => 'Uploaded to support proof of business address'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox.api.infinite.dev/v1/customers/{customerId}/associated_businesses"
payload := strings.NewReader("{\n \"countryCode\": \"US\",\n \"hasOwnership\": true,\n \"hasControl\": true,\n \"businessName\": \"Acme Holdings LLC\",\n \"parentEntityId\": \"asp_abc123\",\n \"email\": \"<string>\",\n \"phone\": \"<string>\",\n \"ownershipPercentage\": 50,\n \"isSigner\": true,\n \"isDirector\": true,\n \"attestedOwnershipStructureAt\": \"2026-06-01T10:45:05Z\",\n \"relationshipDate\": \"2020-01-15\",\n \"generateVerificationLink\": true,\n \"sendInvite\": true,\n \"registrationNumber\": \"<string>\",\n \"dateOfIncorporation\": \"2018-06-15\",\n \"supportingDocuments\": [\n {\n \"file\": \"doc_abc123\",\n \"requirementId\": \"<string>\",\n \"type\": \"PROOF_OF_ADDRESS\",\n \"subtype\": \"UTILITY_BILL\",\n \"description\": \"Passport issued in 2020\",\n \"remarks\": \"Uploaded to support proof of business address\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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))
}HttpResponse<String> response = Unirest.post("https://sandbox.api.infinite.dev/v1/customers/{customerId}/associated_businesses")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"countryCode\": \"US\",\n \"hasOwnership\": true,\n \"hasControl\": true,\n \"businessName\": \"Acme Holdings LLC\",\n \"parentEntityId\": \"asp_abc123\",\n \"email\": \"<string>\",\n \"phone\": \"<string>\",\n \"ownershipPercentage\": 50,\n \"isSigner\": true,\n \"isDirector\": true,\n \"attestedOwnershipStructureAt\": \"2026-06-01T10:45:05Z\",\n \"relationshipDate\": \"2020-01-15\",\n \"generateVerificationLink\": true,\n \"sendInvite\": true,\n \"registrationNumber\": \"<string>\",\n \"dateOfIncorporation\": \"2018-06-15\",\n \"supportingDocuments\": [\n {\n \"file\": \"doc_abc123\",\n \"requirementId\": \"<string>\",\n \"type\": \"PROOF_OF_ADDRESS\",\n \"subtype\": \"UTILITY_BILL\",\n \"description\": \"Passport issued in 2020\",\n \"remarks\": \"Uploaded to support proof of business address\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.api.infinite.dev/v1/customers/{customerId}/associated_businesses")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"countryCode\": \"US\",\n \"hasOwnership\": true,\n \"hasControl\": true,\n \"businessName\": \"Acme Holdings LLC\",\n \"parentEntityId\": \"asp_abc123\",\n \"email\": \"<string>\",\n \"phone\": \"<string>\",\n \"ownershipPercentage\": 50,\n \"isSigner\": true,\n \"isDirector\": true,\n \"attestedOwnershipStructureAt\": \"2026-06-01T10:45:05Z\",\n \"relationshipDate\": \"2020-01-15\",\n \"generateVerificationLink\": true,\n \"sendInvite\": true,\n \"registrationNumber\": \"<string>\",\n \"dateOfIncorporation\": \"2018-06-15\",\n \"supportingDocuments\": [\n {\n \"file\": \"doc_abc123\",\n \"requirementId\": \"<string>\",\n \"type\": \"PROOF_OF_ADDRESS\",\n \"subtype\": \"UTILITY_BILL\",\n \"description\": \"Passport issued in 2020\",\n \"remarks\": \"Uploaded to support proof of business address\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "asp_abc123",
"createdAt": "2026-01-15T10:30:00Z",
"updatedAt": "2026-01-15T10:30:00Z",
"entityType": "BUSINESS",
"hasOwnership": true,
"hasControl": true,
"parentEntityId": "asp_parent123",
"details": {
"firstName": "John",
"nickname": "Johnny",
"lastName": "Doe",
"middleName": "Michael",
"dateOfBirth": "1985-03-15",
"taxResidenceCountry": "GB",
"transliteratedFirstName": "<string>",
"transliteratedMiddleName": "<string>",
"transliteratedLastName": "<string>",
"taxIdentificationDocumentType": "UTR"
},
"countryCode": "US",
"email": "contact@acmeholdings.com",
"phone": "+14155551234",
"address": {
"addressLine1": "123 Main Street",
"city": "San Francisco",
"postalCode": "94102",
"country": "US",
"addressLine2": "Apt 4B",
"state": "CA",
"transliterated": {
"addressLine1": "123 Main Street",
"addressLine2": "Apt 4B",
"city": "Beijing",
"state": "Hebei"
}
},
"ownershipPercentage": 51,
"isSigner": false,
"isDirector": false,
"role": "CEO",
"title": "Managing Director",
"documents": [
"doc_abc123"
],
"attestedOwnershipStructureAt": "2026-01-15T10:30:00Z",
"displayName": "Acme Holdings LLC",
"verificationLink": {
"sessionId": "vsess_abc123",
"verificationUrl": "https://verify.infinite.dev/?sessionId=vsess_abc123",
"expiresAt": "2026-01-09T10:30:00Z",
"status": "ACTIVE"
}
}Create a new associated business
Create a business associated entity for a business customer using a flat request body. Use this endpoint for intermediate business owners in a nested ownership tree. After creating the business, create its child owners using the associated entity endpoints and set parentEntityId to the returned associated business ID.
# Requires: npm i -g @infinite_dev/cli && export INFINITE_API_KEY=sk_sandbox_...
# Escape hatch for any endpoint: infinite api <METHOD> <path>
infinite api POST /v1/customers/cus_abc123/associated_businesses \
--body '<request-json>'Create a new associated business (cus_abc123).
# Infinite MCP is read-only for this endpoint — use a dedicated MCP tool when one exists, otherwise run the CLI tab.import requests
url = "https://sandbox.api.infinite.dev/v1/customers/{customerId}/associated_businesses"
payload = {
"countryCode": "US",
"hasOwnership": True,
"hasControl": True,
"businessName": "Acme Holdings LLC",
"parentEntityId": "asp_abc123",
"email": "<string>",
"phone": "<string>",
"ownershipPercentage": 50,
"isSigner": True,
"isDirector": True,
"attestedOwnershipStructureAt": "2026-06-01T10:45:05Z",
"relationshipDate": "2020-01-15",
"generateVerificationLink": True,
"sendInvite": True,
"registrationNumber": "<string>",
"dateOfIncorporation": "2018-06-15",
"supportingDocuments": [
{
"file": "doc_abc123",
"requirementId": "<string>",
"type": "PROOF_OF_ADDRESS",
"subtype": "UTILITY_BILL",
"description": "Passport issued in 2020",
"remarks": "Uploaded to support proof of business address"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
countryCode: 'US',
hasOwnership: true,
hasControl: true,
businessName: 'Acme Holdings LLC',
parentEntityId: 'asp_abc123',
email: '<string>',
phone: '<string>',
ownershipPercentage: 50,
isSigner: true,
isDirector: true,
attestedOwnershipStructureAt: '2026-06-01T10:45:05Z',
relationshipDate: '2020-01-15',
generateVerificationLink: true,
sendInvite: true,
registrationNumber: '<string>',
dateOfIncorporation: '2018-06-15',
supportingDocuments: [
{
file: 'doc_abc123',
requirementId: '<string>',
type: 'PROOF_OF_ADDRESS',
subtype: 'UTILITY_BILL',
description: 'Passport issued in 2020',
remarks: 'Uploaded to support proof of business address'
}
]
})
};
fetch('https://sandbox.api.infinite.dev/v1/customers/{customerId}/associated_businesses', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://sandbox.api.infinite.dev/v1/customers/{customerId}/associated_businesses",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'countryCode' => 'US',
'hasOwnership' => true,
'hasControl' => true,
'businessName' => 'Acme Holdings LLC',
'parentEntityId' => 'asp_abc123',
'email' => '<string>',
'phone' => '<string>',
'ownershipPercentage' => 50,
'isSigner' => true,
'isDirector' => true,
'attestedOwnershipStructureAt' => '2026-06-01T10:45:05Z',
'relationshipDate' => '2020-01-15',
'generateVerificationLink' => true,
'sendInvite' => true,
'registrationNumber' => '<string>',
'dateOfIncorporation' => '2018-06-15',
'supportingDocuments' => [
[
'file' => 'doc_abc123',
'requirementId' => '<string>',
'type' => 'PROOF_OF_ADDRESS',
'subtype' => 'UTILITY_BILL',
'description' => 'Passport issued in 2020',
'remarks' => 'Uploaded to support proof of business address'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://sandbox.api.infinite.dev/v1/customers/{customerId}/associated_businesses"
payload := strings.NewReader("{\n \"countryCode\": \"US\",\n \"hasOwnership\": true,\n \"hasControl\": true,\n \"businessName\": \"Acme Holdings LLC\",\n \"parentEntityId\": \"asp_abc123\",\n \"email\": \"<string>\",\n \"phone\": \"<string>\",\n \"ownershipPercentage\": 50,\n \"isSigner\": true,\n \"isDirector\": true,\n \"attestedOwnershipStructureAt\": \"2026-06-01T10:45:05Z\",\n \"relationshipDate\": \"2020-01-15\",\n \"generateVerificationLink\": true,\n \"sendInvite\": true,\n \"registrationNumber\": \"<string>\",\n \"dateOfIncorporation\": \"2018-06-15\",\n \"supportingDocuments\": [\n {\n \"file\": \"doc_abc123\",\n \"requirementId\": \"<string>\",\n \"type\": \"PROOF_OF_ADDRESS\",\n \"subtype\": \"UTILITY_BILL\",\n \"description\": \"Passport issued in 2020\",\n \"remarks\": \"Uploaded to support proof of business address\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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))
}HttpResponse<String> response = Unirest.post("https://sandbox.api.infinite.dev/v1/customers/{customerId}/associated_businesses")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"countryCode\": \"US\",\n \"hasOwnership\": true,\n \"hasControl\": true,\n \"businessName\": \"Acme Holdings LLC\",\n \"parentEntityId\": \"asp_abc123\",\n \"email\": \"<string>\",\n \"phone\": \"<string>\",\n \"ownershipPercentage\": 50,\n \"isSigner\": true,\n \"isDirector\": true,\n \"attestedOwnershipStructureAt\": \"2026-06-01T10:45:05Z\",\n \"relationshipDate\": \"2020-01-15\",\n \"generateVerificationLink\": true,\n \"sendInvite\": true,\n \"registrationNumber\": \"<string>\",\n \"dateOfIncorporation\": \"2018-06-15\",\n \"supportingDocuments\": [\n {\n \"file\": \"doc_abc123\",\n \"requirementId\": \"<string>\",\n \"type\": \"PROOF_OF_ADDRESS\",\n \"subtype\": \"UTILITY_BILL\",\n \"description\": \"Passport issued in 2020\",\n \"remarks\": \"Uploaded to support proof of business address\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.api.infinite.dev/v1/customers/{customerId}/associated_businesses")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"countryCode\": \"US\",\n \"hasOwnership\": true,\n \"hasControl\": true,\n \"businessName\": \"Acme Holdings LLC\",\n \"parentEntityId\": \"asp_abc123\",\n \"email\": \"<string>\",\n \"phone\": \"<string>\",\n \"ownershipPercentage\": 50,\n \"isSigner\": true,\n \"isDirector\": true,\n \"attestedOwnershipStructureAt\": \"2026-06-01T10:45:05Z\",\n \"relationshipDate\": \"2020-01-15\",\n \"generateVerificationLink\": true,\n \"sendInvite\": true,\n \"registrationNumber\": \"<string>\",\n \"dateOfIncorporation\": \"2018-06-15\",\n \"supportingDocuments\": [\n {\n \"file\": \"doc_abc123\",\n \"requirementId\": \"<string>\",\n \"type\": \"PROOF_OF_ADDRESS\",\n \"subtype\": \"UTILITY_BILL\",\n \"description\": \"Passport issued in 2020\",\n \"remarks\": \"Uploaded to support proof of business address\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": "asp_abc123",
"createdAt": "2026-01-15T10:30:00Z",
"updatedAt": "2026-01-15T10:30:00Z",
"entityType": "BUSINESS",
"hasOwnership": true,
"hasControl": true,
"parentEntityId": "asp_parent123",
"details": {
"firstName": "John",
"nickname": "Johnny",
"lastName": "Doe",
"middleName": "Michael",
"dateOfBirth": "1985-03-15",
"taxResidenceCountry": "GB",
"transliteratedFirstName": "<string>",
"transliteratedMiddleName": "<string>",
"transliteratedLastName": "<string>",
"taxIdentificationDocumentType": "UTR"
},
"countryCode": "US",
"email": "contact@acmeholdings.com",
"phone": "+14155551234",
"address": {
"addressLine1": "123 Main Street",
"city": "San Francisco",
"postalCode": "94102",
"country": "US",
"addressLine2": "Apt 4B",
"state": "CA",
"transliterated": {
"addressLine1": "123 Main Street",
"addressLine2": "Apt 4B",
"city": "Beijing",
"state": "Hebei"
}
},
"ownershipPercentage": 51,
"isSigner": false,
"isDirector": false,
"role": "CEO",
"title": "Managing Director",
"documents": [
"doc_abc123"
],
"attestedOwnershipStructureAt": "2026-01-15T10:30:00Z",
"displayName": "Acme Holdings LLC",
"verificationLink": {
"sessionId": "vsess_abc123",
"verificationUrl": "https://verify.infinite.dev/?sessionId=vsess_abc123",
"expiresAt": "2026-01-09T10:30:00Z",
"status": "ACTIVE"
}
}Authorizations
API Key in Bearer format (e.g., Bearer sk_test_...)
Headers
API key
Idempotency key for preventing duplicate requests
Path Parameters
An ID that uniquely identifies a customer resource
"cus_1234567890abcdef"
Body
New associated business to be created
Country code (ISO 3166-1 alpha-2). Nationality for individuals, country of incorporation for businesses.
"US"
Whether this entity is an owner. For an individual with indirect ownership whose percentage is not quantified, omit ownershipPercentage and set this to true to identify them as a beneficial owner.
Has significant control (e.g. CEO, managing member). A control person satisfies the business submission requirement when no individual holds 25% or more effective ownership.
Business name
"Acme Holdings LLC"
Parent entity ID for nested ownership. Use the associated business entity ID returned from the associated entity endpoints when linking a child owner beneath an intermediate business owner.
"asp_abc123"
Email address. Required when generateVerificationLink is true.
Phone number
Address. Use the nested transliterated field for Latin character versions of non-Latin addresses.
Show child attributes
Show child attributes
Ownership percentage
0 <= x <= 100Has signing authority
Is a director
Structured role at the company.
CEO, CFO, COO, PRESIDENT, GENERAL_COUNSEL, MANAGING_MEMBER, TREASURER, OTHER Timestamp when ownership structure was attested
"2026-06-01T10:45:05Z"
Date when the relationship with this entity was established (YYYY-MM-DD).
"2020-01-15"
When true, generates a verification link for this UBO to complete their KYC. The link will be returned in the response.
true
When true (and generateVerificationLink is also true), sends an email invitation to the UBO to complete their KYC verification.
true
Business registration number
Date of incorporation (YYYY-MM-DD)
"2018-06-15"
Business address
Show child attributes
Show child attributes
Supporting document references
Show child attributes
Show child attributes
Response
Associated business created successfully
Unique identifier
"asp_abc123"
Created timestamp
"2026-01-15T10:30:00Z"
Last updated timestamp
"2026-01-15T10:30:00Z"
Type of entity
INDIVIDUAL, BUSINESS "BUSINESS"
Whether this entity is an owner. For an individual with indirect ownership whose percentage is not quantified, omit ownershipPercentage and set this to true to identify them as a beneficial owner.
true
Has significant control (e.g. CEO, managing member). A control person satisfies the business submission requirement when no individual holds 25% or more effective ownership.
true
Parent entity ID for nested ownership. Use the associated business entity ID returned from the associated entity endpoints when linking a child owner beneath an intermediate business owner.
"asp_parent123"
Type-specific details (individual or business)
- Option 1
- Option 2
Show child attributes
Show child attributes
Country code (ISO 3166-1 alpha-2)
"US"
Email address
"contact@acmeholdings.com"
Phone number
"+14155551234"
Address. Use the nested transliterated field for Latin character versions of non-Latin addresses.
Show child attributes
Show child attributes
Ownership percentage
51
Has signing authority
false
Is a director
false
Structured role at the company.
CEO, CFO, COO, PRESIDENT, GENERAL_COUNSEL, MANAGING_MEMBER, TREASURER, OTHER Custom title at the company.
"Managing Director"
Array of document IDs
["doc_abc123"]
Timestamp when ownership structure was attested
"2026-01-15T10:30:00Z"
Display name
"Acme Holdings LLC"
Verification link for UBO KYC. Present on create (when generateVerificationLink is true) and on single entity GET if there is an active/pending verification session.
Show child attributes
Show child attributes
Was this page helpful?