curl --request POST \
--url https://public-api.birdeye.so/identity/v1/multiple \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"addresses": [
"DaP44wF8mKmYki1M5zguvXYAW5XF6sLQEzvdmvcizRqD",
"5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9"
]
}
'import requests
url = "https://public-api.birdeye.so/identity/v1/multiple"
payload = { "addresses": ["DaP44wF8mKmYki1M5zguvXYAW5XF6sLQEzvdmvcizRqD", "5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9"] }
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
addresses: [
'DaP44wF8mKmYki1M5zguvXYAW5XF6sLQEzvdmvcizRqD',
'5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9'
]
})
};
fetch('https://public-api.birdeye.so/identity/v1/multiple', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"success": true,
"data": {
"DaP44wF8mKmYki1M5zguvXYAW5XF6sLQEzvdmvcizRqD": {
"address": "DaP44wF8mKmYki1M5zguvXYAW5XF6sLQEzvdmvcizRqD",
"type": "wallet",
"label": "dap4.sol",
"category": "Wallet",
"tags": [],
"domains": [
"dap4.sol",
"uapx.sol",
"ufox.sol",
"blxme.sol",
"bruca.sol"
],
"domains_total": 2192
},
"5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9": {
"address": "5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9",
"type": "exchange",
"entity": "Binance",
"label": "Binance",
"category": "Exchange",
"tags": [
"Binance"
]
}
}
}{
"success": false,
"message": "Bad request"
}{
"success": false,
"message": "Unauthorized"
}{
"success": false,
"message": "Access Denied"
}{
"success": false,
"message": "Too many requests"
}{
"success": false,
"message": "Internal Server Error"
}Wallet Identity - Multiple
Resolve up to 100 addresses to their identities in one request. Returns a map keyed by address; each value has the same shape as the single endpoint. Addresses with no identity are omitted.
curl --request POST \
--url https://public-api.birdeye.so/identity/v1/multiple \
--header 'Content-Type: application/json' \
--header 'X-API-KEY: <api-key>' \
--data '
{
"addresses": [
"DaP44wF8mKmYki1M5zguvXYAW5XF6sLQEzvdmvcizRqD",
"5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9"
]
}
'import requests
url = "https://public-api.birdeye.so/identity/v1/multiple"
payload = { "addresses": ["DaP44wF8mKmYki1M5zguvXYAW5XF6sLQEzvdmvcizRqD", "5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9"] }
headers = {
"X-API-KEY": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-KEY': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
addresses: [
'DaP44wF8mKmYki1M5zguvXYAW5XF6sLQEzvdmvcizRqD',
'5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9'
]
})
};
fetch('https://public-api.birdeye.so/identity/v1/multiple', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"success": true,
"data": {
"DaP44wF8mKmYki1M5zguvXYAW5XF6sLQEzvdmvcizRqD": {
"address": "DaP44wF8mKmYki1M5zguvXYAW5XF6sLQEzvdmvcizRqD",
"type": "wallet",
"label": "dap4.sol",
"category": "Wallet",
"tags": [],
"domains": [
"dap4.sol",
"uapx.sol",
"ufox.sol",
"blxme.sol",
"bruca.sol"
],
"domains_total": 2192
},
"5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9": {
"address": "5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9",
"type": "exchange",
"entity": "Binance",
"label": "Binance",
"category": "Exchange",
"tags": [
"Binance"
]
}
}
}{
"success": false,
"message": "Bad request"
}{
"success": false,
"message": "Unauthorized"
}{
"success": false,
"message": "Access Denied"
}{
"success": false,
"message": "Too many requests"
}{
"success": false,
"message": "Internal Server Error"
}- Usage Note
- Accessibility
- Chain Supported
Resolve up to 100 addresses to their identities in one request.
POST a list of addresses and get a map keyed by address: { “<address>”: <identity>, … }. Each identity is the same compact object returned by the single endpoint — type (wallet / exchange / protocol / token / …), an optional named entity, a display label, a category, tags, and, for wallets, up to 20 .sol domains plus domains_total. Addresses with no identity (type: unknown) are simply omitted from the map.
For a wallet identified only by a .sol domain, label is set to its first domain (domains[0]). The per-address domains array is a preview capped at 20, ordered shortest-first then alphabetical — use domains_total for the true count and the domains endpoint for the full list. Non-wallet identities never return domains (a CEX “owning” a .sol domain is SNS spam).
- Premium
- Business
- Enterprise
Solana
Identity Field Definitions 🏷️
Identity Field Definitions 🏷️
- type — the identity class:
wallet,exchange,protocol,token,program, orunknown. Drives how a client should render the address. - entity — the named owner when known (e.g.
Binance,Jupiter,Astralane). Absent for anonymous wallets. - label — the human-readable display name. For a domain-only wallet this is the first (shortest)
.soldomain, until the owner’s favourite domain is available. - category — the broad grouping behind the type (e.g.
Wallet,Exchange,Protocol,Token). - tags — extra descriptors attached to the identity (e.g. a KOL’s name,
deposit). Empty array when none apply. - domains / domains_total — the
.soldomains a wallet owns.domainsis capped at 20 and sorted shortest-first then alphabetical;domains_totalis the true count.
Use Cases 💡
Use Cases 💡
- Label every address in an activity feed, leaderboard, or CSV export in a single round-trip.
- Annotate a batch of counterparties from a set of transactions with names, types, and tags.
- Back a UI that renders many addresses at once (holder lists, transfer tables) with identities.
How to Use 🛠️
How to Use 🛠️
- Body:
{ “addresses”: [“<addr1>”, “<addr2>”, … ] }— 1 to 100 addresses. Duplicates are de-duplicated. - Returns
{ “<address>”: <identity>, … }; addresses with no label are omitted (not returned asnull).
Best Practices ✅
Best Practices ✅
- De-duplicate and cap input at 100 per call; page your own list across multiple requests.
- Prefer this over many single calls when labelling more than a couple of addresses.
- Trust each identity’s
domains_total, notdomains.length— the array is a 20-item preview; use thedomainsendpoint for a wallet’s full list.
Limitations ⚠️
Limitations ⚠️
- At most 100 addresses per request.
- Unlabelled addresses (
type: unknown) are omitted from the response map. - Each identity returns at most 20 domains (a preview) — use the
domainsendpoint for the full set. - Domains are returned only for
type: wallet; non-wallet identities suppress them (SNS-spam guard). - Solana only.
Authorizations
API key for authentication
Body
Wallet addresses (or .sol domains) to resolve. Maximum 100; duplicates are de-duplicated.
1 - 100 elementsWas this page helpful?

