> ## Documentation Index
> Fetch the complete documentation index at: https://docs.alterscope.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Build a curator scoreboard

> Pull cross-protocol track records and rank curators.

You want a public dashboard or internal review tool that ranks vault curators by realized risk-adjusted return, not by self-reported APY.

## What you build

A small scheduled job that hits the curator endpoints, joins them by address, and writes the result to your database.

## 1. List curator addresses you care about

A curator profile is keyed by the manager address. You can either supply a list (your watchlist) or page over `GET /v2/curators` if your tier permits.

## 2. Pull each profile + track record

<CodeGroup>
  ```python python theme={null}
  from alterscope import AlterscopeClient

  client = AlterscopeClient(api_key="sk_live_...")
  addresses = ["0xabc...", "0xdef...", "0x123..."]

  rows = []
  for addr in addresses:
      profile = client.curators.get(addr)
      track = client.curators.track_record(addr)
      rows.append({
          "address": addr,
          "name": profile.display_name,
          "tenure_days": profile.tenure_days,
          "tvl_managed_usd": profile.tvl_managed_usd,
          "realized_sharpe_1y": track.realized_sharpe_1y,
          "max_drawdown_1y_bps": track.max_drawdown_1y_bps,
      })

  rows.sort(key=lambda r: r["realized_sharpe_1y"], reverse=True)
  for r in rows:
      print(r)
  ```

  ```bash curl theme={null}
  for addr in 0xabc 0xdef 0x123; do
    curl -s -H "Authorization: Bearer $ALTERSCOPE_API_KEY" \
      "https://api.alterscope.org/v2/curators/${addr}/track-record"
  done
  ```
</CodeGroup>

## 3. Refresh policy

Curator data updates on cap changes, fee changes, and at most once per hour for performance metrics. Polling every 15 minutes is wasteful; an hourly job is enough. For change-driven updates, subscribe to `vault.cap.changed` and `vault.fee.changed` via webhooks. If you want curator-scoped signals specifically, the relevant events are `curator.action`, `curator.tenure.start`, and `curator.tenure.end`.

## 4. Troubleshooting

* **Sparse track record**: a curator with `tenure_days < 90` has too little data for a meaningful Sharpe. Hide them or annotate "insufficient history".
* **Address mismatch**: addresses are case-insensitive but checksum-formatted in the API response. Compare with `addr.lower()`.
