Build on it
API
Read the Graduation Score and its five sub-signals directly. The shapes below are the ones the interface already consumes.
Not implemented in this build. This page documents the intended surface, and the payloads match the types the frontend is written against — so wiring a real indexer to them does not require changing the screens.
Score a token
GET /v1/token/:address/score
{
"address": "0x4b71e05ca9f83d260187ba4ce7f10d93a5e6c802",
"symbol": "LNGX",
"score": 91,
"verdict": "graduating",
"block": 21486310,
"signals": {
"contract": 96,
"deployer": 94,
"distribution": 88,
"liquidity": 91,
"momentum": 79
},
"sellSimulationFailed": false
}score is the weighted composite; signals are the un-weighted sub-scores, so a caller can re-weight for their own prior without re-deriving the inputs.
Contract findings
GET /v1/token/:address/contract
{
"flags": [
{
"id": "sim",
"label": "Buy/sell simulation",
"level": "pass",
"detail": "Simulated buy and sell both succeeded against current state."
},
{
"id": "owner",
"label": "Ownership",
"level": "warn",
"detail": "Ownership held by the deployer, not renounced."
}
]
}level is one of pass, warn or fail. Every finding carries its evidence in detail — the API never returns a bare verdict, for the same reason the interface never shows one.
Deployer reputation
GET /v1/deployer/:address
{
"address": "0x3f92ba17c8d04e6a75190bb2cf83e6d41a7c5502",
"tokensLaunched": 41,
"graduated": 1,
"rugged": 33,
"medianLifespanHours": 4,
"fundingOrigin": "recycled-rug",
"clusterSize": 12,
"reputation": 6
}Webhooks
Rather than polling, register a threshold and receive a call on the block it is crossed:
POST /v1/webhooks
{
"url": "https://example.com/hooks/karat",
"filter": "score > 80 AND liquidity.lockedDays > 30",
"events": ["score.crossed", "flag.raised", "smart_money.conviction"]
}Rate limits
| Tier | Requests | Webhooks |
|---|---|---|
| Free | 1k / month | — |
| Pro | 25k / month | 5 |
| API | 250k / month | 50 |