Base URL https://api.dexch.art — responses are JSON, shaped { data } or { data, nextCursor }; errors are { error: { code, message } }.
Screener
/api/v1/tokensThe screener: filterable, sortable, cursor-paginated token list.
- chains
- comma list: bsc,robinhood,solana
- preset
- new | almost | graduated | gainers | rwa (rwa = pairs quoted in a tokenized stock or commodity)
- sort
- trending | new | volume24h | marketCap | liquidity | txns24h | holders | progress | priceChange24h | priceChange1h | lastActivity | migratedAt
- order
- asc | desc (default desc)
- search
- symbol, name or exact contract address
- cursor
- opaque, from nextCursor of the previous page
- limit
- page size, max 100
- minMcap, maxMcap, minLiq, minVol, minTxns, minHolders
- numeric range filters (USD / counts)
- minProgress, maxProgress
- bonding progress, percent
- minAge, maxAge
- token age, minutes
- hasSocials, dexPaid, safeOnly
- boolean flags
/api/v1/tokens/batchBatch summaries by explicit keys. Unknown keys are absent, never errors.
- keys
- comma list of chain:address, max 100
/api/v1/feeds/:nameRedis-backed leaderboards: trending | new | bonded (just graduated) | hot (1h volume).
- chains
- comma list, default all
- limit
- max 100
- offset
- windowed into the merged board
/api/v1/searchTypeahead over symbol and name, plus exact address lookup.
- q
- query text
Token detail
/api/v1/tokens/:chain/:addressFull detail for one token — everything the token page shows.
/api/v1/tokens/:chain/:address/tradesMost recent trades, newest first.
- limit
- max 200
- before
- ISO timestamp — page older trades
/api/v1/tokens/:chain/:address/candlesOHLCV bars for charting.
- timeframe
- 1m | 5m | 15m | 1h | 4h | 1d
- limit
- bar count
/api/v1/tokens/:chain/:address/holdersLargest holders with balances.
- limit
- max 100
/api/v1/wallets/:chain/:address/holdingsOne wallet's native balance and its balance of one token, read from the chain on request in a single multicall. Raw base units as strings, with decimals and a USD mark where a price is known. EVM chains only — Solana answers 400 rather than guessing.
- token
- token address — the balance to read alongside gas
Platform
/api/v1/statsPer-chain totals and indexer health.
/api/v1/filter-optionsThe chains and launchpads this deployment actually serves.
/api/v1/submissionsReport an unlisted token. Body: { chain, address } — nothing else is accepted; every displayed field is read from chain.
Opinions
/api/v1/tokens/:chain/:address/opinionsWhat people have said about one token, with the bull/bear tally. Top-level only; the newest few replies are inlined on each.
- sort
- latest | top
- cursor
- from nextCursor
- limit
- max 50
/api/v1/tokens/:chain/:address/opinionsWrite one. Body: { body, stance?, parentId? }. Signed-in wallets only. Two rules are enforced before the row is written and cannot be bypassed: no links of any kind, and no contract address other than this token — obfuscated forms included.
/api/v1/opinionsThe global stream, every row carrying the token it is about.
- chains
- comma-separated
- sort
- latest | top
/api/v1/opinions/:id/repliesThe full thread under one opinion, oldest first.
/api/v1/opinions/:id/likeReact. Idempotent — one per wallet, enforced by the primary key. DELETE the same path to undo.
/api/v1/opinions/:idRemove your own, or any as an admin. Soft: the row keeps its place so its replies still read, and loses its text at the API boundary.
Promotion — paid in the platform token
/api/v1/promote/configPlatform token, treasury address, profile price and boost packages. enabled:false when the deployment has no payment config.
/api/v1/promote/profileApply a paid profile update. Body: { chain, address, paymentTx, description?, imageUrl?, websiteUrl?, twitterUrl?, telegramUrl? }. The payment transfer is verified on chain; one hash redeems one purchase.
/api/v1/promote/boostApply a boost package. Body: { chain, address, paymentTx, packageId }. Boosted tokens rank higher while active and always wear a visible ⚡ mark.
WebSocket
Connect to wss://api.dexch.art/ws, then { "action": "subscribe", "channels": ["token:update"] }. Frames arrive as { channel, data }.
- token:update
- live market snapshot per token (rate-shaped firehose)
- trade:new
- individual trades (rate-shaped firehose)
- token:created
- new launches
- token:graduated
- curve → DEX migrations
- <channel>:<chain>:<address>
- scoped variant of token:update / trade:new — every frame for that token, never sampled
Bare channels are rate-shaped samples — enough to paint a screener, not a ledger. For every frame on one token, subscribe the scoped form.