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

ParamTypeRequiredDescription
castringyesSolana token contract address (base58, 32–44 chars). Aliased as token.
fresh1 or truenoBypass the Redis cache and force a fresh upstream scan. Costs one full upstream batch; use sparingly.
ai1noForce AI summary generation if it’s missing from the cached result. Use for refreshing the AI Verdict card.

Headers

HeaderPurpose
X-Antares-InstallOptional opaque identifier for fairer rate limiting on shared NAT. Send a stable random string per client.
X-Request-IdResponse only. UUID returned by the API for tracing in support requests.
X-RateLimit-RemainingResponse only. Requests remaining in the current window.
Retry-AfterResponse 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

StatusMeaning
400Invalid token address (regex fail)
403Origin not allowed (CORS)
404Token not found upstream
429Rate-limit exceeded; check Retry-After header
500Internal error; include X-Request-Id when reporting
504Global 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

Caching

Responses are cached server-side in Redis with asymmetric TTLs:

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.