- Hosted onboarding is documented. Instead of building onboarding with the API, you can link investors to a page Securitize hosts with only the onboarding steps: identity or business verification, the investment profile and the wallet. The investor comes back to your
partnerUrlwhen done. See Hosted onboarding.
isPoliticallyExposedPersonis optional inPOST /investors/{investorId}/suitability/compact. A compact suitability without it is complete and gets the same verdict. When sent, it is stored andGET /investors/{investorId}/suitability/compactreturns it; when not,answersleaves it out. The full suitability still requires it. See The compact suitability.
- A US person’s
taxIdis checked against their name and address. For an individual with a US address andtaxCountryUS, verification also checks that the Social Security number intaxIdbelongs to the name and residential address sent. Where investors becomeverifiedafter screening, the status staysprocessinguntil the check answers, and a mismatch moves the investor tomanual-review. Where they areverifiedon submission, the status does not change. Sandbox does not run the check. See Statuses.
- Breaking:
address.stateis a US state code. On every create and correction of an individual, a company and a key party,address.statetakes the 2-letter code of a US state orDCwhen that address’scountryCodeisUS, and must be omitted for any other country. A state on an address outside the US, or a US value that is not a state code (New York), answers400 validation_erroronaddress.stateand stores nothing; both were accepted before.nulland an empty string read as omitted, and codes are case-insensitive and stored in upper case. See Create the person.
- Both document routes also take
multipart/form-data, with files of up to 20 MB each.POST /investors/{investorId}/documentsandPOST /investors/{investorId}/key-parties/{keyPartyId}/documentsaccept each file as a part of its own:front, plusbackfor a two-sided identity document, orfilefor a company document, withtype,documentNumberandexpiresAtas text parts. The file’s type is read from its first bytes. The rules and the answers are those of the JSON body, and JSON uploads are unchanged, with their 10 MB limit. A file part over 20 MB answers413 payload_too_large; a part that does not belong to the document, or an empty one, answers400 invalid_document. See Two ways to send the files. 415 mime_not_supportedon the document routes now readsContent-Type must be application/json or multipart/form-data (received: …).
- Document files can be up to 10 MB each, measured on the file itself before base64 (previously 5 MB). This applies to identity documents and company documents alike. A two-sided document travels with both files at the maximum in one call: the request body limit is now about 31 MB. A file over 10 MB still answers
413 payload_too_largeand nothing is stored.
POST /investors/{investorId}/suitabilitydecides an individual’s verdict from the answers. It answersverified,rejected(the investment approach is not aggressive growth, the investor could bear a loss of up to 30% only, or does not accept illiquidity) orprocessing(a licensed securities professional or someone affiliated with a securities firm, reviewed by Securitize’s compliance team). Averifiedsuitability also approves the investor’s Securitize Markets brokerage account once theirstatusisverified.acceptsIlliquidity: falsenow rejects an individual’s suitability. An entity’s suitability still readsverifiedat once. See The verdict.- New operations:
POSTandGET /investors/{investorId}/suitability/compact. A shorter suitability for individuals, the part a Securitize Markets brokerage account for stocks and ‘40 Act funds requires, with a subset of the full suitability’s fields and the same verdicts. An entity answers422withdetails.reason: investor_type_not_supported. See The compact suitability. - Both answer
422 business_rule_violationwithdetails.reasonsuitability_under_revieworsuitability_not_approvedwhile the verdict isprocessingorrejectedand the full suitability is not complete. Nothing is stored; the suitability webhook announces the next decision.
POST /investors/{investorId}/tax-forms/w9requirescertification. The investor certifies the W-9 in your flow on the certification text Securitize publishes, and you send what they agreed to:certifiedAt,signatureName,subjectToBackupWithholding,isUSPerson(true) andcertificationTextVersion(w9-sm-2026-10). A W-9 without it, or with an invalid one, answers400 validation_error. See The certification.- A W-9 subject to backup withholding cannot be sent as data:
subjectToBackupWithholding: trueanswers422 business_rule_violation, withdetails.reasonbackup_withholding_not_supported. - Tax forms no longer wait for the investor to be
verified.POST /investors/{investorId}/tax-formsandPOST /investors/{investorId}/tax-forms/w9accept the form at any point of the verification; neither answers422 investor_not_verifiedany more.
- Authentication is OAuth 2.0 client credentials. Exchange the client id and secret Securitize issues you for a bearer token at
POST https://partners-api.sandbox.securitize.io/oauth2/token, and send it asAuthorization: Beareron every request; it lasts 2 hours. Ask your Securitize contact for client credentials. See Sandbox and authentication. - The gateway answers a missing token with
401 invalid_requestand an unknown or expired one with401 invalid_token, in the OAuth shape{"error", "error_description"}. See When the token is wrong. - The same token reads your webhooks back at
/webhooks/v1/events(Replay and recover). - The token request is in the API reference: Get an access token returns a sandbox token to try the other operations with.
- New webhooks
investor.suitability.updatedandinvestor.dlt_test.updated, in sandbox. Securitize POSTs them to your endpoint every time theverificationStatusof an investor’s suitability or DLT test changes, whoever changed it, with yourinvestorId, yourexternalInvestorIdand the new verdict. See Suitability webhooks. An endpoint without an event-type filter starts receiving them: answer2xxto types you do not handle.
GET /investors/{investorId}/wallets/whitelistreads the tokens’ on-chain registries. After your own whitelistings, it lists every other token enabled for your account whose registry already holds one of your wallets for the investor, aswhitelisted: tokens that share a registry share their whitelistings. See Tokens that share a registry.whitelistedAtis optional: a row is listed without it when you never whitelisted that wallet on a token of the same registry.- A whitelisting reads
whitelistedas soon as the registry holds the wallet, in the list and in the answer ofPOST /investors/{investorId}/wallets/whitelist.
- New operation:
POST /investors/{investorId}/tax-forms/w9sends the fields of a verified investor’s W-9 as JSON, instead of a signed PDF; Securitize generates the form’s PDF and puts it on file, recorded as sent by you. Only the partner that leads the investor’s verification can send it. You collect the investor’s certification in your own flow. See Send a W-9 as data. - A W-9 sent as data does not replace a form on file: new error code
409 tax_form_already_active, withdetails.activeTaxForm. To correct or replace the form, contact Securitize support.
GET /investors/{investorId}takes theinvestorIdSecuritize returns, like every other path that names an investor. It replacesGET /investors/{externalInvestorId}; your own id in that path answers404 investor_not_found. To find an investor by yourexternalInvestorId, filter the list:GET /investors?externalInvestorId=…. The response,includeand the access rules are unchanged.
- New operation:
POST /investors/{investorId}/tax-formssends the tax form a verified investor signed (W-9,W-8BENorW-8BEN-E), as one PDF of up to 10 MB, so Securitize has it on file for withholding. The body ismultipart/form-data: the PDF in thefilepart, withformTypeandsignatureDate. Only the partner that leads the investor’s verification can send it, and each upload replaces the form on file. See Send a tax form. - New error codes:
422 tax_form_type_not_allowed, withdetails.allowed, and502 tax_form_registration_failed.
- New webhook
investor.kyc.updated, in sandbox. Securitize POSTs it to your endpoint every time thestatusof one of your investors changes, with yourinvestorId, yourexternalInvestorIdand the new status. See KYC webhooks; your Securitize contact registers the endpoint and hands you its signing secret.
- Document files can be up to 5 MB each, measured on the file itself before base64 (previously about 1.5 MB). This applies to identity documents and company documents alike. A two-sided document travels with both files at the maximum in one call: the request body limit is now about 16 MB. A file over 5 MB still answers
413 payload_too_largeand nothing is stored.
The SecId API documentation moves to this portal: the API reference, the guides for individuals, companies, wallets, whitelisting, suitability and the DLT test, and the material coding agents read.Changes since the integration manual v1.1 (September 2026):
- An individual’s verification starts with the submit.
POST /investors/{investorId}/verification/submitis now a required step for individuals, as for companies. The document that completes the set answersverification.status: awaiting_submissionand the investor staysnoneuntil you submit. Corrections are accepted until the submit. - Creates are repeatable with the same body. The same create sent again answers
201with the same id; a different body for the sameexternalInvestorIdanswers409. This applies to investors and key parties. - The batch create with documents is removed.
POST /investorsno longer exists; create the investor, then upload its documents one by one. taxIdandtaxCountry(individuals) andentityIdNumber(companies) are required, and placeholder values are refused.- Wallets are identified by their address alone;
titleis no longer accepted. Registering an address the investor already holds answers201, and your list shows the wallets you registered. - New operations: token whitelisting (
/investors/{investorId}/wallets/whitelist), the suitability and the DLT test. - A date of birth after today is refused with
400 validation_error, on individuals and person key parties. - A document’s
contentcan also be a data URL (data:<mime>;base64,…), as a browser’sFileReaderproduces it. - Error messages are clearer and never name internal systems. Branch on
code, as always. A method and path that match no operation answer404 route_not_found.