Machine API
API
Every screen in DoomWare is built on these endpoints. No key, CORS open, JSON only. Nulls mean “not observable from the configured sources at this block”, never zero.
Live call
https://www.doomware.xyz/api/v1/inspect/:addressResponse time
—
HTTP
—
Current block
—
Data providers
—
Data freshness
—
Verdict
—
Endpoints
- GET /api/v1/inspect/:addressMachineState — the compact, stable answer (schema below).
- ?chain = auto | 4663 | robinhood | 1 | 8453 | 42161 (default auto)
- ?sizes = 100,1000,10000 (depth ladder, max 12)
- GET /api/v1/scan/:addressMachineState plus every raw input: contract report, pools, depth ladder, holders, verification, indexer, calculations with substituted inputs, step trace.
- ?chain
- ?sizes
- GET /api/v1/compareUp to four assets through the same pipeline, side by side.
- ?addresses = 0x…,0x… (1–4)
- ?chain
- GET /api/v1/blockLatest block, node latency, endpoint label. Every advance is recorded in the live feed.
- ?chain
- GET /api/v1/statusRPC head, chain-id match, adapters and their runtime router verification, configured data sources.
- ?chain
- GET /api/v1/eventsLive system feed of this instance: blocks observed, scans completed, states changed. Real observations only.
- ?since = <event id>
- ?limit ≤ 200
- GET /api/v1/chainsRegistered networks (public facts) and declared-but-unwired providers (Solana).
MachineState fields
null = not observable at this block- network · chainId · blockstring · number · numberChain key, chain id and the L2 block every value below was read at.
- asset.address · name · symbol · decimals · totalSupplystring · string|null · string|null · number|null · string|nullERC-20 metadata read from the contract (bytes32 fallback). Supply is a raw integer string.
- asset.kindTOKEN | POOL | CONTRACT | EOAWhat the address is. A POOL input is resolved to its asset side.
- market.pricenumber|nullUSD price from the deepest registered pool; null without a USD reference at this block.
- market.priceInQuote{ value: string|null; symbol: string|null }Exact decimal price in the quote token of the deepest pool.
- market.liquidityUsdnumber|nullQuote-side depth across live registered pools, USD-referenced.
- market.volume24h · poolAgeDaysnumber|null · number|nullIndexer values (GeckoTerminal). Informational; never feed the verdict.
- market.pool · poolCount{ address; protocol; feeTier }|null · numberDeepest pool and the number of live pools.
- market.impact1kPct · impact10kPctnumber|nullSimulated price impact of a $1k / $10k buy against the deepest pool, LP fee excluded.
- risk.holderConcentration · top10Pctnumber|nullLargest / top-10 circulating holders as % of supply, pools and burn addresses excluded (explorer).
- risk.concentrationLabelLOW | MODERATE | HIGH | UNKNOWNBucketed concentration score.
- risk.liquidityStateDEEP | HEALTHY | THIN | FRAGMENTED | UNVERIFIED | NONELiquidity state of the registered pools (RPC only).
- risk.confidencenumber|null (0–1)Price confidence from depth, impact, venue and indexer agreement.
- scores.liquidity · concentration · reliabilitynumber|null (0–100)Deterministic scores; formulas on /docs and under every scan.
- verdict · reasonsLIQUID | HEALTHY | THIN | UNSTABLE | CONCENTRATED | UNKNOWN · string[]First matching rule and the sentences that produced it.
- freshness{ observationAgeSec; state: FRESH|AGING|STALE|UNKNOWN; blockTimestamp }Age of the observed block.
- sources[]{ field; source; kind: RPC|POOL|EXPLORER_API|INDEXER_API|DERIVED }Where each field came from.
- timestamp · metaISO string · { responseMs; rpcEndpoint; providers[]; detection; warnings[] }Observation time and request metadata (chain detection probes included).
Agent usage
const state = await fetch(
"https://www.doomware.xyz/api/v1/inspect/0x..."
).then(r => r.json())
if (state.verdict === "LIQUID") {
// continue
}
// or gate on the measured inputs instead of the word
if (state.risk.confidence !== null && state.risk.confidence >= 0.8
&& state.market.liquidityUsd !== null && state.market.liquidityUsd > 250_000) {
// ...
}curl
curl -s "https://www.doomware.xyz/api/v1/inspect/0x0bd7d308f8e1639fab988df18a8011f41eacad73?chain=4663" | jq .verdict curl -s "https://www.doomware.xyz/api/v1/compare?addresses=0x…,0x…&chain=auto" curl -s "https://www.doomware.xyz/api/v1/events?since=0"
Errors & limits
{ "error": { "code", "title", "message", "status" } } — codes: INVALID_INPUT 400, UNSUPPORTED_CHAIN 400, NOT_A_CONTRACT 404, UNSUPPORTED_MARKET 422, RATE_LIMITED 429, RPC_ERROR / RPC_UNAVAILABLE 502/503, EXPLORER_UNAVAILABLE 503.
Rate limit per client IP: inspect / scan 60 per minute, compare 30, block / events 240. Responses are no-store; explorer and indexer reads are cached server-side for 1–10 minutes; pool state is always re-read.
Networks: Ethereum (1), Robinhood Chain (4663), Base (8453), Arbitrum One (42161). Solana is declared but not wired and never returns data.