curl --request POST \
--url https://partners-api.sandbox.securitize.io/investors/v1/onboarding-reliance/investors/{investorId}/suitability/compact \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"isLicensedSecuritiesProfessional": false,
"isAffiliatedWithSecuritiesFirm": false,
"annualIncome": "100k_to_250k",
"investmentApproach": "aggressive_growth",
"investmentHorizon": "under_3_years",
"lossTolerance": "over_30_percent",
"acceptsIlliquidity": true,
"occupation": "employee",
"declaresLawfulOriginOfFunds": true,
"assetExperience": {
"equities": {
"experience": "some",
"tradingFrequency": "occasionally"
}
},
"declarations": {
"subscriberAgreementReviewed": true,
"formCrsReviewed": true,
"affirmationsConfirmed": true
}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
isLicensedSecuritiesProfessional: false,
isAffiliatedWithSecuritiesFirm: false,
annualIncome: '100k_to_250k',
investmentApproach: 'aggressive_growth',
investmentHorizon: 'under_3_years',
lossTolerance: 'over_30_percent',
acceptsIlliquidity: true,
occupation: 'employee',
declaresLawfulOriginOfFunds: true,
assetExperience: {equities: {experience: 'some', tradingFrequency: 'occasionally'}},
declarations: {
subscriberAgreementReviewed: true,
formCrsReviewed: true,
affirmationsConfirmed: true
}
})
};
fetch('https://partners-api.sandbox.securitize.io/investors/v1/onboarding-reliance/investors/{investorId}/suitability/compact', 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/{investorId}/suitability/compact"
payload = {
"isLicensedSecuritiesProfessional": False,
"isAffiliatedWithSecuritiesFirm": False,
"annualIncome": "100k_to_250k",
"investmentApproach": "aggressive_growth",
"investmentHorizon": "under_3_years",
"lossTolerance": "over_30_percent",
"acceptsIlliquidity": True,
"occupation": "employee",
"declaresLawfulOriginOfFunds": True,
"assetExperience": { "equities": {
"experience": "some",
"tradingFrequency": "occasionally"
} },
"declarations": {
"subscriberAgreementReviewed": True,
"formCrsReviewed": True,
"affirmationsConfirmed": True
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"status": "completed",
"verificationStatus": "verified"
}Send the investor's compact suitability
Records a shorter suitability for an individual — the part of Securitize’s investor profile that a Securitize Markets brokerage account for stocks and ‘40 Act funds requires — in one call, and answers the verdict in the same response. Its fields have the same names and values as the full suitability’s; fields outside the compact set are ignored. It can be sent at any investor status, and for an investor you have limited access to.
Individuals only. An entity answers 422 with details.reason: investor_type_not_supported and nothing is stored: send it the full suitability.
The verdict is in verificationStatus, decided as for the full suitability:
verified—investmentApproachisaggressive_growth,lossToleranceisover_30_percent,acceptsIlliquidityistrue, and bothisLicensedSecuritiesProfessionalandisAffiliatedWithSecuritiesFirmarefalse. Once the investor’s ownstatus(GET /investors/{investorId}) isverified, their Securitize Markets brokerage account is approved too.rejected—investmentApproachis notaggressive_growth,lossToleranceis notover_30_percent, oracceptsIlliquidityisfalse, whatever the other answers. A Securitize Markets brokerage account is not available to the investor; tell them: “Based on your answers, a Securitize Markets brokerage account is not available to you at this time.”processing— the answers above qualify, butisLicensedSecuritiesProfessionalorisAffiliatedWithSecuritiesFirmistrue. Securitize’s compliance team reviews the account and may contact the investor; theinvestor.suitability.updatedwebhook announces its decision.
Securitize can change which answers lead to each verdict: act on the verificationStatus you receive, not on the answers you sent.
Decided once. Once the verdict is verified, or the full suitability is complete — sent by you, another partner or the investor on Securitize — a call writes nothing and answers 200 with the current state. While the verdict is processing or rejected, a call answers 422 with details.reason suitability_under_review or suitability_not_approved and stores nothing. A retry after a timeout therefore answers the verdict the first call reached.
Toward the full suitability. The compact answers are recorded on the same questions as the full suitability. While the verdict is verified, the investor can complete the full one later, through POST /investors/{investorId}/suitability or on Securitize.
An invalid body answers 400 with every field to fix and stores nothing. employerName is required when isLicensedSecuritiesProfessional is true, and refused when it is false. The three declarations must be true: they are the same block as the full suitability’s.
curl --request POST \
--url https://partners-api.sandbox.securitize.io/investors/v1/onboarding-reliance/investors/{investorId}/suitability/compact \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"isLicensedSecuritiesProfessional": false,
"isAffiliatedWithSecuritiesFirm": false,
"annualIncome": "100k_to_250k",
"investmentApproach": "aggressive_growth",
"investmentHorizon": "under_3_years",
"lossTolerance": "over_30_percent",
"acceptsIlliquidity": true,
"occupation": "employee",
"declaresLawfulOriginOfFunds": true,
"assetExperience": {
"equities": {
"experience": "some",
"tradingFrequency": "occasionally"
}
},
"declarations": {
"subscriberAgreementReviewed": true,
"formCrsReviewed": true,
"affirmationsConfirmed": true
}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
isLicensedSecuritiesProfessional: false,
isAffiliatedWithSecuritiesFirm: false,
annualIncome: '100k_to_250k',
investmentApproach: 'aggressive_growth',
investmentHorizon: 'under_3_years',
lossTolerance: 'over_30_percent',
acceptsIlliquidity: true,
occupation: 'employee',
declaresLawfulOriginOfFunds: true,
assetExperience: {equities: {experience: 'some', tradingFrequency: 'occasionally'}},
declarations: {
subscriberAgreementReviewed: true,
formCrsReviewed: true,
affirmationsConfirmed: true
}
})
};
fetch('https://partners-api.sandbox.securitize.io/investors/v1/onboarding-reliance/investors/{investorId}/suitability/compact', 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/{investorId}/suitability/compact"
payload = {
"isLicensedSecuritiesProfessional": False,
"isAffiliatedWithSecuritiesFirm": False,
"annualIncome": "100k_to_250k",
"investmentApproach": "aggressive_growth",
"investmentHorizon": "under_3_years",
"lossTolerance": "over_30_percent",
"acceptsIlliquidity": True,
"occupation": "employee",
"declaresLawfulOriginOfFunds": True,
"assetExperience": { "equities": {
"experience": "some",
"tradingFrequency": "occasionally"
} },
"declarations": {
"subscriberAgreementReviewed": True,
"formCrsReviewed": True,
"affirmationsConfirmed": True
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"status": "completed",
"verificationStatus": "verified"
}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 compact suitability of an individual, complete in one call. Each field has the same values as in the full suitability.
Response
The current state. Without a change when the verdict was already verified or the full suitability complete.
The investor's suitability state.
Securitize's verdict. none — not verified. verified — verified. processing — under review by Securitize's compliance team. rejected — not approved. Only verified counts as verified; contact Securitize if another value persists.
none, processing, verified, rejected