DOOMWARE
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/:address
Response time
HTTP
Current block
Data providers
Data freshness
Verdict
Endpoints
  • GET /api/v1/inspect/:address
    MachineState — 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/:address
    MachineState plus every raw input: contract report, pools, depth ladder, holders, verification, indexer, calculations with substituted inputs, step trace.
    • ?chain
    • ?sizes
  • GET /api/v1/compare
    Up to four assets through the same pipeline, side by side.
    • ?addresses = 0x…,0x… (1–4)
    • ?chain
  • GET /api/v1/block
    Latest block, node latency, endpoint label. Every advance is recorded in the live feed.
    • ?chain
  • GET /api/v1/status
    RPC head, chain-id match, adapters and their runtime router verification, configured data sources.
    • ?chain
  • GET /api/v1/events
    Live system feed of this instance: blocks observed, scans completed, states changed. Real observations only.
    • ?since = <event id>
    • ?limit ≤ 200
  • GET /api/v1/chains
    Registered networks (public facts) and declared-but-unwired providers (Solana).
MachineState fields
null = not observable at this block
  • network · chainId · block
    string · number · number
    Chain key, chain id and the L2 block every value below was read at.
  • asset.address · name · symbol · decimals · totalSupply
    string · string|null · string|null · number|null · string|null
    ERC-20 metadata read from the contract (bytes32 fallback). Supply is a raw integer string.
  • asset.kind
    TOKEN | POOL | CONTRACT | EOA
    What the address is. A POOL input is resolved to its asset side.
  • market.price
    number|null
    USD 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.liquidityUsd
    number|null
    Quote-side depth across live registered pools, USD-referenced.
  • market.volume24h · poolAgeDays
    number|null · number|null
    Indexer values (GeckoTerminal). Informational; never feed the verdict.
  • market.pool · poolCount
    { address; protocol; feeTier }|null · number
    Deepest pool and the number of live pools.
  • market.impact1kPct · impact10kPct
    number|null
    Simulated price impact of a $1k / $10k buy against the deepest pool, LP fee excluded.
  • risk.holderConcentration · top10Pct
    number|null
    Largest / top-10 circulating holders as % of supply, pools and burn addresses excluded (explorer).
  • risk.concentrationLabel
    LOW | MODERATE | HIGH | UNKNOWN
    Bucketed concentration score.
  • risk.liquidityState
    DEEP | HEALTHY | THIN | FRAGMENTED | UNVERIFIED | NONE
    Liquidity state of the registered pools (RPC only).
  • risk.confidence
    number|null (0–1)
    Price confidence from depth, impact, venue and indexer agreement.
  • scores.liquidity · concentration · reliability
    number|null (0–100)
    Deterministic scores; formulas on /docs and under every scan.
  • verdict · reasons
    LIQUID | 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 · meta
    ISO 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.