Developer documentation
API
The Antares scan API is the same endpoint the Chrome extension uses. Free, no auth required, rate-limited. Designed for personal projects, integration in trading bots, and Discord/Telegram alert pipelines.
Best-effort, no SLA. The API runs on Vercel free tier with Upstash free Redis. Rate limits are conservative (60 req / minute per IP). Response shape is stable but not formally versioned. For production-grade integrations or higher quotas, please drop us a note via /support.
Endpoint
GEThttps://antares-extension.vercel.app/api/scan?ca={SOLANA_MINT_ADDRESS}
Query parameters
| Param | Type | Required | Description |
|---|---|---|---|
ca | string | yes | Solana token contract address (base58, 32–44 chars). Aliased as token. |
fresh | 1 or true | no | Bypass the Redis cache and force a fresh upstream scan. Costs one full upstream batch; use sparingly. |
ai | 1 | no | Force AI summary generation if it’s missing from the cached result. Use for refreshing the AI Verdict card. |
Headers
| Header | Purpose |
|---|---|
X-Antares-Install | Optional opaque identifier for fairer rate limiting on shared NAT. Send a stable random string per client. |
X-Request-Id | Response only. UUID returned by the API for tracing in support requests. |
X-RateLimit-Remaining | Response only. Requests remaining in the current window. |
Retry-After | Response only on 429. Seconds to wait before retrying. |
Response shape (200)
{
"score": 100,
"risk": "RUG", // SAFE | CAUTION | DANGER | RUG
"confidence": 80,
"flags": [
{ "label": "Wash trading detected", "severity": "critical", "impact": 100 },
{ "label": "LP not burned", "severity": "critical", "impact": 90 }
],
"layers": {
"dexscreener": { "available": true, "trust": 0.45 },
"rugcheck": { "available": true, "trust": 0.05 },
"helius": { "available": true, "trust": 0.20 },
"solscan": { "available": true, "trust": 0.15 },
"chart": { "available": true, "trust": 0.50 },
"goplus": { "available": false }
},
"tokenName": "Henry The Man from the Future",
"tokenSymbol": "HENRY",
"marketCap": 142000,
"liquidity": 45200,
"priceUsd": 0.001442,
"volume24h": 1592000,
"priceChange24h": 1077,
"holders": 487,
"topHolderPct": 13.2,
"top10HolderPct": 41,
"tokenCreator": "7Hg2…zX9q",
"lpBurned": false,
"honeypot": false,
"mintAuthority": false,
"freezeAuthority": false,
"criticalActors": [ /* Dev / Insider / Cluster cards */ ],
"verdictHistory": [ /* per-token verdict history (kept for analytics; no longer rendered after the Deep Analysis redesign in #430) */ ],
"holderActivity": { "rows": [ ... ], "netFlowPct": -3.2, "netFlowDirection": "out" }, /* feeds the Insider Watch heatmap */
"outcomeStats": { /* deprecated — Outcome Histogram tab was replaced by Wash Volume in #430 (computed from pair.txns + pair.volume instead) */ },
"aiSummary": "Coordinated wallets bought together at launch...",
"scoring_version": "7.1.0",
"fetchedAt": 1714209600000,
"requestId": "abcd-1234-..."
}
Errors
| Status | Meaning |
|---|---|
400 | Invalid token address (regex fail) |
403 | Origin not allowed (CORS) |
404 | Token not found upstream |
429 | Rate-limit exceeded; check Retry-After header |
500 | Internal error; include X-Request-Id when reporting |
504 | Global 9-second timeout hit; retry the request |
Examples
cURL:
curl 'https://antares-extension.vercel.app/api/scan?ca=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'
JavaScript (fetch):
const res = await fetch(
'https://antares-extension.vercel.app/api/scan?ca=' + encodeURIComponent(mintAddress),
{ headers: { 'X-Antares-Install': myStableInstallId } }
);
if (!res.ok) throw new Error('HTTP ' + res.status);
const result = await res.json();
console.log(result.risk, result.score, result.flags);
Python (requests):
import requests
r = requests.get(
'https://antares-extension.vercel.app/api/scan',
params={'ca': mint_address},
headers={'X-Antares-Install': stable_install_id},
timeout=12
)
r.raise_for_status()
data = r.json()
print(data['risk'], data['score'])
Rate limits
- Sliding window: 60 requests / minute per
(IP, install-id)pair. - Burst limit: 5 requests per 10 seconds.
- If both are exceeded, the API returns
429with aRetry-Afterheader indicating seconds to wait. - Send a stable
X-Antares-Installheader to avoid being throttled by other users on the same NAT.
Caching
Responses are cached server-side in Redis with asymmetric TTLs:
- RUG / DANGER: 30 minutes (stale-bad-verdict is safe)
- SAFE / CAUTION on tokens < 24h old: 30 seconds (avoid stale-clean errors on freshly-launched tokens)
- SAFE on mature tokens: 5–10 minutes
Pass ?fresh=1 to bypass the cache and force a fresh upstream batch. Use sparingly.
Stability
The response shape is informally stable. New optional fields may be added without notice. Existing fields will not be removed without a deprecation period announced in the changelog. The scoring_version field bumps on any change to scoring logic.