assay
API · no key · CORS open

The same report, from code.

Every page on this site is built from these endpoints. They need no key. Reads are rate-limited per IP (60 requests/minute; a report costs 3) and answer 429 with Retry-After when exceeded. Responses carry Cache-Control so a proxy in front of a bot can share them.

GET /api/assay/:token

The full report. ?fresh=1 bypasses the 20 s cache. Schema version is in version; bigints are decimal strings; percentages are basis points.

curl http://localhost:3000/api/assay/0xCb01012D66E4b9719F3FdA28Cc84A16c24Dd7B98
{
  "version": 1, "computedAt": 1789..., "block": 67551776,
  "token": { "address": "0x…", "name": "…", "symbol": "…", "decimals": 18, "totalSupply": "1000000000000000000000000000" },
  "launch": { "curve": "0x…", "deployer": "0x…", "pairToken": "0x0000…", "block": 67502645, "txHash": "0x…", "timestamp": 1789…, "ageSeconds": 4321 },
  "pair": { "symbol": "ETH", "decimals": 18, "usdPerUnit": 2623.65, "usdSource": "chainlink", "usdUpdatedAt": 1789… },
  "status": "curve",
  "curve": { "realQuoteReserve": "…", "graduationThreshold": "4200000000000000000", "progressBps": 211, "price": "1.86e-9", "priceUsd": 4.9e-6, "marketCapUsd": 4890.1, … },
  "tape": { "trades": 6, "buys": 4, "sells": 2, "uniqueWallets": 4, "snipeBuys": 3, "snipeShareBps": 7100, "topBuyer": { "wallet": "0x…", "shareBps": 3600 }, "recent": [ … ], "partial": false },
  "holders": { "count": 4, "top": [ … ], "top10ShareBps": 10000, "deployer": { "shareBps": 0, "soldTxs": [] }, "reconciled": true },
  "deployer": { "address": "0x…", "launches": 4, "graduated": 0, "last24h": 4, "last7d": 4, "partial": false, "recent": [ … ] },
  "collisions": { "symbol": 0, "graduatedSameSymbol": 0, "examples": [], "indexed": true },
  "bond": { "contract": null, "status": "unavailable", "bonds": [] },
  "flags": [ { "code": "SNIPE_CLUSTER", "severity": "warning", "title": "…", "detail": "…", "evidence": [ { "label": "snipe buy", "tx": "0x…" } ] } ],
  "method": { "durationMs": 1830, "phases": { … }, "notes": [ "…" ] }
}

Errors: 400 INVALID_ADDRESS, 404 NOT_A_LAUNCH (with reason: eoa or contract-not-pons), 429 RATE_LIMITED, 503 RPC_UNAVAILABLE.

GET /api/badge/:token.svg

A badge whose label states the condition count and curve status, never a score. Colours: red for warnings, amber for notices, green for none, grey for unknown.

![assay](http://localhost:3000/api/badge/0xCb01012D66E4b9719F3FdA28Cc84A16c24Dd7B98.svg)

GET /api/launches?kind=launched|graduated&limit=40&before=<block>

Recent launches or graduations from the index, newest first, with the deployer's launch count.

GET /api/deployer/:address

The deployer record: every launch by the wallet, graduation flags, 24 h / 7 d counts, partial when the RPC budget was hit.

GET /api/stats

Base rates computed from the index (see Stats).

GET /api/health

RPC reachability, head block, indexer cursor and lag. Use it for uptime checks.

Terms

Free for any use. No warranty. A report is a reading of public state at a block; it is not advice. Please cache and pace requests; a private RPC (RPC_URL) is the right answer for heavy use, and the code is open to self-host.

API · Assay