Hazard API · for developers

Hazard API

Risk scoring that admits
when it doesn't know.

Real-time, behavioral risk for pump.fun Mayhem coins — the agent selling into the crowd, exit liquidity draining, a rug fingerprint forming. Built for wallets, aggregators and trading tools that want to warn their users before the candle does.

The contract that makes it safe to integrate

Every other risk API returns a number. When it hasn't seen a token, it returns zero — which your users read as "safe." That is the single most dangerous thing a risk feed can do.

Hazard returns HTTP 503 for "unknown," never a reassuring 0. A naive integration — if (resp.ok) allow() — is protected by default, because "we can't see this token" arrives as a failure your code already handles, not a green light. Unknown is never safe, and the status code enforces it.

Behavioral, not static

Not "is the contract a scam." We decode the agent's live trades off the bonding curve and flag a distribution the moment it starts.

Sub-second, self-provisioning

Query a mint and it enters the scan set. First call may be unavailable; subsequent calls carry live data.

Honest about coverage

Each answer states live, stale, or unavailable — you always know how much to trust it.

Authentication

Every request carries an API key, as a header or bearer token. Keys are issued on request (see below) and rate-limited per key.

# header
curl https://mememoon.fun/api/hazard/<MINT> \
  -H "X-API-Key: mmh_your_key_here"

# or bearer
curl https://mememoon.fun/api/hazard/<MINT> \
  -H "Authorization: Bearer mmh_your_key_here"

Endpoints

GET/api/hazard/health

Public, no key. Is the feed trustworthy right now? Returns 200 when serving, 503 when blind. Poll this to gate everything else.

// 200 — serving
{ "serving": true, "feed_state": "ok", "buffered_signals": 214 }

// 503 — blind. Every /api/hazard query will return 503 too.
{ "serving": false, "feed_state": "blind",
  "coverage_note": "A 503 means UNKNOWN, never SAFE." }
GET/api/hazard/{mint}

Score one mint. hazard is 0–100, or null when coverage is unavailable — in which case the response is a 503, never a 200 with a zero.

# request
curl https://mememoon.fun/api/hazard/Amz1kR4t…pump -H "X-API-Key: mmh_…"

// 200 — a real answer
{
  "mint": "Amz1kR4t…pump",
  "coverage": "live",           // live | stale | unavailable
  "hazard": 86.4,               // 0–100, or null if unavailable
  "band": "critical",          // clear | elevated | high | critical
  "reasons": ["EXIT_WARNING (CRITICAL, 4s ago)", "WHALE_DUMP (WARNING, 40s ago)"],
  "newest_signal_age_sec": 4.0,
  "feed_state": "ok"
}

// 503 — unknown. NOT a zero. Your `if (resp.ok)` guard blocks it for free.
{ "mint": "…", "coverage": "unavailable", "hazard": null,
  "detail": "no current view of this mint — this is NOT an assertion it is safe" }
200 answer503 unknown400 bad mint401 no/invalid key429 rate limited
POST/api/hazard/batch

Screen a portfolio in one call — up to 50 mints. Always 200 with per-item coverage, so a partial answer is useful and you see exactly which items are unknown.

curl -X POST https://mememoon.fun/api/hazard/batch -H "X-API-Key: mmh_…" \
  -H "Content-Type: application/json" \
  -d '{"mints":["Amz1…pump","23ED…pump"]}'

{ "count": 2, "known": 1, "unavailable": 1,
  "results": [ /* one HazardResult per mint */ ] }
200 per-item413 >50 mints401429

Rate limits

Per-key sliding window. Exceed it and you get 429 with a Retry-After header. Default budgets are generous; production integrations get a tier sized to their traffic.

Why integrate this instead of a static scanner

Static scanners describe a contract

LP locked, mint renounced, holder spread. All true at launch, all useless once the agent starts selling into your users.

Hazard describes what's happening now

The distribution, the exit collapse, the whale exit — decoded live from on-chain behavior, in seconds.

Built from real losses

The detection is derived from live-fire Solana microstructure — patterns that took real capital to learn and can't be scraped.

It never lies to your users

The 503 contract means integrating Hazard cannot make your product tell someone a token is safe when you simply couldn't see it.

Request access

Keys are issued to integrators — wallets, aggregators, trading tools, risk desks. Tell us what you're building and expected volume, and we'll size a key and a rate tier. Design-partner terms available for early integrations.

Status is public and machine-readable at /api/hazard/health — check our uptime before you commit. We publish our own outages; nobody else in this category does.