Wallets API
Who many wallets are
Whether each of up to 30 addresses on one chain is a known exchange, a tagged protocol or program, or has a registered domain name, in one request. SOL, ETH, BASE and BNB.
/api/external/wallet-analysis/wallet-labels-batch/{chain}What it returns
The wallet-labels answer — a known exchange, a tagged protocol or program, a registered name — for many addresses on one chain in one request. SOL, ETH, BASE and BNB. Each result is exactly what wallet-labels answers for that address, with the same caveats on every field. POST, because the list is the subject: it can run past what a URL comfortably holds, and a body keeps a watch list out of every proxy log between the caller and this service.
Chains
- Solana SOL
- BNB Chain BNB
- Ethereum ETH
- Base BASE
Request
Send your key in the x-dex-data-key header. Replace each <placeholder> with a real value.
curl -X POST -H "x-dex-data-key: $DEXDATA_API_KEY" \
-H "content-type: application/json" \
-d '{"subjects":["<subjects>"]}' \
"https://api.dexdata.io/api/external/wallet-analysis/wallet-labels-batch/SOL"| Parameter | Description |
|---|---|
chainpath · string · required | The chain every address in the batch belongs to. SOL, ETH, BASE and BNB; every other chain returns 400 — this resource is not offered there. |
subjectsbody · string[] · optional | Wallet addresses: base58 on SOL, 0x-prefixed on ETH, BASE and BNB. Between 1 and 30, each sent once. |
Response fields
A JSON response. Every field is always present; null means the value could not be established, never zero.
| Field | Type | Description |
|---|---|---|
results | object[] | One entry per requested subject, in the order they were sent. |
results[].subject | string | The subject exactly as it was sent. |
results[].result | object | null | What the single-subject endpoint answers for this subject. null only when error is set. |
results[].result.type | string | null | Always null on ETH, BASE and BNB. The underlying source's own taxonomy for what this address IS -- e.g. "wallet", "protocol", "program", "token". Published verbatim; never invented and never normalised into a fixed enum, because doing so would assert a category the source did not actually send. May be the fixed redaction string described below if the source's own answer named one of this surface's upstream data providers. |
results[].result.entity | string | null | The named entity behind this address, when the underlying source recognises one -- e.g. "KuCoin", "Raydium AMM V4". LABEL CONTENT IS NOT GUARANTEED CORRECT even when this field is populated: measured live 2026-09-17, an independently-verified address (the base token program nearly every token on this chain uses) was confidently labelled as an unrelated entity by the underlying source, while two other independently-verified addresses labelled correctly in the same pass. Treat a populated value as a best-effort identification, not a verified fact -- EXCEPT for a small, fixed set of public, immutable Solana program addresses (the System Program, the SPL Token Program, Token-2022, the Associated Token Account Program), where this is corrected to the permanent, independently-verified identity rather than the source's own answer. May also be the fixed redaction string described on label below if the source's own answer named one of this surface's upstream data providers. |
results[].result.label | string | null | A more specific label than entity -- e.g. "KuCoin Deposit Wallet". Same accuracy caveat, and the same canonical-program exception, as entity above. If the underlying source's own answer named one of this surface's own upstream data providers, this field (and type/entity/category, and any matching entry in tags/domains) is replaced with the fixed string "[redacted: named one of this surface's own data providers]" rather than emptied to null or dropped -- null on this surface means "no data"; a redaction means the opposite, that the source DID answer and part of it is deliberately withheld. |
results[].result.category | string | null | Always null on ETH, BASE and BNB. The underlying source's own category for the entity -- e.g. "Program", "Deposit Address", "Vault". Same accuracy caveat, and the same canonical-program exception, as entity above. May be the fixed redaction string described on label above. |
results[].result.tags | string[] | null | The underlying source's own tags for this address. [] when the source knows the address but tags nothing; null when its record carried no tag list. Any entry naming one of this surface's own upstream data providers is replaced in place with the fixed redaction string described on label above, rather than removed, so the array's length still reflects what the source sent. |
results[].result.domains | string[] | null | Domain names (e.g. ".sol") registered to this address. On ETH and BASE, at most the address's own primary name (e.g. ".eth"), and only when it resolves back to this address. [] when checked and none. null when not checked: always on BNB, where no name service answers, and on BASE when the name could not be asked. A wallet squatting a domain naming one of this surface's own upstream data providers is a demonstrated, not hypothetical, risk on this field, so any matching entry is redacted in place with the fixed string described on label above, the same way as tags. |
results[].error | string | null | null, or unavailable when no source could be reached for this subject — retry it. A subject nobody has data for is NOT an error: its result says so. |
Start building with DexData today
Sign in, create a key and make your first call in a minute. Free credits every month, and you only pay for calls that succeed.
Get a free API key