---
title: "Deployer signal alert feed on Robinhood Chain (BASIC+)"
method: GET
path: "/rhc/deployer-hunter/alerts"
tags: ["Robinhood Chain"]
---

# Deployer signal alert feed on Robinhood Chain (BASIC+)

`GET /rhc/deployer-hunter/alerts`

## Request

- Base URL: `https://madeonsol.com/api/v1`
- URL: `https://madeonsol.com/api/v1/rhc/deployer-hunter/alerts`
- Auth: HTTP bearer

The deployer alert feed on Robinhood Chain (from `rhc_deployer_alerts`) — new deploys and graduations from tracked deployers, newest first. RHC domain values differ from Solana: `tier` is elite | good | neutral | spammer, `priority` is high | medium, `alert_type` is new_deploy | graduated (RHC has no bonded/kol_buy alert types, and no KOL-buy enrichment).

**Two behaviours changed 2026-07-25.** (1) A tradability filter is now applied **BY DEFAULT** (`liquidity_usd >= $100`; unknown liquidity fails it) — the feed was serving alerts on tokens that had pumped and drained, one at $45K MC against $68 of liquidity. Pass `include_untradeable=true` for the raw tape; the active filter is echoed as `tradability_filter`. (2) `tier` and the `message` explaining it are now resolved at **READ time** from the live deployer rollup instead of being frozen at insert, so a demoted deployer can no longer be advertised as good-tier indefinitely. The original snapshot is preserved as `tier_at_alert`, with `tier_is_stale` flagging disagreement. Rows also carry `liquidity_usd` and `current_mc_usd`.

**Paging (2026-09-21, audit F09 follow-up):** the tradability and tier gates are served by a bounded SCAN over (event_at DESC, id DESC) — `has_more` is false only at the real end, `scan.scan_truncated` says the budget ran out first; page with `cursor=` (`next_cursor`). Alerts with a NULL event_at (none in production) are excluded.

Tier: **BASIC** (any valid key) — **ULTRA** gets the full requested `limit`, while BASIC/PRO share a 50-alert cap per request.

## Query parameters

- `deployer_tier` 'elite' | 'good' | 'neutral' | 'spammer'
- `include_untradeable` boolean
- `priority` 'high' | 'medium'
- `alert_type` 'new_deploy' | 'graduated'
- `launchpad` string
- `min_mc` number
- `limit` integer
- `since` string, date-time
- `before` string, date-time
- `offset` integer
- `cursor` string

## Response `200`

`next_event_at` is the newest event_at on the page (poll cursor); `data_age_seconds` is the age of the newest alert.

- object
  - `chain` 'robinhood'
  - `alerts` object[]
    - `id` string
    - `deployer_address` string: Deployer wallet (0x).
    - `token_address` string
    - `token_symbol` string, nullable
    - `token_name` string, nullable
    - `alert_type` 'new_deploy' | 'graduated'
    - `title` string, nullable
    - `message` string, nullable
    - `launchpad` string, nullable
    - `tier` 'elite' | 'good' | 'neutral' | 'spammer', nullable: Deployer reputation tier resolved at READ time from the live deployer rollup (falls back to the snapshot when the deployer is not in the rollup).
    - `tier_at_alert` 'elite' | 'good' | 'neutral' | 'spammer', nullable: Snapshot of the tier written when the alert fired.
    - `tier_is_stale` boolean: true when the read-time tier differs from tier_at_alert.
    - `mc_at_alert` number, nullable: Market cap when the alert fired (USD).
    - `liquidity_usd` number, nullable: Token liquidity now (USD).
    - `liquidity_basis` 'v4_virtual_ceiling' | 'measured': How liquidity_usd was derived. A uniswap-v4 row passing the $100 tradability filter is a CEILING-pass: its figure is virtual reserves clamped to the PoolManager's total holdings, not measured per-pool TVL.
    - `current_mc_usd` number, nullable: Token market cap now (USD).
    - `risk` RhcTokenRiskSummary, nullable: Precomputed risk summary for a Robinhood Chain token, from the same engine as `/rhc/tokens/{address}/risk` (proxy resolution, capability scan, and a live router sell-simulation). **`null` means NOT ASSESSED, not safe.** The sweep covers tokens with liquidity on a ~24h rotation, so a brand-new or illiquid token has no row yet. These values are a SNAPSHOT — always read `checked_at`. Sellability can change the moment an owner flips a setting, which is why `/rhc/tokens/{address}/risk` is computed live and never served from this cache. Use this to triage a feed; use the live endpoint before acting on a single token.
      - `sellable` 'yes' | 'no' | 'unknown', nullable: `no` means a sell was simulated through the router and REVERTED — bought-but-cannot-sell.
      - `upgradeable` boolean, nullable: Token is a proxy whose implementation can be swapped (EIP-1967 / beacon / legacy). EIP-1167 minimal proxies are NOT upgradeable — the target is baked into immutable code.
      - `score` integer, nullable: 0–100, conservative. Absence of evidence is not evidence of safety.
      - `checked_at` string, date-time: When this assessment was computed.
    - `priority` 'high' | 'medium'
    - `is_active` boolean
    - `created_at` string, date-time
    - `event_at` string, date-time, nullable
  - `limit` integer
  - `offset` integer
  - `tradability_filter` string: The active tradability gate, echoed: `liquidity_usd >= $100`, or `off (include_untradeable=true)`.
  - `liquidity_note` string: Constant statement of the uniswap-v4 ceiling semantics — a v4 row passing the tradability filter is a ceiling-pass; per-row `liquidity_basis` says which rows that applies to.
  - `next_event_at` string, date-time, nullable: Newest event_at on this page — pass as ?since= to poll forward.
  - `next_before` string, date-time, nullable: Legacy cursor — event_at of the last row consumed (returned or gated out); pass as ?before= to page backward. Strict: skips alerts sharing that event_at. Prefer next_cursor.
  - `next_cursor` string, nullable: Opaque keyset cursor for the next (older) page — pass as `cursor=`. null = end of feed. PREFERRED over the strict-timestamp legacy cursor, which skips same-timestamp siblings of the boundary row.
  - `has_more` boolean: false only when the candidate feed is exhausted (not merely when the page is short).
  - `scan` object: Present when a filter had to be applied after the candidate fetch (audit F09): has_more is then false only when the candidates ran out, and scan_truncated=true means the per-request scan budget ran out first — more matches MAY exist past next_cursor.
    - `post_filtered` boolean
    - `scanned` integer: Candidate rows examined
    - `scan_truncated` boolean: The per-request scan budget ran out before `limit` matches — more matches MAY exist past the cursor/offset
    - `scan_budget` integer
  - `data_age_seconds` integer, nullable

## Other responses

- `400`: Invalid query parameters.
- `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-robinhood-chain-api.md) · [All operations](https://skmtc.dev/madeonsol/apis/madeonsol-robinhood-chain-api/llms.txt) · [OpenAPI document](https://skmtc.dev/madeonsol/apis/madeonsol-robinhood-chain-api/revisions/5db123bfc4d4?raw)
