---
title: "KOL entry order on one token"
method: GET
path: "/kol/tokens/{mint}/entry-order"
tags: ["KOL"]
---

# KOL entry order on one token

`GET /kol/tokens/{mint}/entry-order`

## Request

- Base URL: `https://madeonsol.com/api/v1`
- URL: `https://madeonsol.com/api/v1/kol/tokens/{mint}/entry-order`
- Auth: HTTP bearer

Ordered list of KOL first-buys on a token mint — who got in first, second, etc., with timestamps. Each wallet's FIRST buy is chosen in SQL before the limit (a repeat buyer can no longer crowd later first-time buyers out), ordered deterministically by (traded_at, tx_signature, wallet). The x402 twin returns the same body.

## Path parameters

- `mint` string, required

## Query parameters

- `limit` integer

## Response `200`

OK

- object
  - `token_mint` string
  - `token_name` string, nullable
  - `token_symbol` string, nullable
  - `total_kol_buyers` integer: Distinct KOL wallets with a first buy on this mint — over ALL KOL buyers (first buy per wallet chosen in SQL before the `limit`)
  - `returned` integer: entries.length
  - `has_more` boolean: More KOL buyers exist beyond `limit` (max 100)
  - `complete` true: Entry order is a complete SQL aggregate (no row-clamped sample)
  - `first_buy_at` string, date-time
  - `last_buy_at` string, date-time
  - `span_sec` integer
  - `entries` object[]: Ranked first-buy order, capped at `limit`
    - `rank` integer
    - `kol_name` string, nullable
    - `kol_twitter` string, nullable
    - `wallet` string
    - `strategy_tag` string, nullable
    - `auto_strategy_tag` string, nullable
    - `winrate_7d` number, nullable
    - `winrate_30d` number, nullable
    - `early_entry_pct_30d` number, nullable
    - `percentile_pnl_7d` number, nullable
    - `percentile_winrate_7d` number, nullable
    - `first_buy_at` string, date-time
    - `seconds_after_first` integer
    - `sol_amount` number
    - `token_amount` number
    - `tx_signature` string
  - `delay` string: BASIC tier only, e.g. "5m" — feed is delayed
  - `delay_seconds` integer: BASIC tier only
  - `as_of` string, date-time: BASIC tier only — entries newer than this are hidden
  - `delay_note` string: BASIC tier only
  - `upgrade` string: BASIC tier only

## Other responses

- `401`: Missing or invalid API key, or an expired free-tier key. Authentication-stage error: no `X-RateLimit-*` headers, no `_rid`.
- `403`: Forbidden. One of: the key's tier is below this endpoint's or parameter's gate (`tier_required` with an `upgrade` block); the public demo key used outside its allow-list (`demo_key_endpoint_not_allowed`); an invalid or revoked key; an origin-restricted key called from a disallowed origin (`code` `origin_not_allowed` / `origin_required`). `X-RateLimit-*` headers are present only on `tier_required`.
- `429`: Too many requests. Every 429 carries `Retry-After`. A quota 429 (`rate_limit_exceeded`, with `X-RateLimit-*`), a heavy-query concurrency 429 (`error_kind` `concurrency`/`capacity`), or the per-IP authentication-failure block (30 failed auths/min; plain `error` + `retry_after_seconds`, no `X-RateLimit-*`).
- `500`: Unexpected server error from the route (`Internal server error`, with `_rid`). Safe to retry with backoff. A failed API-key lookup is a 503 `auth_backend_unavailable`, never a 500.
- `503`: Temporarily unavailable — a Postgres statement timeout while the dataset is under load or maintenance (`statement_timeout`, with `X-RateLimit-*` and `_rid`), or the API-key lookup itself unavailable (`auth_backend_unavailable`, authentication stage: no `X-RateLimit-*`, no `_rid`, not counted as a failed authentication). Always carries `Retry-After`; honour it.

---

[API](https://skmtc.dev/madeonsol/apis/madeonsol-api.md) · [All operations](https://skmtc.dev/madeonsol/apis/madeonsol-api/llms.txt) · [OpenAPI document](https://skmtc.dev/madeonsol/apis/madeonsol-api/revisions/96ce84657f55?raw)
