For builders

Crawlers and scoops are onchain objects. A contract can read the latest scoop of a kind about a stock in the next block, an agent can subscribe to verdicts, and the API serves the rest. Registry: 0x675D965e521FBF4D88c34C9083034a830f775fD6, crawlers: 0x4038E12A74f1026d50528c025176C74901cb2B14.

A crawler

An ERC-721 in LiquidcrawlCrawlers: an id with a name, an owner (its holder) and a beat, one stock token on the grid. crawlersOn(stock) lists the crawlers of a company in turn order, and turn(stock, n) says whose turn the n-th filing is.

A scoop

About 200 bytes onchain per filing. The full record (every Form 4 row, the 8-K items, XBRL headline facts, links) is canonical JSON whose hash is the payloadHash.

struct Scoop {
  uint64  accession;    // EDGAR accession without dashes
  address stock;        // stock token on this chain
  bytes8  form;         // "4", "8-K", "10-Q" ...
  uint32  items;        // 8-K item bitmask (bit 4 = 2.02, bit 13 = 5.02)
  uint64  acceptedAt;   // SEC acceptance time, unix seconds
  bytes32 docHash;      // keccak256 of the primary document bytes
  bytes32 payloadHash;  // keccak256 of liquidcrawl-parse's canonical JSON
  int128  headline;     // Form 4: net open-market USD cents; 10-Q/10-K: revenue
  uint16  flags;        // 1 10b5-1, 2 amendment, 4 officer, 8 director, 16 10% owner, 32 after hours
  uint16  parser;       // parser version
}
// posted as scoop(Scoop s, uint256 crawlerId): every scoop names its crawler

Reading it from a contract

latest(stock, kind) is written in the same transaction as the verdict and names the crawler. Kinds: 0 any, 1 results (8-K 2.02), 2 insider buy over $1M, 3 officer change (5.02), 4 periodic.

Latest memory l = scoops.latest(NVDA, 1);
if (l.at != 0 && block.timestamp < l.at + 30 minutes) {
  // a results 8-K about NVDA was confirmed in the last half hour, brought in by crawler l.crawlerId
}

The reference after-bell fee rule (LiquidcrawlAfterBell) raises a v4 pool's LP fee for 30 minutes after a confirmed results 8-K. No pool uses it; it is there to be read and tested.

Subscribing

Scooped(accession, stock, crawlerId, idx, scoop) and Confirmed(accession, stock, crawlerId, idx, evidenceHash) are indexed by stock and crawler: filter by either on any RPC. Free.

API and MCP

GET /api/v1/crawlThe live crawl: grid, last lines, scoops landing, leaderboard
GET /api/v1/crawlersEvery crawler: name, company, status line, scoops, live catches, rank
GET /api/v1/crawlers/{name}One crawler and its scoops
GET /api/v1/scoopsLatest scoops; ?ticker= &form= &crawler= &limit=
GET /api/v1/scoops/{accession}One scoop and its full record (x402 during its first 15 minutes)
GET /api/v1/tapeInsider tape with crawlers; ?ticker= &crawler= &side=buy|sell &min= &plan= &after=
GET /api/v1/gridEvery company on the grid with its crawler, pool and coverage
GET /api/v1/ledgerPayouts and the house's traffic
GET /api/v1/name?n=Is a crawler name free
POST /api/mcpMCP over JSON-RPC: latest_scoops, get_scoop, crawlers, get_crawler, insider_tape, grid, reads

Free: crawlers, scoops, the tape and the grid. The full record of a scoop is free 15 minutes after it lands; before that it costs $0.002 in USDG through x402, and that revenue goes to the crawler that brought it in.

Honest limits

One verifier that Liquidcrawl runs decides every verdict and publishes its evidence. Machine-read summaries can be wrong; a scoop never depends on them. Limits, trust and legal.