Base URL
Every path in this documentation is relative to the base URL. The token endpoint is the exception: it sits at the host root. Keep both in configuration. Production uses the same paths at a production base URL, with production credentials, arranged with Securitize once your integration passes the go-live checklist.
Get a token
Authentication is OAuth 2.0 client credentials. Exchange the client id and secret Securitize issued you for a bearer token, then send it on every request:200 with { "meta": …, "data": [] } means you are connected. A 401 without a code means the token (below).
- The token lasts 2 hours (
expires_in, in seconds). Cache it and get a new one shortly before it expires, or on the first401. Do not request one per call. - No scope. Send none.
- In the
Authorizationheader only. Never put the token in a URL: URLs end up in logs. - The token identifies your partner account. You never send a partner or tenant id, and every record you create is scoped to your account: your identifiers cannot collide with another partner’s. Another partner’s investor answers
404, as if it did not exist.
https://partners-api.sandbox.securitize.io/webhooks/v1 (Replay and recover).
Keeping secrets and data safe
- The client secret is a secret: keep it in a secrets manager, inject it at runtime, and ask Securitize to rotate it at once if it is exposed. Never put it in source control, scripts or client-side code. Treat the access token the same way while it lives.
- Keep separate credentials for sandbox and production, so production credentials can never reach the sandbox URL or the reverse.
- Call the API from your backend only.
- Identity documents are personal data: never log request bodies with
content; log the documentidandtypefrom the response instead. - The
correlationIdholds no personal data and is safe to log and to share with Securitize support.
When the token is wrong
A missing, expired or unknown token is refused before the request reaches the API, with an OAuth-style body and nocode or correlationId:
Every other error carries a
code and a correlationId. Branch on the status: a 401 without a code always means “get a new token”, whatever the body says.
How sandbox behaves
- Synthetic data only. Sandbox validates requests like production and sends identity documents to a test identity provider. Use
@test.invalidemails and invented names and identifiers. - Documents must be complete image files. A truncated or corrupt file is refused with
422 document_rejected. Use the test files. - Identifiers must change between runs. An
externalInvestorId, tax identifier or email you already used belongs to an existing investor: the same body returns that investor, different data answers409. Generate fresh values for every test run, including when you copy the examples in these docs. - Every submitted investor ends
verified. Sandbox does not producemanual-review,rejectedorupdates-required, and does not check a US person’s tax identifier against their name and address; build those branches from Statuses. - When
verifiedarrives depends on your agreement. Depending on your integration agreement with Securitize, an investor becomesverifiedas soon as the verification is submitted, or once Securitize’s screening answers. Requests and responses are the same in both cases; build your integration to poll until the status leavesprocessing.