curl --request PUT \
--url https://partners-api.sandbox.securitize.io/investors/v1/onboarding-reliance/investors/individual/{investorId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"externalInvestorId": "ind-test-0001",
"investorType": "individual",
"email": "kyc.sandbox+ind0001@test.invalid",
"firstName": "Test_Jane",
"lastName": "Investor-Corrected",
"dateOfBirth": "1990-04-12",
"birthCountry": "US",
"taxId": "123-45-6780",
"taxCountry": "US",
"phone": {
"code": "1",
"number": "5550100001"
},
"address": {
"street": "Corrected Street",
"city": "Boston",
"state": "MA",
"countryCode": "US",
"postalCode": "02101"
}
}
'const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
externalInvestorId: 'ind-test-0001',
investorType: 'individual',
email: 'kyc.sandbox+ind0001@test.invalid',
firstName: 'Test_Jane',
lastName: 'Investor-Corrected',
dateOfBirth: '1990-04-12',
birthCountry: 'US',
taxId: '123-45-6780',
taxCountry: 'US',
phone: {code: '1', number: '5550100001'},
address: {
street: 'Corrected Street',
city: 'Boston',
state: 'MA',
countryCode: 'US',
postalCode: '02101'
}
})
};
fetch('https://partners-api.sandbox.securitize.io/investors/v1/onboarding-reliance/investors/individual/{investorId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://partners-api.sandbox.securitize.io/investors/v1/onboarding-reliance/investors/individual/{investorId}"
payload = {
"externalInvestorId": "ind-test-0001",
"investorType": "individual",
"email": "kyc.sandbox+ind0001@test.invalid",
"firstName": "Test_Jane",
"lastName": "Investor-Corrected",
"dateOfBirth": "1990-04-12",
"birthCountry": "US",
"taxId": "123-45-6780",
"taxCountry": "US",
"phone": {
"code": "1",
"number": "5550100001"
},
"address": {
"street": "Corrected Street",
"city": "Boston",
"state": "MA",
"countryCode": "US",
"postalCode": "02101"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text){
"investorId": "6ace745fab21fd6924a19beb",
"externalInvestorId": "ind-test-0001",
"email": "kyc.sandbox+ind0001@test.invalid",
"status": "none",
"riskLevel": "low",
"createdAt": "2026-10-13T18:11:43.278Z",
"details": {
"firstName": "Test_Jane",
"lastName": "Investor-Corrected",
"dateOfBirth": "1990-04-12T00:00:00.000Z",
"birthCountry": "US",
"taxId": "123-45-6780",
"taxCountry": "US",
"phone": {
"code": "1",
"number": "5550100001"
},
"address": {
"street": "Corrected Street",
"city": "Boston",
"state": "MA",
"countryCode": "US",
"postalCode": "02101"
}
}
}Correct an individual investor
Replaces the person’s record — a typo in a name, a moved address. Accepted any time before you submit the investor, also after its documents are uploaded.
Full replacement, not a merge. Any optional field you omit is cleared (middleName, gender, address.houseNumber, address.state), so send the full record every time. The response echoes what is now stored.
email and externalInvestorId must be the ones you sent at create: neither can change, and a different value answers 422, because a mismatch usually means the wrong investor is being addressed. Contact Securitize support if one must change.
Once the investor is submitted, corrections answer 409 verification_in_review while it is reviewed and 409 verification_already_settled after the verdict.
An investorId that belongs to an entity answers 404 investor_not_found: an investor’s type is fixed at create.
curl --request PUT \
--url https://partners-api.sandbox.securitize.io/investors/v1/onboarding-reliance/investors/individual/{investorId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"externalInvestorId": "ind-test-0001",
"investorType": "individual",
"email": "kyc.sandbox+ind0001@test.invalid",
"firstName": "Test_Jane",
"lastName": "Investor-Corrected",
"dateOfBirth": "1990-04-12",
"birthCountry": "US",
"taxId": "123-45-6780",
"taxCountry": "US",
"phone": {
"code": "1",
"number": "5550100001"
},
"address": {
"street": "Corrected Street",
"city": "Boston",
"state": "MA",
"countryCode": "US",
"postalCode": "02101"
}
}
'const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
externalInvestorId: 'ind-test-0001',
investorType: 'individual',
email: 'kyc.sandbox+ind0001@test.invalid',
firstName: 'Test_Jane',
lastName: 'Investor-Corrected',
dateOfBirth: '1990-04-12',
birthCountry: 'US',
taxId: '123-45-6780',
taxCountry: 'US',
phone: {code: '1', number: '5550100001'},
address: {
street: 'Corrected Street',
city: 'Boston',
state: 'MA',
countryCode: 'US',
postalCode: '02101'
}
})
};
fetch('https://partners-api.sandbox.securitize.io/investors/v1/onboarding-reliance/investors/individual/{investorId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://partners-api.sandbox.securitize.io/investors/v1/onboarding-reliance/investors/individual/{investorId}"
payload = {
"externalInvestorId": "ind-test-0001",
"investorType": "individual",
"email": "kyc.sandbox+ind0001@test.invalid",
"firstName": "Test_Jane",
"lastName": "Investor-Corrected",
"dateOfBirth": "1990-04-12",
"birthCountry": "US",
"taxId": "123-45-6780",
"taxCountry": "US",
"phone": {
"code": "1",
"number": "5550100001"
},
"address": {
"street": "Corrected Street",
"city": "Boston",
"state": "MA",
"countryCode": "US",
"postalCode": "02101"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text){
"investorId": "6ace745fab21fd6924a19beb",
"externalInvestorId": "ind-test-0001",
"email": "kyc.sandbox+ind0001@test.invalid",
"status": "none",
"riskLevel": "low",
"createdAt": "2026-10-13T18:11:43.278Z",
"details": {
"firstName": "Test_Jane",
"lastName": "Investor-Corrected",
"dateOfBirth": "1990-04-12T00:00:00.000Z",
"birthCountry": "US",
"taxId": "123-45-6780",
"taxCountry": "US",
"phone": {
"code": "1",
"number": "5550100001"
},
"address": {
"street": "Corrected Street",
"city": "Boston",
"state": "MA",
"countryCode": "US",
"postalCode": "02101"
}
}
}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
The person being onboarded. The same body creates the investor and, on PUT, replaces it in full: an optional field you omit on PUT is cleared.
Tax identifier. With taxCountry it identifies the person. Stored trimmed and upper-cased. Placeholder values (000000000, 123456789, TEST, N/A, one repeated character, fewer than 4 characters) are refused with 400 validation_error, with or without separators (spaces, dots, dashes, slashes). For a US person (US address and taxCountry US) it is the Social Security number, and verification checks that it matches the name and residential address; a mismatch can send the investor to manual-review. Sandbox does not run that check.
1 - 50"123-45-6780"
Response
Corrected. details is what is now stored; omitted optional fields are absent.
The individual investor as stored, returned by create (201) and correction.
The investor's verification state.
none— created, nothing under review. An investor stays here until you submit it.processing— under review.verified— verified.manual-review— a Securitize operator is reviewing it. Not a rejection.updates-required— Securitize needs updated information; contact Securitize support.expired— the verification lapsed; contact Securitize support.rejected— final.
When status becomes verified — at submit, or after Securitize's screening and compliance review — depends on your agreement with Securitize. Treat any value you do not recognise as "not verified" rather than failing.
none, processing, verified, manual-review, updates-required, expired, rejected