01Quick start
Find the chain for an address, then fetch its report:
curl "https://rapport.lat/api/detect?address=0x6982508145454ce325ddbe47a25d4ec3d2311933"
# {"chains":["ethereum"]}
curl "https://rapport.lat/api/report?chain=ethereum&address=0x6982508145454ce325ddbe47a25d4ec3d2311933"In JavaScript:
const res = await fetch('https://rapport.lat/api/report?chain=solana&address=DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263');
const { report, stale } = await res.json();
console.log(report.meta.symbol, report.risk.level, report.risk.score);02Basics
- Base URL:
https://rapport.lat/api. All responses are JSON; errors have the shape{"error": "message"}. - Chains:
ethereum,base,bsc,solana. EVM addresses are case-insensitive; Solana mints are case-sensitive. - No API key is needed for read endpoints. Write endpoints (posting, voting) need a signed-in browser session and are not part of the public API.
- Times are Unix milliseconds unless a field says otherwise;
createdAton deployers and flows is Unix seconds.
03Detect chain
/api/detect?address={address}Returns every supported chain where a token contract exists at the address. An empty list means none was found.
200 {"chains": ["ethereum", "base"]}
400 {"error": "That does not look like an EVM (0x…) or Solana address."}04Get a report
/api/report?chain={chain}&address={address}Returns the full report. The first request for a token builds it (5–20 s); later requests are served from cache.stale: true means you received the cached copy while a fresh one is being built.
200 {"stale": false, "report": { ... }}
404 {"error": "No token found at … on ethereum"}
502 {"error": "Providers unavailable"}Report fields
| Field | Contents |
|---|---|
meta | name, symbol, decimals, totalSupply, logo, source |
market | priceUsd, priceChange24h, liquidityUsd, volume24h, fdv, marketCap, buys24h, sells24h, pairs[], website, socials[] — or null |
holders | holders[] (owner, amount, percent 0–100, label, isLocked, insider), holderCount, lpHolders[], source |
holderAnalysis | top1, top10, top20 (percent, excluding LP/burn/lock), excludedPercent, insiderPercent, sampleSize |
security | isHoneypot, buyTax, sellTax, mintable, freezable, ownerRenounced, isProxy, openSource, blacklist, pausable, lpLockedPercent, externalRisks[] … |
deployer | address, creationTx, createdAt, nativeBalance, tokenBalance, tokenPercent, flows[], createdTokens[] |
deployerAnalysis | sentOut, receivedIn, netOut, netOutPercent, estimatedValueUsd, transfersOut, lastActivity |
revenue | protocol, fees and revenue totals (24h, 7d, 30d, all time), daily[] — or null |
risk | score (0–100), level, flagged, checked, indicators[] (id, title, severity, status, evidence, source) |
errors | sections whose sources failed, with a message |
Any field can be null when no source provided it. Treat null as unknown, never as zero or clean — the same rule the website follows.
05Community threads
/api/threads?chain={chain}&address={address}Latest visible threads for a token (omit both parameters for all tokens). Each thread has id, title, body, score, commentCount, createdAt and author.
/api/threads/{id}One thread with its replies: {"thread": {...}, "comments": [...]}. Hidden or unknown threads return 404.
06Health
/api/healthDatabase reachability, which data keys are configured (true/false only), and per-provider call and error counts since the server started. Returns 503 when the database is down. Suitable for uptime monitors; a readable view is on the status page.
07Rate limits
Limits are per IP address and refill continuously. Over the limit you receive 429; wait and retry.
| Endpoint | Limit |
|---|---|
/api/detect | 30 requests per minute |
/api/report | 20 requests per minute |
| Report refresh (bypassing cache) | 4 per minute |
Reports are cached for 15 minutes, so polling more often than that returns the same data. Rapport runs on free data tiers; please cache on your side too.
08Self-hosting
Rapport is a Next.js monorepo with chain adapters, analysis and storage in separate packages. It runs on one small server with Docker Compose (PostgreSQL, web app, background refresh). Data keys needed: Helius, Alchemy and Etherscan (free tiers), plus Privy for sign-in.
cp .env.example .env # add keys
docker compose up -d --buildInterested in access to the code or a higher-volume integration? Write to [email protected].