curl --request POST \
--url https://partners-api.sandbox.securitize.io/investors/v1/onboarding-reliance/investors/{investorId}/wallets/whitelist \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"tokenAddress": "0x3f5a1b2c4d6e8f0a1b3c5d7e9f2a4b6c8d0e1f3a",
"walletAddress": "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
tokenAddress: '0x3f5a1b2c4d6e8f0a1b3c5d7e9f2a4b6c8d0e1f3a',
walletAddress: '0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed'
})
};
fetch('https://partners-api.sandbox.securitize.io/investors/v1/onboarding-reliance/investors/{investorId}/wallets/whitelist', 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}/wallets/whitelist"
payload = {
"tokenAddress": "0x3f5a1b2c4d6e8f0a1b3c5d7e9f2a4b6c8d0e1f3a",
"walletAddress": "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"tokenAddress": "0x3f5a1b2c4d6e8f0a1b3c5d7e9f2a4b6c8d0e1f3a",
"walletAddress": "0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed",
"status": "processing"
}Whitelist a wallet on a token
Registers an investor’s EVM wallet on a token’s on-chain registry, so the wallet can receive and hold that token. EVM only. The token must be one Securitize enabled for your account: you receive the token contract addresses from Securitize.
The wallet does not need to be registered first: whitelisting also registers it with the investor and adds it to your wallet list (unless the result is rejected). An investor you have limited access to can be whitelisted too.
Checks, in order — each one stops the request and nothing is written:
- the token is enabled for your account — else
403 token_not_enabled; - the investor’s
statusisverified— else422 investor_not_verified; - the investor’s suitability is verified:
usalways, pluseu(the DLT test) when the investor’s address is in the European Economic Area — else422 suitability_not_verified, withdetails.notVerifiednaming which; - the address is not held by another investor — else
409 wallet_conflict; - the token’s issuer accepts investors from the investor’s country — else
422 country_not_allowed.
The answer is immediate; the whitelisting is not. status reads processing while the wallet is registered on-chain, then whitelisted. Poll GET /investors/{investorId}/wallets/whitelist for the final state; there are no callbacks. If it stays processing longer than a day, contact Securitize with the correlationId.
When the token’s on-chain registry already holds the wallet for this investor, status is whitelisted at once. That happens when the token shares its registry with another token the wallet is whitelisted on: one registration covers every token on that registry.
Repeating the call is safe: it answers 201 with the current state and creates nothing new. There is no call to remove a whitelisting.
curl --request POST \
--url https://partners-api.sandbox.securitize.io/investors/v1/onboarding-reliance/investors/{investorId}/wallets/whitelist \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"tokenAddress": "0x3f5a1b2c4d6e8f0a1b3c5d7e9f2a4b6c8d0e1f3a",
"walletAddress": "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
tokenAddress: '0x3f5a1b2c4d6e8f0a1b3c5d7e9f2a4b6c8d0e1f3a',
walletAddress: '0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed'
})
};
fetch('https://partners-api.sandbox.securitize.io/investors/v1/onboarding-reliance/investors/{investorId}/wallets/whitelist', 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}/wallets/whitelist"
payload = {
"tokenAddress": "0x3f5a1b2c4d6e8f0a1b3c5d7e9f2a4b6c8d0e1f3a",
"walletAddress": "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"tokenAddress": "0x3f5a1b2c4d6e8f0a1b3c5d7e9f2a4b6c8d0e1f3a",
"walletAddress": "0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed",
"status": "processing"
}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 token and the investor's EVM wallet to whitelist on it.
Response
Accepted. Read status; poll the list until it leaves processing.
A whitelisting request and its current state.
processing— on its way to the chain. Keep polling the list.whitelisted— registered on-chain: the wallet can receive the token.rejected— the address failed Securitize's risk check. Use another wallet; repeating returnsrejectedagain.failed— not registered on-chain. Repeat the request once; if it still readsfailed, contact Securitize support.
Treat any other value as "not whitelisted".
processing, whitelisted, rejected, failed