vike
API EndpointsOn-chain

/labels/{address}/provenance

The full label cascade for one address, with per-source attribution and a consensus entity and type.

GET https://data.vike.io/v1/onchain/labels/{address}/provenance

The full label cascade for one address, with per-source attribution: what Arkham, OLI, Blockscout, Dune, the MEW darklist, Etherscan and our own heuristic classifier each claimed, plus a consensus entity and type. Use it when you need to know who said an address is a given exchange, not merely that something did.

Four sources agree on the Binance 14 hot wallet in the capture below, and each names it in its own words. Until 2026-10-19 this route never matched the four raw label dumps (OLI, Blockscout, Dune, the MEW darklist) or Etherscan's tags, so earlier responses carried at most the Arkham-derived source and the heuristic — source_count: 1 for this wallet, and 0 for vitalik.eth.

Sources and consensus differ in shape, and the sources are anonymised on the wire: Wallet labels.

cURL
# who said this address is an exchange: every source's own claim, plus the consensus
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/labels/0x28C6c06298d514Db089934071355E5743bf21d60/provenance"

# only the normalised consensus and how many sources stand behind it
curl -s -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/labels/0x28C6c06298d514Db089934071355E5743bf21d60/provenance" \
  | jq '{consensus, source_count}'

# each source's claim in the provider's own vocabulary, one object per source, to see where sources disagree
curl -s -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/labels/0x28C6c06298d514Db089934071355E5743bf21d60/provenance" \
  | jq '.sources[]'

# a protocol contract rather than an exchange wallet: the same lookup, a different kind of address
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/labels/0xbbbbbbbbbb9cc5e90e3b3af64bdaf62c37eeffcb/provenance"

# WALLET is an address /labels/batch returned with found: false: here it answers found: false with an empty sources list and no consensus
curl -s -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/onchain/labels/$WALLET/provenance" \
  | jq '{found, sources}'
addresspathrequired
Wallet address, 0x-prefixed hex

The complete response for the Binance 14 hot wallet, captured 2026-10-19.

Example response
{
  "address": "0x28C6c06298d514Db089934071355E5743bf21d60",
  "found": true,
  "consensus": {
    "entity": "binance",
    "wallet_type": "cex",
    "cex_product": "retail",
    "user_subtype": "active",
    "risk_flag": null,
    "confidence": "medium"
  },
  "sources": [
    {
      "source": "provider_a",
      "label": "Binance: Hot Wallet (0x28C)",
      "entity": "Binance",
      "category": "Hot Wallet"
    },
    {
      "source": "provider_b",
      "label": "Binance 14",
      "entity": "binance",
      "category": null
    },
    {
      "source": "provider_c",
      "label": "Binance: Hot Wallet",
      "entity": "binance",
      "category": "exchange"
    },
    {
      "source": "provider_d",
      "label": "binance",
      "entity": "binance",
      "category": null
    }
  ],
  "source_count": 4
}

This route returns fewer rows rather than failing when a label source is mid-rebuild, so a thin list is ambiguous: Wallet labels.

cURL
# who said this address is an exchange: every source's own claim, plus the consensuscurl -H "X-API-Key: $VIKE_API_KEY" \  "https://data.vike.io/v1/onchain/labels/0x28C6c06298d514Db089934071355E5743bf21d60/provenance"# only the normalised consensus and how many sources stand behind itcurl -s -H "X-API-Key: $VIKE_API_KEY" \  "https://data.vike.io/v1/onchain/labels/0x28C6c06298d514Db089934071355E5743bf21d60/provenance" \  | jq '{consensus, source_count}'# each source's claim in the provider's own vocabulary, one object per source, to see where sources disagreecurl -s -H "X-API-Key: $VIKE_API_KEY" \  "https://data.vike.io/v1/onchain/labels/0x28C6c06298d514Db089934071355E5743bf21d60/provenance" \  | jq '.sources[]'# a protocol contract rather than an exchange wallet: the same lookup, a different kind of addresscurl -H "X-API-Key: $VIKE_API_KEY" \  "https://data.vike.io/v1/onchain/labels/0xbbbbbbbbbb9cc5e90e3b3af64bdaf62c37eeffcb/provenance"# WALLET is an address /labels/batch returned with found: false: here it answers found: false with an empty sources list and no consensuscurl -s -H "X-API-Key: $VIKE_API_KEY" \  "https://data.vike.io/v1/onchain/labels/$WALLET/provenance" \  | jq '{found, sources}'
Example response
{  "address": "0x28C6c06298d514Db089934071355E5743bf21d60",  "found": true,  "consensus": {    "entity": "binance",    "wallet_type": "cex",    "cex_product": "retail",    "user_subtype": "active",    "risk_flag": null,    "confidence": "medium"  },  "sources": [    {      "source": "provider_a",      "label": "Binance: Hot Wallet (0x28C)",      "entity": "Binance",      "category": "Hot Wallet"    },    {      "source": "provider_b",      "label": "Binance 14",      "entity": "binance",      "category": null    },    {      "source": "provider_c",      "label": "Binance: Hot Wallet",      "entity": "binance",      "category": "exchange"    },    {      "source": "provider_d",      "label": "binance",      "entity": "binance",      "category": null    }  ],  "source_count": 4}