Merkl Developer Portal logo
get

/v4/analytics/beneficial-owners/holders

Flat beneficial-owner mapping for a token

Who owns how much of token, including value held indirectly through vaults, markets, gauges and LP positions. The ownership graph reduced by owner: an address holding the asset through several routes appears once, summed. at is required — there is no implicit latest snapshot. 409 SNAPSHOT_NOT_INDEXED when any source in the graph is not indexed up to at; the response then also carries available (the latest at that would succeed now) and lagSeconds. 403 when any node in the graph holds confidential balances the caller may not read.

Query parameters

chainIdstring (integer) | integer
required

Chain ID

tokenstring
required
atstring (integer) | integer
required

Unix timestamp

minAmountstring

Responses

200
Response for status 200
Schema
object
assetobject
required
chainIdnumber
required
addressstring
required
symbolstring
required
decimalsnumber
required
atnumber
required
totalstring
required
holderCountnumber
required
holdersobject[]
required
ownerstring
amountstring
sharestring
Example
{
  "asset": {
    "chainId": 0,
    "address": "string",
    "symbol": "string",
    "decimals": 0
  },
  "at": 0,
  "total": "string",
  "holderCount": 0,
  "holders": [
    {
      "owner": "string",
      "amount": "string",
      "share": "string"
    }
  ]
}
409
Response for status 409
Schema
object
typestring
required
default: "/errors/conflict"
titlestring
required
default: "Conflict"
statusnumber
required
default: 409
detailstring
required
error"SNAPSHOT_NOT_INDEXED"
required
messagestring
required
requestednumber
required
availablenumber
required
lagSecondsnumber
required
totalSourcesnumber
required
laggingCountnumber
required
neverIndexedCountnumber
required
laggingSourcesobject[]
required
indexingIdstring
frontiernumber
statusenumunregisteredregistered-no-rangelagging
parentIndexingIdstring
pathstring[]
depthnumber
chainIdnumber
processorTypestring
protocolstring
targetTokenstring
recipientstring
configobject
countsByStatusobject
required
unregisterednumber
required
registeredNoRangenumber
required
laggingnumber
required
truncatedobject
required
unregisteredboolean
required
registeredNoRangeboolean
required
laggingboolean
required
Example
{
  "type": "/errors/conflict",
  "title": "Conflict",
  "status": 409,
  "detail": "string",
  "error": "SNAPSHOT_NOT_INDEXED",
  "message": "string",
  "requested": 0,
  "available": 0,
  "lagSeconds": 0,
  "totalSources": 0,
  "laggingCount": 0,
  "neverIndexedCount": 0,
  "laggingSources": [
    {
      "indexingId": "string",
      "frontier": 0,
      "status": "unregistered",
      "parentIndexingId": "string",
      "path": [
        "string"
      ],
      "depth": 0,
      "chainId": 0,
      "processorType": "string",
      "protocol": "string",
      "targetToken": "string",
      "recipient": "string",
      "config": {}
    }
  ],
  "countsByStatus": {
    "unregistered": 0,
    "registeredNoRange": 0,
    "lagging": 0
  },
  "truncated": {
    "unregistered": false,
    "registeredNoRange": false,
    "lagging": false
  }
}