HANSEMPNL
PNL
DOCS

FOMO Data API

Trader theses, buy/sell activity, per-source coverage and the lookups around them — and FOMO trades as the blockchain records them, with the trader's wallet. Three REST reads, one chain read, a token CA detection feed, six lookups and one live feed on one data key, two orders, one cursor law — and the compatible paths (v2) for a client written for that layout.

OpenAPI 3.1 JSON ↗ · Data key access · Auth · limits · errors

Authentication & allowance

Send Authorization: Bearer sk_ansem_…, or the same key in the X-Api-Key header. Every door is sold on a data key on plan builder or above; any other key class answers 403 with required_plan naming the plan. Never put a key in a URL.

Every served call — a full page, an empty one, a coverage read, a lookup — counts once against the key's allowance: a per-minute window and a daily ceiling, both set by the key's plan and shared by every door. Your key's limits: GET /v1/fomo/me (requests_per_minute, requests_per_day, remaining_today, streams). Every door costs the same — one request — and there is no per-record or per-field charge: an empty page and a full page of 100 cost one request each. A 429 carries Retry-After; the daily ceiling resets at UTC midnight. A refused query (400), a 503 and a compatible path's 404 NOT_OBSERVED are not counted against the daily ceiling, which counts answers under 400; every call still takes a slot of the per-minute window. No call here reaches an upstream, except POST /v1/fomo/resolve, which may take a live lookup. Every served page carries X-RateLimit-Limit, X-RateLimit-Remaining (what is left of the day after that call) and X-RateLimit-Reset (the next UTC midnight, as a Unix timestamp); X-RateLimit-Policy names both windows as <requests>;w=<seconds>. Pace from the headers, never by hitting the ceiling.

Endpoints

GET /v1/fomo/theses — Trader theses with source identity and per-record text completeness

Every thesis record this system serves: the full text the consented browser collector captured from the app's own pages, with the app's thesis id and author. A capture that changes what a thesis says is a new record under the same thesis_key; records are never merged. Stored supplier and backfill records are excluded before pagination. The position a thesis was posted on rides on the record as position_usd_value / position_token_amount / position_closed_at — a valuation snapshot at capture time, never a trade. Poll: order=ingested with the cursor kept between polls; read /v1/fomo/coverage first to know which chains are live. Source coverage does not establish whole-market completeness.

QueryType · bounds · defaultMeaning
cursor_version{"type":"string","enum":["1","2"]}Opt in to durable change replay with version 2. Version 1 keeps the existing record cursor; version 2 uses ingested order, a customer/filter-bound cursor and retained change revisions. Expired retained cursors return 410.
source{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"}Restrict change replay to one registered source alias. Only with cursor_version=2; current eligibility and privacy still apply.
limit{"default":50,"type":"integer","minimum":1,"maximum":100}Rows per page, 1..100. A short page under order=occurred means the end of history.
order{"default":"occurred","type":"string","enum":["occurred","ingested"]}occurred — newest first by the source's own time, keyset on (occurred_at, record_id), so a page boundary inside one second neither repeats nor skips. ingested — ascending seq, the incremental read: a poller that keeps handing back next_cursor sees every record exactly once, including one whose source time is older than everything it already has, and an empty poll hands the same cursor back. A row is served as soon as it is committed: concurrent writes are committed in ingestion sequence order, so a kept cursor never steps over a row still being written.
chain{"type":"string","minLength":1,"maxLength":32}One chain word or its alias — solana (alias sol) · robinhood (rh, hood) · ethereum (eth) · base · bsc · arc · monad · hyperliquid · polygon · arbitrum · unknown. Records are stored under the canonical word, which the response echoes in filters.chain. Any other word is a 400 naming chain.
token{"type":"string","minLength":1,"maxLength":128}A token address, never a symbol. A Solana address is matched exactly (case-sensitive); an EVM address is lower-cased before matching, the way the records were written.
author{"type":"string","minLength":1,"maxLength":64}A handle, with or without the leading @, case-insensitive.
user_id{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}One author by the source's stable user id — the user_id a record or a user lookup carries. Unlike author (a handle), it survives a rename. Case-insensitive.
tokens{"type":"string","minLength":1,"maxLength":6450}Up to 50 token addresses, comma-separated, each folded the way token is; a repeat counts once. Never beside token — sending both is a 400 naming tokens.
cursor{"type":"string","minLength":1,"maxLength":1024}The previous page's next_cursor, verbatim. Opaque and signed; it is bound to the filters and the order it was minted under, so any other combination is a 400 naming cursor — never silently page one.
since{"type":"string","format":"date-time"}ISO-8601. Only with order=ingested: the walk starts at the first record ingested at or after this instant. Send it on the first page; when a cursor is also sent, the cursor takes precedence and since is ignored.

Returns { records, next_cursor, order, filters, coverage, read_at } — the ThesisPage schema below. An empty records array with HTTP 200 is a real answer, not a failure: read coverage.

GET /v1/fomo/trades — Buy and sell activity the app showed, and on-chain fills — told apart by record_kind

Every trade record this system serves: the app's own swap events through the consented browser collector — a token's swap feed (feed_source token_swaps) and a user's own swaps (profile_swaps), one record per swap id, sized by the app's own USD amount (trade_size_usd, value_basis source_field) — and the app's home-feed trades (home_feed) under their own item ids. Stored supplier and backfill records are excluded before pagination. record_kind is app_activity on every row: no wallet, no transaction hash, no quantity. Filter with side=buy|sell. Poll: order=ingested with the cursor kept between polls.

QueryType · bounds · defaultMeaning
cursor_version{"type":"string","enum":["1","2"]}Opt in to durable change replay with version 2. Version 1 keeps the existing record cursor; version 2 uses ingested order, a customer/filter-bound cursor and retained change revisions. Expired retained cursors return 410.
source{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"}Restrict change replay to one registered source alias. Only with cursor_version=2; current eligibility and privacy still apply.
limit{"default":50,"type":"integer","minimum":1,"maximum":100}Rows per page, 1..100. A short page under order=occurred means the end of history.
order{"default":"occurred","type":"string","enum":["occurred","ingested"]}occurred — newest first by the source's own time, keyset on (occurred_at, record_id), so a page boundary inside one second neither repeats nor skips. ingested — ascending seq, the incremental read: a poller that keeps handing back next_cursor sees every record exactly once, including one whose source time is older than everything it already has, and an empty poll hands the same cursor back. A row is served as soon as it is committed: concurrent writes are committed in ingestion sequence order, so a kept cursor never steps over a row still being written.
chain{"type":"string","minLength":1,"maxLength":32}One chain word or its alias — solana (alias sol) · robinhood (rh, hood) · ethereum (eth) · base · bsc · arc · monad · hyperliquid · polygon · arbitrum · unknown. Records are stored under the canonical word, which the response echoes in filters.chain. Any other word is a 400 naming chain.
token{"type":"string","minLength":1,"maxLength":128}A token address, never a symbol. A Solana address is matched exactly (case-sensitive); an EVM address is lower-cased before matching, the way the records were written.
author{"type":"string","minLength":1,"maxLength":64}A handle, with or without the leading @, case-insensitive.
user_id{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}One author by the source's stable user id — the user_id a record or a user lookup carries. Unlike author (a handle), it survives a rename. Case-insensitive.
tokens{"type":"string","minLength":1,"maxLength":6450}Up to 50 token addresses, comma-separated, each folded the way token is; a repeat counts once. Never beside token — sending both is a 400 naming tokens.
cursor{"type":"string","minLength":1,"maxLength":1024}The previous page's next_cursor, verbatim. Opaque and signed; it is bound to the filters and the order it was minted under, so any other combination is a 400 naming cursor — never silently page one.
since{"type":"string","format":"date-time"}ISO-8601. Only with order=ingested: the walk starts at the first record ingested at or after this instant. Send it on the first page; when a cursor is also sent, the cursor takes precedence and since is ignored.
side{"type":"string","enum":["buy","sell"]}buy or sell. The trade door only — the thesis door refuses it with a 400 naming side.

Returns { records, next_cursor, order, filters, coverage, read_at } — the TradePage schema below. An empty records array with HTTP 200 is a real answer, not a failure: read coverage.

GET /v1/fomo/coverage — What is flowing, per source and per chain — and what is not

One row per door × chain with its text kind, freshness, counts and completeness; the full-text door judged on its own with its quiet chains named; collector activity (a page arrived) beside usable data (a page a parser accepted). status says whether the collector is delivering: a chain that went quiet stays stale on its own row without making the whole stale. Nothing here is market completeness: browsed_only means only what consenting installers browsed. Read it before treating an empty thesis or trade page as a quiet market. It has no row for the chain door, GET /v1/fomo/chain/trades.

No query parameters. Returns the Coverage object directly.

GET /v1/fomo/pump/detections — Durable Solana token CA detection, curve completion and migration receipts

Served as soon as a receipt is committed, before optional enrichment. By default, returns an empty page and next_after at the current committed head; resume with that decimal string to receive new receipts. after=0 explicitly requests history. A token_detected receipt does not establish CREATE or engine admission; token_curve_completed does not establish migration. Names and signatures remain null when unavailable. observed_at is collector receipt time, ingested_at is store write time, and source_ts is null. Coverage means stored receipts, not every launch in the market.

QueryType · bounds · defaultMeaning
after{"default":"latest","anyOf":[{"type":"string","const":"latest"},{"type":"string","pattern":"^(0|[1-9]\\d{0,18})$"}]}Default latest bootstraps at the current committed head with an empty page, skipping history. Resume using its next_after, a decimal string from 0 through 9223372036854775807; an empty poll preserves it. after=0 explicitly requests stored history. Keep one cursor per token filter.
limit{"default":25,"type":"integer","minimum":1,"maximum":100}Records per page, 1..100, default 25. Continue with next_after while has_more is true.
token{"type":"string","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$"}One Solana token CA, exactly case-sensitive; it must decode to a 32-byte address. An unknown valid CA returns an empty page.

Returns { records, next_after, has_more, read_at } — the TokenDetectionPage schema below. An empty poll preserves next_after; keep a separate cursor for each token filter.

FOMO trades from the chain

GET /v1/fomo/chain/trades — FOMO trades as the blockchain records them, with the trader's wallet

FOMO trades as the blockchain records them: Solana swaps signed by FOMO's app wallet, decoded from public chain data. Carries the trader's wallet; carries no FOMO handle. The wallet is the chain's own record: the transaction's second signer. One record per transaction signature, with the token, the side, the USD and token amounts when known, the venue and the route. decode_source says how it was decoded: logs (exact for a single-venue pump.fun, PumpSwap or CLMM swap; usd_amount may be null) or tx (the full transaction: exact amounts, every venue). A record may be re-emitted with a higher seq when its decode is upgraded from logs to tx: the same signature and record_id, with corrected fields. Upsert by signature. Filter with chain, token, wallet and side=buy|sell. Poll: order=ingested with the cursor kept between polls. The same data key, allowance and cursor law as the other doors.

QueryType · bounds · defaultMeaning
cursor_version{"type":"string","enum":["1","2"]}Opt in to durable change replay with version 2. Version 1 keeps the existing record cursor; version 2 uses ingested order, a customer/filter-bound cursor and retained change revisions. Expired retained cursors return 410.
source{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"}Restrict change replay to one registered source alias. Only with cursor_version=2; current eligibility and privacy still apply.
limit{"default":50,"type":"integer","minimum":1,"maximum":100}Rows per page, 1..100. A short page under order=occurred means the end of history.
order{"default":"occurred","type":"string","enum":["occurred","ingested"]}occurred — newest first by the chain's block time, keyset on (occurred_at, record_id), so a page boundary inside one second neither repeats nor skips. ingested — ascending seq, the incremental read: keep handing back next_cursor, and an empty poll hands the same cursor back. A trade is served once its wallet is known, so one can arrive after newer ones, and a record is re-emitted with a higher seq when its decode is upgraded: follow the feed with order=ingested and upsert by signature.
chain{"type":"string","minLength":1,"maxLength":32}The chain word: solana. Every record here is a Solana swap.
token{"type":"string","minLength":1,"maxLength":128}A token's mint address, never a symbol; matched exactly (case-sensitive).
wallet{"type":"string","minLength":1,"maxLength":128}A trader's wallet address; matched exactly (case-sensitive).
side{"type":"string","enum":["buy","sell"]}buy or sell.
cursor{"type":"string","minLength":1,"maxLength":1024}The previous page's next_cursor, verbatim. Opaque and signed; it is bound to the filters and the order it was minted under, so any other combination is a 400 naming cursor — never silently page one.
since{"type":"string","format":"date-time"}ISO-8601. Only with order=ingested: the walk starts at the first record ingested at or after this instant. Send it on the first page; when a cursor is also sent, the cursor takes precedence and since is ignored.

Returns { records, next_cursor, order, filters, read_at } — the ChainTradePage schema below. An empty records array with HTTP 200 is a real answer, not a failure.

A chain trade is a different record from a GET /v1/fomo/trades trade: the swap itself, as the chain records it. It names the transaction (signature, slot), the trader's wallet — the transaction's second signer — the token's mint as token_address, the side, and usd_amount and token_amount when known; never a handle or a user id. occurred_at is the block time, fomo_signer_verified says whether FOMO's app wallet was confirmed as the fee payer, source is chain on every record, and decode_source says whether it was decoded from the transaction's logs (logs) or from the full transaction (tx).

Upsert by signature: a record whose decode is upgraded from logs to tx is re-emitted with a higher seq — the same signature and record_id, with corrected fields — so skipping a record_id you already hold would keep the uncorrected one.

A trade is served once its wallet is known, so one can arrive after newer ones: follow the feed with order=ingested, or have it pushed — GET /v1/fomo/stream?kind=chain_trades sends one chain_trade frame per record of that walk, its id the record's seq, on the terms of the live feed below.

Lookups

A person, a resolve, trader PnL, the calling key, pump.fun callers and callouts — out of the store, on the same key and the same allowance. A person no stored table names is a 200 with user: null, never a 404; a field no table holds is null, never invented, and notes says where a figure's meaning differs from what its name suggests.

GET /v1/fomo/users — One trader, out of the stored tables that name them

Send exactly one of handle, id or wallet. Postgres only: the record tables, a resolved identity and the leaderboard, each field from the table that owns it, and a field no table holds is null. solana_wallet and evm_wallet are present only when FOMO's own trade page attested the address for the person's user id — a handle never establishes one; the Solana one is FOMO's account address for the person, which holds nothing on chain. solana_signer is the Solana wallet that signs the person's trades on chain, INFERRED from FOMO's own app-signed swaps that coincide with the trades the app showed for them, with its evidence (method, matches, first and last match, a sample signature) — never attested. A lookup by wallet finds a person by an attested address or a served signer wallet, else user null. linked_wallets are wallets other platforms publish for the X account the person logged in with — platform claims joined by X username where FOMO's display name agrees too, never a verification. A person no stored table names is a 200 with user null — never a 404. To resolve a handle no lookup has resolved yet, POST /v1/fomo/resolve.

QueryType · bounds · defaultMeaning
handle{"type":"string","minLength":1,"maxLength":64}A handle, with or without the leading @, case-insensitive. Send exactly one of handle, id, wallet.
id{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$"}A user id, as a record's user_id or a previous lookup carries it. Case-insensitive.
wallet{"type":"string","minLength":1,"maxLength":128}A wallet address. It names a person when FOMO's own trade page attested it as theirs, or when it is their served solana_signer (inferred, with its evidence on the answer) — never through a wallet resolved from a handle; any other address answers user null. Solana as written, EVM in any case.

Returns the UserAnswer schema below.

POST /v1/fomo/resolve — Resolve a handle — the one door that may take a live lookup

A handle already resolved answers at once (resolved: cached). Otherwise one lookup runs for up to a few seconds on the key's own resolve window: still running is a 202 queued — ask again after retry_after_s and the running lookup answers rather than starting another. The person's solana_wallet and evm_wallet are null unless the source itself attests the address, and solana_signer is null unless an inferred signer link is served for their user id: a handle never establishes either. Never a 404: a pending answer is not yet, which a missing record cannot tell apart from nobody. A 202 is counted like a 200.

Body: {"handle":"<handle>"} and nothing else.

Returns the ResolveFound schema below — or a 202 ResolvePending while the lookup runs, counted like a 200.

GET /v1/fomo/pnl — Trader PnL windows for one handle or up to a hundred, from the stored leaderboard

One request however many handles: entries in the order asked, a repeat once, and a handle no stored table holds under missing while the call still succeeds. The figures are the stored trading leaderboard's — 24h, 7d and 30d PnL for the top 300 traders by 7-day PnL on the app's leaderboard, refreshed daily; any other handle answers with every window null. A window the board does not publish is null, never computed, and notes states how they differ from a cash-flow ledger.

QueryType · bounds · defaultMeaning
handles{"type":"string","minLength":1,"maxLength":6500}1..100 handles, comma-separated, case-insensitive; a repeat counts once.

Returns the PnlPage schema below.

GET /v1/fomo/me — The calling key: its plan and what is left of its day

The plan's ceilings and the day's count off the usage ledger with this call included — the same figures the X-RateLimit headers carry on every served page. The key's display prefix, never the key. Counted like every other call.

No parameters.

Returns the Me schema below.

GET /v1/fomo/pump/users — A pump.fun account, by wallet

On pump.fun the wallet is the account, so this is a stored read, never a resolution: the caller's last stored profile read (bio, follower counts, squads, both linked wallets), what pump.fun's public boards publish beside the wallet (X's numeric id, the verified badge), and — for a caller only the callout feed has seen — the newest callout's own fields. Every field is pump.fun's word, and one no stored record holds is null. A wallet nothing stored names is a 200 with user null.

QueryType · bounds · defaultMeaning
wallet{"type":"string","minLength":1,"maxLength":128}The caller's wallet — on pump.fun the wallet is the account.

Returns the PumpUserAnswer schema below.

GET /v1/fomo/pump/callouts — pump.fun callouts, newest first — every coin's, one coin's wall, or one caller's

Every callout pump.fun's global feed publishes, on every chain this API names, plus the ones its per-coin pages and callers' pages show; each callout once. 25 to a page; send next_before back as ?before= while has_more. text is the caller's own words and null when they wrote none — a sentence this system stored in their place is never served as theirs. An unknown before is a 400 naming before.

QueryType · bounds · defaultMeaning
cursor_version{"type":"string","enum":["1","2"]}Version 2 opts into durable callout revision replay; legacy before pagination remains version 1.
cursor{"type":"string","minLength":1,"maxLength":2048}The customer/filter-bound next_cursor from a version 2 page. Expired retained cursors return 410.
source{"type":"string","pattern":"^[a-z][a-z0-9_-]{0,63}$"}An optional registered source alias for version 2 replay.
limit{"type":"integer","minimum":1,"maximum":100}Version 2 change rows per page. Version 1 retains its fixed page size.
token{"type":"string","minLength":1,"maxLength":128}A coin's mint: that coin's callout wall.
wallet{"type":"string","minLength":1,"maxLength":128}A caller's wallet: that caller's callouts.
before{"type":"string","minLength":1,"maxLength":128}The previous page's next_before — a callout id this feed holds. An unknown one is a 400 naming before.

Returns the PumpCalloutPage schema below.

Try a request

Requests go to this deployment and consume your data-call allowance. No request runs until you press Send. The key stays in this page's memory only.

For the command below, set BASE_URL to your assigned deployment origin and DATA_KEY in your shell. The entered key is never copied into the example.

curl --get "$BASE_URL/v1/fomo/theses?limit=50&order=occurred" --header "Authorization: Bearer $DATA_KEY"
Response will appear here.

Following the feed

Poll with order=ingested and limit=100, keeping the cursor. While a page comes back full, ask again at once; when it comes back short, wait 5–10 seconds. Send since on the first page only. A row is served as soon as it is committed: concurrent writes are committed in ingestion sequence order, so a row still being written is never skipped. Keep one cursor per door and per filter set, dedupe on record_id, and use side on the trade door to follow one side. Read GET /v1/fomo/coverage at a lower cadence: it says which chains of the thesis and trade doors are live, stale or empty, so an empty page there is read against it and never as an outage. It has no row for the chain door.

Live feed

GET /v1/fomo/stream — The same records, pushed over server-sent events — resumable by the record's seq. Server-sent events, kind=theses|trades|chain_trades, with the same filters as the REST doors: chain, token, author, user_id, tokens, and side on trades; on kind=chain_trades, the records of GET /v1/fomo/chain/trades with that door's chain, token, wallet and side. On kind=chain_trades, a chain that door does not serve (it serves solana) is a 400 naming chain, and author, user_id and tokens are refused with a 400 naming them; the thesis and trade feeds refuse wallet with a 400 naming it. The first frame is open (the kind, the filters as resolved, where the socket resumed from); then one thesis, trade or chain_trade frame per record whose id is the record's seq and whose data is the very record the REST door serves; a comment line keeps the socket alive; end names why this side closed it — lifetime after 30 minutes, unavailable when this side could not read the store, quota when the key's daily ceiling refused a page of history, permission_denied when access changes, slow_consumer when the client cannot keep up, lease_lost when this side could not keep the socket's stream slot, restart when this side restarts (a retry: line before it gives the milliseconds to wait). After a slow_consumer, lease_lost or restart close, open another connection with the last event id actually received.

Resume with Last-Event-ID: <seq> (or ?last_event_id=<seq> where a header cannot be set; the header wins when both arrive) and the rows written after that seq are replayed in seq order — through the same reader as the cursor walk, so nothing is pushed that the walk would not have served, and nothing the walk serves is missing. An id newer than any record the feed holds for the kind was never sent, and is refused with a 400 naming last_event_id; on that 400, open the feed again without a resume id and backfill through the REST door's since. Without a resume id the feed starts at the instant it opened; history is the cursor walk's. What it costs: one request of the daily ceiling and one of the plan's stream slots (your key's streams in GET /v1/fomo/me, shared with every push door on the key) to open, however long the socket stays open; then one request per full page of records pushed — a page's worth of history, or a client falling behind — exactly what the REST door charges for the same rows; the live trickle costs nothing more. A refused query costs nothing. On the thesis and trade feeds, read GET /v1/fomo/coverage on the side, as with the cursor walk; it has no row for the chain door.

curl -N -H "Authorization: Bearer $KEY" \
  -H "Last-Event-ID: 128411" \
  "https://api.hansem.io/v1/fomo/stream?kind=theses&chain=solana"

event: open
data: {"kind":"theses","filters":{"chain":"solana","token":null,"author":null,"side":null,"user_id":null,"tokens":null},"resumed_from":128411}

event: thesis
id: 128412
data: {"record_id":"cmg4x1thesis000000000001","seq":128412,…}

: ping
curl -N -H "Authorization: Bearer $KEY" \
  -H "Last-Event-ID: 52117" \
  "https://api.hansem.io/v1/fomo/stream?kind=chain_trades&wallet=ExampLEtrader33333333333333333333333333333"

event: open
data: {"kind":"chain_trades","filters":{"chain":null,"token":null,"wallet":"ExampLEtrader33333333333333333333333333333","side":null},"resumed_from":52117}

event: chain_trade
id: 52118
data: {"record_id":"cmg5x1chain0000000000001","seq":52118,…}

Compatible paths (v2)

A client written for the /v2 layout changes only its base URL to https://api.hansem.io/v1/fomo/compat: the same doors under that layout's paths and shapes, its error codes ({ error: { code, message } }), epoch-millisecond times and ?before= id cursors. The key travels as a bearer or in X-Api-Key, and every answer costs one request of the same allowance — a 404 NOT_OBSERVED and a refused query are not counted against the daily ceiling; every call still takes a slot of the per-minute window — with the same X-RateLimit headers.

PathAnswersServed by
GET /v2/user/handle/{handle}A trader by handle — 404 NOT_OBSERVED for nobodyGET /v1/fomo/users?handle=
GET /v2/user/wallet/{address}A trader by wallet — 404 NOT_OBSERVED for nobodyGET /v1/fomo/users?wallet=
GET /v2/user/id/{id}A trader by id — 404 NOT_OBSERVED for nobodyGET /v1/fomo/users?id=
POST /v2/user/handle/{handle}/resolveResolve a handle; 202 while the lookup runs — 202 while the lookup runsPOST /v1/fomo/resolve
GET /v2/user/handle/{handle}/pnlOne trader's PnL windows — 404 NOT_OBSERVED for nobodyGET /v1/fomo/pnl?handles=
POST /v2/user/handles/pnlPnL windows for up to a hundred traders in one callGET /v1/fomo/pnl?handles=
GET /v2/thesisEvery thesis, newest firstGET /v1/fomo/theses
GET /v2/thesis/token/{tokenAddress}One token's theses, newest firstGET /v1/fomo/theses?token=
GET /v2/thesis/user/{id}One author's theses, newest firstGET /v1/fomo/theses?user_id=
GET /v2/thesis/user/{id}/token/{tokenAddress}One author's theses about one tokenGET /v1/fomo/theses?user_id=&token=
GET /v2/meThe calling keyGET /v1/fomo/me
GET /v2/pump/user/wallet/{wallet}A pump.fun account by wallet — 404 NOT_OBSERVED for nobodyGET /v1/fomo/pump/users?wallet=
GET /v2/pump/thesisEvery pump.fun callout, newest firstGET /v1/fomo/pump/callouts
GET /v2/pump/thesis/token/{mint}One coin's callout wallGET /v1/fomo/pump/callouts?token=
GET /v2/pump/thesis/wallet/{wallet}One caller's calloutsGET /v1/fomo/pump/callouts?wallet=
GET /v2/pump/leaderboard/tradersThe latest stored public pump.fun trader snapshot at or before an instantGET /v1/fomo/pump/callouts
GET /v2/wsNot a socket here — the live feed is server-sent events — 404 NOT_FOUND with addUrlGET /v1/fomo/stream?kind=theses
curl -H "X-Api-Key: $KEY" "https://api.hansem.io/v1/fomo/compat/v2/thesis?limit=20"

{"count":20,"hasMore":true,"nextBefore":"cmg4x1thesis000000000020","updatedAt":1790337600000,"items":[{"id":"t2-example-thesis-000001","authorHandle":"example_author","thesis":"…","fomoCreatedAt":1790337600000,…,"textCompleteness":"full"}]}

curl -H "X-Api-Key: $KEY" "https://api.hansem.io/v1/fomo/compat/v2/thesis?limit=20&before=cmg4x1thesis000000000020"

What differs from that layout, said out loud — honest nulls, never invented figures:

  • Every body is unwrapped — the page keys are top-level, as the layout's wire carried them when captured on 2026-09-25; there is no data/meta envelope.
  • A thesis id is the platform's own id, and nextBefore is this system's record id for the exact observation at the page boundary, since revisions of one thesis share its id; ?before= accepts either, the walk never repeats or skips, and textCompleteness and segmentsCompleteness describe body and rich-run completeness independently.
  • A person's id is null when only the relay doors named them; bio and banner come from eligible retained public profile evidence, or are null when missing or cleared; twitter is a source-declared X profile URL published by FOMO for the exact user id, or null without an eligible public observation; it is not identity or wallet-ownership verification.
  • solanaSignerAddress on a person, and signerWallet on a PnL entry, are added: the Solana wallet that signs the person's trades on chain, INFERRED from FOMO's own app-signed swaps that coincide with the trades the app showed for them (at least 2 matches holding 80 % both ways; the native lookups carry the evidence as solana_signer) — never attested and never resolved from a handle; null without a served link. solanaAddress and evmAddress on a person, and wallet and evmWallet on a PnL entry, stay the addresses FOMO's own trade page attests; the Solana one is FOMO's account address for the person, which holds nothing on chain. A person by any other wallet is 404 NOT_OBSERVED.
  • linkedWallets on a person is added: the native lookup's linked_wallets — wallets other platforms publish for the X account the person logged in with, each a platform's claim joined by X username where FOMO's display name agrees too, never a verification and never one of solanaAddress, evmAddress or solanaSignerAddress; observedAt is epoch milliseconds.
  • netUsd is the trading leaderboard's PnL for the window, not a cash flow of sells minus buys; returnPct is always null; volumeUsd and trades are null in every window because the captured totals have no proven period; followers are source-reported or null without eligible evidence; the all window is null; every window is null for a trader off today's board.
  • The calling key answers in the layout's fields with this system's meaning: units are requests against the day's ceiling on the key's plan, the period is a UTC day, scopes is empty, reveals do not exist; the call is counted like every other.
  • A pump account's bio, following, isPumpUser and groupBadges come from its last stored profile read and isVerified from pump.fun's own boards or newest callout, each null (groupBadges empty) where no stored record holds it; every one is the platform's word, not a verification. The pump callout feeds carry every callout pump.fun's global feed publishes on the chains this API names, each callout once. The trader leaderboard reads one stored public snapshot, weekly by default, at or before the requested instant; absent periods return an empty snapshot with a note. Source-declared financial values, clocks and nullable profile fields are preserved without a lifetime, full holdings or verified-X claim.
  • A lookup that finds nobody is 404 NOT_OBSERVED, where the native doors answer 200 with user null; the daily ceiling is 402 QUOTA_EXCEEDED, where the native doors answer 429 quota_exceeded.
  • The socket path is a 404 NOT_FOUND whose addUrl names the server-sent live feed; there is no socket upgrade here — resume the feed with Last-Event-ID instead.
  • Every answer costs one request of the same daily allowance the native doors share — a 404 NOT_OBSERVED and a refused query (400) are not counted against the daily ceiling, though every call still takes a slot of the per-minute window — and carries the same X-RateLimit headers; the key travels as a bearer or in X-Api-Key.
HTTPCodeMeaning
400VALIDATION_ERRORA parameter was refused; the message names it, never its value.
401UNAUTHORIZEDNo key, a key this system never issued, or one that was revoked.
402QUOTA_EXCEEDEDThe key's daily ceiling; Retry-After says when the day resets.
403FORBIDDENThe key is not a data key on plan builder or above.
404NOT_OBSERVEDA lookup that found nobody: no stored table names the subject. Cache the miss briefly and ask again later.
404NOT_FOUNDNo such path; on the socket path, addUrl names the live feed instead.
405BAD_REQUESTA verb the path does not take; the allow header names the one it does.
429RATE_LIMITEDThe key's per-minute window; retryAfter (and Retry-After) say when.
503OVERLOADEDThe store or the usage ledger could not be read; nothing was served and nothing was counted.

Two orders, one cursor law

  1. order=occurred (the default) is newest first by the source's own time, keyset on (occurred_at, record_id), so a page boundary inside one second neither repeats nor skips a row. next_cursor is null when the page was short — that is the end of history.
  2. order=ingested is ascending seq — the incremental read. Keep handing back next_cursor and you see every record exactly once, including one whose source time is older than everything you already hold. An empty poll returns the cursor it was given, so cursor = next_cursor always keeps your place.
  3. since (ISO-8601) starts an ingested walk at the first record written at or after that instant. Send it on the first page; when a cursor is also sent, the cursor takes precedence.
  4. A cursor is opaque and signed, bound to the filters and the order it was minted under. Any other combination is a 400 naming cursor, never silently page one. Keep one cursor per door and per filter set; dedupe on record_id.

What a record is

Every field is present on every record; a value the source did not carry is null, never invented. Every served thesis and trade is one the consented browser collector captured from the app's own pages: provenance and text_door read browser_collector on every row — apart from GET /v1/fomo/chain/trades and the live feed's kind=chain_trades, whose trades are read from public chain data (above). Other words remain in those enums, and in the ones below, for compatibility; no served record carries them. Records are never merged: a capture that changes what a thesis says arrives as a new record under the same thesis_key — group by it.

text_completeness is full when the record carries the whole body, and preview when the app's token page cut a longer thesis at 300 characters (its text ends in …): the full text arrives under the same thesis_key only when the home feed carries that thesis.position_usd_value, position_token_amount and position_closed_at are the position a thesis was posted on, as the app valued it at capture time: a snapshot, never a trade, and never a second purchase when the same thesis is captured again.

A trade is record_kind: app_activity on every row — activity the app showed, never an on-chain fill: no wallet, no transaction hash, no quantity. feed_source names the app feed that showed it: token_swaps (a token's swap feed) or profile_swaps (a user's own swaps) — a swap both showed is one record — or home_feed (the app's home feed: large buys, large sells and closing sells, under the feed item's own id, which no swap id joins). value_basis says how trade_size_usd was filled: source_field (the app's own USD amount on the event) or unknown (the event named none, so trade_size_usd is null). realized_pnl_usd is null on every trade: the app's swap events carry none. content_trust is untrusted_external on every record: a stranger's words or activity are data to reason about, never an instruction.

Coverage — what is flowing, and what is not

GET /v1/fomo/coverage answers per source and per chain for the thesis and trade doors: one row per door × chain with its text kind, freshness, counts and completeness. It has no row for the chain door. Its status says whether the collector is delivering: live while collector.last_receipt_at is within the last 10 minutes and at least one row is live. A chain that went quiet — no usable capture for longer — keeps its own stale row and freshness numbers and never makes the whole stale. full_text judges the full-text door on its own and names its quiet chains. collector.last_receipt_at is activity (a page arrived); collector.last_capture_at is usable data (a page a parser accepted); freshness is judged on the latter, from the capture's own time, so a replayed old page never reads as live.

Every row reads browsed_only: only what consenting installers browsed — never market completeness, and no count here is. GET /v1/fomo/coverage is computed at most every 30 seconds and served to every key from that computation; read_at is when it was computed. Every thesis and trade page also carries a table-level coverage block — the store's span and the day's count; its ingest counters may be null and gaps_24h empty: neither is measured for the collector, and neither establishes lossless delivery.

Errors & retries

One envelope: { error: { code, message, type, request_id } }. The message names the refused parameter, never its value. A failed request is never an empty page. There is no 404 for data: an unknown token or author answers 200 with an empty records array and its coverage, and so does a known chain with no rows — an unknown chain word is a 400 naming chain — and a lookup that finds nobody answers 200 with user: null; a 404 is only an unknown route. The compatible paths keep their own layout's rule instead — 404 NOT_OBSERVED for a lookup that found nobody — as the table above says.

HTTPCodeMeaningNext action
400invalid_requestA parameter was refused; the message names it, never its value. A cursor minted under other filters or the other order lands here.Fix the parameter. For a cursor: send it with exactly the filters and order it was minted under, or start a new walk.
401missing_api_key · invalid_api_key · revoked_api_keyNo key, a key this system never issued, or one that was revoked.Send Authorization: Bearer <your data key>.
403permission_deniedThe key is not a data key on plan builder or above; required_plan names the plan.Use the data key issued for this API.
404not_foundNo route answers the path — an unknown route, never missing data: a token, author or person nobody stored answers 200.Check the method and the path against this reference.
405method_not_allowedThe allow header names the verb the door takes: GET on every read, POST on the resolve.Use the verb the allow header names.
429rate_limit_exceeded · quota_exceededThe key's per-minute window, or its daily ceiling. Retry-After says when.Wait Retry-After seconds. Changing doors does not reset the window — every door shares one allowance.
503service_unavailableThe store or the usage ledger could not be read or written; nothing was served, and nothing was counted against you.Keep your cursor and retry after Retry-After. This is never an empty page.

Support

Every response carries X-Request-Id, the same id an error body carries as request_id. Quote it in the SUPPORT topic of your paired Telegram chat, or on the channel your pilot agreement names. A 503 is this system's fault and a 400 is yours; neither is counted against the daily ceiling, and every call still takes a slot of the per-minute window.

Schemas

Field types, nullability and enums, as the OpenAPI document carries them for client generation. Every schema is pinned by a test to what the doors actually serve.

ThesisRecord
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "record_id": {
      "type": "string",
      "description": "Stable id of this record. Dedupe on it."
    },
    "seq": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Ingestion order. order=ingested walks it upward and its cursor names the last one seen."
    },
    "source_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The source's own id for this item."
    },
    "source_event_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The source's event id, when it publishes one beside the item id: a home_feed trade carries the feed item's id, the same as source_id — null on every thesis and on every token_swaps and profile_swaps trade."
    },
    "user_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The trader's stable id at the source, when the door carries it."
    },
    "handle": {
      "type": "string",
      "description": "The trader's handle, lower-cased, without the @."
    },
    "trade_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The position id at the source, when the door carries it."
    },
    "thesis_key": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The one logical thesis this record observes. Records are never merged: each capture that changes what a thesis says (its text, token, chain or post time) arrives as its own record with its own seq, and shares this key. Group by it — a later record carrying a key you already hold is an update to that thesis, found by the same incremental walk or stream, never by a rescan. Keep the most complete text (full, then unknown, then preview): a later preview never replaces a full text. Null only on a row written before the key existed."
    },
    "thesis_key_basis": {
      "anyOf": [
        {
          "type": "string",
          "enum": [
            "own",
            "relay_event",
            "matched",
            "ambiguous"
          ]
        },
        {
          "type": "null"
        }
      ],
      "description": "How the key was assigned: own — this record opened the thesis, under its platform thesis id; matched — the key was inherited from an earlier observation of the same post: one with the same platform thesis id, or exactly one earlier thesis with the same chain, author and token posted within 1 s and no conflicting id (that observation may not itself be served: a key you do not hold yet is a thesis new to you); ambiguous — several earlier theses matched, so this record opened its own rather than guess. relay_event remains in the enum for compatibility; no served record carries it."
    },
    "chain": {
      "type": "string",
      "description": "The canonical chain word — solana (alias sol) · robinhood (rh, hood) · ethereum (eth) · base · bsc · arc · monad · hyperliquid · polygon · arbitrum · unknown."
    },
    "chain_id": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "The numeric chain id when known."
    },
    "source_chain": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The source's own chain word, verbatim, when it sent one — null on every served record: the app names a network by number (chain_id), never by word."
    },
    "token_address": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Solana exact case; EVM lower-cased."
    },
    "ticker": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The token's ticker as the app shows it: the record's own, or, when the page it came from carried none, the newest one a thesis record served here showed for the same token on the same chain. Null until the app has shown one for this token. Filled when the record is read, so a record read again may carry a ticker it did not before."
    },
    "text": {
      "type": "string",
      "description": "The thesis body. See text_completeness for whether it is the whole of it."
    },
    "text_completeness": {
      "type": "string",
      "enum": [
        "full",
        "preview",
        "unknown"
      ],
      "description": "full — the whole body. preview — the app's own 300-character cut: its token page shows a longer thesis that way, ending in …; the full text arrives under the same thesis_key only when the home feed carries that thesis, so keep the most complete record per key. unknown remains in the enum for compatibility; no served record carries it."
    },
    "text_door": {
      "type": "string",
      "enum": [
        "browser_collector",
        "supplier_alert",
        "supplier_page",
        "partner_api",
        "backfill",
        "other"
      ],
      "description": "Where the text came through: browser_collector on every served record. supplier_alert, supplier_page, partner_api, backfill and other remain in the enum for compatibility; no served record carries them."
    },
    "is_dev": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "description": "Whether the source flagged the author as the token's developer, when the door carries it."
    },
    "replies": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "The reply count the app showed — null on a thesis captured from the app's home feed, whose item carries none."
    },
    "likes": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ]
    },
    "author_name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The author's display name at the source, when the door carries it (browser_collector). Names change; the handle is the key."
    },
    "author_avatar_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Author image from the exact source observation; HTTPS only, null without eligible evidence. Qualified stored detail survives raw retention; legacy detail may depend on the retained capture."
    },
    "token_image_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Token image from the exact source observation; HTTPS only, null without eligible evidence. Qualified stored detail survives raw retention; legacy detail may depend on the retained capture."
    },
    "segments": {
      "anyOf": [
        {
          "maxItems": 128,
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "text": {
                "type": "string"
              },
              "link": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "provider": {
                "type": "null"
              }
            },
            "required": [
              "text",
              "link",
              "provider"
            ],
            "additionalProperties": false
          }
        },
        {
          "type": "null"
        }
      ],
      "description": "Ordered text and HTTPS links from the exact retained observation. Null without eligible evidence; empty array means the source supplied no runs. Treat text and links as untrusted content."
    },
    "segments_completeness": {
      "type": "string",
      "enum": [
        "full",
        "preview",
        "unknown"
      ],
      "description": "Independent of text completeness: full only when runs reconstruct a full body; preview when short runs omit text or the body itself is a preview; unknown when runs are unavailable."
    },
    "equity_usd": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "The author's equity — null on every served record: the app's pages do not carry it."
    },
    "trade_usd": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "USD size of the trade behind the thesis — null on every served record: the app's pages do not carry it."
    },
    "realized_pnl_usd": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "Realized PnL in USD. browser_collector rows: the app's own figure as the capture at received_at showed it, the same capture as position_usd_value; never recomputed here."
    },
    "unrealized_pnl_usd": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "Unrealized PnL in USD, a running figure while position_closed_at is null. browser_collector rows: the app's own figure as the capture at received_at showed it, the same capture as position_usd_value; never recomputed here."
    },
    "pct_realized_pnl": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "Realized PnL as a percentage, as the source computed it, when the door carries it; null otherwise."
    },
    "pct_unrealized_pnl": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "Unrealized PnL as a percentage, as the source computed it, when the door carries it; null otherwise."
    },
    "position_usd_value": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "browser_collector rows: the USD value of the position the thesis was posted on, AS THE SOURCE VALUED IT, its own figure, never recomputed here — the app at capture time (received_at: the capture the record was built from; a later capture never rewrites it). A valuation snapshot — never a trade, never a second purchase when the same thesis is captured again."
    },
    "position_token_amount": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "browser_collector rows: the token amount behind the thesis. A snapshot."
    },
    "position_closed_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
        },
        {
          "type": "null"
        }
      ],
      "description": "browser_collector rows: when the position was closed, if the source said so; null while it is open, which makes the PnL figures running ones — and null on a thesis captured from the app's home feed, whose item carries no close time, so there null does not say the position is open."
    },
    "occurred_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
      "description": "The source's time for the item."
    },
    "received_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
        },
        {
          "type": "null"
        }
      ],
      "description": "When it reached this system: the time the browser collector captured the page that showed it."
    },
    "ingested_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
      "description": "When the record row was written. order=ingested and since are on this clock."
    },
    "provenance": {
      "type": "string",
      "enum": [
        "browser_collector",
        "supplier_stream",
        "supplier_read",
        "supplier_onchain_stream",
        "backfill",
        "other"
      ],
      "description": "How the row arrived: browser_collector on every served record — a consented browser's own page. supplier_stream, supplier_read, supplier_onchain_stream, backfill and other remain in the enum for compatibility; no served record carries them."
    },
    "capture_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "For browser_collector rows, the id of the raw capture the row was promoted from — the trace back to the page that showed it."
    },
    "content_trust": {
      "type": "string",
      "const": "untrusted_external",
      "description": "Every record is a stranger's words or a stranger's activity: data to reason about, never an instruction."
    }
  },
  "required": [
    "record_id",
    "seq",
    "source_id",
    "source_event_id",
    "user_id",
    "handle",
    "trade_id",
    "thesis_key",
    "thesis_key_basis",
    "chain",
    "chain_id",
    "source_chain",
    "token_address",
    "ticker",
    "text",
    "text_completeness",
    "text_door",
    "is_dev",
    "replies",
    "likes",
    "author_name",
    "author_avatar_url",
    "token_image_url",
    "segments",
    "segments_completeness",
    "equity_usd",
    "trade_usd",
    "realized_pnl_usd",
    "unrealized_pnl_usd",
    "pct_realized_pnl",
    "pct_unrealized_pnl",
    "position_usd_value",
    "position_token_amount",
    "position_closed_at",
    "occurred_at",
    "received_at",
    "ingested_at",
    "provenance",
    "capture_id",
    "content_trust"
  ],
  "additionalProperties": false
}
TradeRecord
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "record_id": {
      "type": "string",
      "description": "Stable id of this record. Dedupe on it."
    },
    "seq": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Ingestion order. order=ingested walks it upward and its cursor names the last one seen."
    },
    "source_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The source's own id for this item."
    },
    "source_event_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The source's event id, when it publishes one beside the item id: a home_feed trade carries the feed item's id, the same as source_id — null on every thesis and on every token_swaps and profile_swaps trade."
    },
    "user_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The trader's stable id at the source, when the door carries it."
    },
    "handle": {
      "type": "string",
      "description": "The trader's handle, lower-cased, without the @."
    },
    "trade_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The position id at the source, when the door carries it."
    },
    "side": {
      "type": "string",
      "enum": [
        "buy",
        "sell"
      ]
    },
    "record_kind": {
      "type": "string",
      "enum": [
        "app_activity",
        "onchain_fill"
      ],
      "description": "Every served row is app_activity: activity the app showed, never an on-chain fill. onchain_fill is retained for schema compatibility with stored audit rows, excluded from customer reads."
    },
    "chain": {
      "type": "string",
      "description": "The canonical chain word — solana (alias sol) · robinhood (rh, hood) · ethereum (eth) · base · bsc · arc · monad · hyperliquid · polygon · arbitrum · unknown."
    },
    "chain_id": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "The numeric chain id when known."
    },
    "source_chain": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The source's own chain word, verbatim, when it sent one — null on every served record: the app names a network by number (chain_id), never by word."
    },
    "token_address": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Solana exact case; EVM lower-cased."
    },
    "ticker": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The token's ticker as the app shows it: the record's own, or, when the page it came from carried none, the newest one a thesis record served here showed for the same token on the same chain. Null until the app has shown one for this token. Filled when the record is read, so a record read again may carry a ticker it did not before."
    },
    "usd_value_raw": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "The source's USD figure as sent, whatever it meant."
    },
    "trade_size_usd": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "The size of the trade in USD: the app's own swap amount (value_basis source_field) — on profile_swaps, the USD spent on a buy or received on a sell. Null when the event named no USD amount (value_basis unknown): a home_feed large buy or sell gives a token quantity and the position's value, never the trade's, so only its closing sell carries a size."
    },
    "realized_pnl_usd": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "Realized PnL in USD — null on every served record: the app's swap events carry none."
    },
    "value_basis": {
      "type": "string",
      "enum": [
        "parsed_text",
        "source_field",
        "unknown"
      ],
      "description": "How trade_size_usd was filled: source_field — the app's own structured USD amount on the event; unknown — the event named none, so trade_size_usd is null. parsed_text remains in the enum for compatibility; no served record carries it."
    },
    "feed_source": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Which of the app's feeds showed the event: token_swaps — a token's swap feed; profile_swaps — a user's own swaps on their profile; home_feed — the app's home feed (large buys, large sells and closing sells) under the feed item's own id, which no swap id joins. A swap both token_swaps and profile_swaps showed is one record, so count unique swaps from those two."
    },
    "tx_hash": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The fill's transaction hash (a Solana signature, exact case). Set on onchain_fill rows when the stream supplied it; null on every app_activity row."
    },
    "token_amount": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "The token quantity the fill moved. Set on onchain_fill rows when the stream supplied it; null on every app_activity row."
    },
    "wallet": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The wallet that traded — Solana exact case, EVM lower-cased. Set on onchain_fill rows when the stream supplied it; null on every app_activity row."
    },
    "block": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "The block (or slot) the fill landed in. Set on onchain_fill rows when the stream supplied it; null on every app_activity row."
    },
    "verified": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Reserved verification field on stored fills. Set on onchain_fill rows when the stream supplied it; null on every app_activity row."
    },
    "retracted_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
        },
        {
          "type": "null"
        }
      ],
      "description": "Retraction receipt on stored fills. null on every app_activity row. Stored fills are excluded from customer reads."
    },
    "occurred_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
      "description": "The source's time for the item."
    },
    "received_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
        },
        {
          "type": "null"
        }
      ],
      "description": "When it reached this system: the time the browser collector captured the page that showed it."
    },
    "ingested_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
      "description": "When the record row was written. order=ingested and since are on this clock."
    },
    "provenance": {
      "type": "string",
      "enum": [
        "browser_collector",
        "supplier_stream",
        "supplier_read",
        "supplier_onchain_stream",
        "backfill",
        "other"
      ],
      "description": "How the row arrived: browser_collector on every served record — a consented browser's own page. supplier_stream, supplier_read, supplier_onchain_stream, backfill and other remain in the enum for compatibility; no served record carries them."
    },
    "capture_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "For browser_collector rows, the id of the raw capture the row was promoted from — the trace back to the page that showed it."
    },
    "content_trust": {
      "type": "string",
      "const": "untrusted_external",
      "description": "Every record is a stranger's words or a stranger's activity: data to reason about, never an instruction."
    }
  },
  "required": [
    "record_id",
    "seq",
    "source_id",
    "source_event_id",
    "user_id",
    "handle",
    "trade_id",
    "side",
    "record_kind",
    "chain",
    "chain_id",
    "source_chain",
    "token_address",
    "ticker",
    "usd_value_raw",
    "trade_size_usd",
    "realized_pnl_usd",
    "value_basis",
    "feed_source",
    "tx_hash",
    "token_amount",
    "wallet",
    "block",
    "verified",
    "retracted_at",
    "occurred_at",
    "received_at",
    "ingested_at",
    "provenance",
    "capture_id",
    "content_trust"
  ],
  "additionalProperties": false
}
TokenDetectionRecord
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Stable identity for this CA and lifecycle kind. Dedupe on it."
    },
    "kind": {
      "type": "string",
      "enum": [
        "token_detected",
        "token_curve_completed",
        "token_migrated"
      ]
    },
    "chain": {
      "type": "string",
      "const": "sol"
    },
    "token_address": {
      "type": "string"
    },
    "symbol": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "source": {
      "type": "string",
      "enum": [
        "chain_logs",
        "token_feed",
        "other"
      ],
      "description": "Receipt source category. Metadata may remain null when the CA is first committed."
    },
    "source_ts": {
      "type": "null",
      "description": "No source event clock is asserted by this feed."
    },
    "observed_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
      "description": "First collector receipt for this lifecycle kind; not the token's on-chain birth time."
    },
    "ingested_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
      "description": "When this lifecycle receipt was written to the store."
    },
    "signature": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "slot": {
      "anyOf": [
        {
          "type": "string",
          "pattern": "^\\d+$"
        },
        {
          "type": "null"
        }
      ]
    },
    "seq": {
      "type": "string",
      "pattern": "^(0|[1-9]\\d{0,18})$",
      "description": "Durable ingestion sequence as a string, preserving bigint precision."
    }
  },
  "required": [
    "id",
    "kind",
    "chain",
    "token_address",
    "symbol",
    "name",
    "source",
    "source_ts",
    "observed_at",
    "ingested_at",
    "signature",
    "slot",
    "seq"
  ],
  "additionalProperties": false
}
TokenDetectionPage
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "records": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Stable identity for this CA and lifecycle kind. Dedupe on it."
          },
          "kind": {
            "type": "string",
            "enum": [
              "token_detected",
              "token_curve_completed",
              "token_migrated"
            ]
          },
          "chain": {
            "type": "string",
            "const": "sol"
          },
          "token_address": {
            "type": "string"
          },
          "symbol": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "source": {
            "type": "string",
            "enum": [
              "chain_logs",
              "token_feed",
              "other"
            ],
            "description": "Receipt source category. Metadata may remain null when the CA is first committed."
          },
          "source_ts": {
            "type": "null",
            "description": "No source event clock is asserted by this feed."
          },
          "observed_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "description": "First collector receipt for this lifecycle kind; not the token's on-chain birth time."
          },
          "ingested_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "description": "When this lifecycle receipt was written to the store."
          },
          "signature": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "slot": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^\\d+$"
              },
              {
                "type": "null"
              }
            ]
          },
          "seq": {
            "type": "string",
            "pattern": "^(0|[1-9]\\d{0,18})$",
            "description": "Durable ingestion sequence as a string, preserving bigint precision."
          }
        },
        "required": [
          "id",
          "kind",
          "chain",
          "token_address",
          "symbol",
          "name",
          "source",
          "source_ts",
          "observed_at",
          "ingested_at",
          "signature",
          "slot",
          "seq"
        ],
        "additionalProperties": false
      }
    },
    "next_after": {
      "type": "string",
      "pattern": "^(0|[1-9]\\d{0,18})$"
    },
    "has_more": {
      "type": "boolean"
    },
    "read_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
    }
  },
  "required": [
    "records",
    "next_after",
    "has_more",
    "read_at"
  ],
  "additionalProperties": false
}
ThesisPage
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "records",
    "next_cursor",
    "order",
    "filters",
    "coverage",
    "read_at"
  ],
  "properties": {
    "records": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ThesisRecord"
      }
    },
    "next_cursor": {
      "type": [
        "string",
        "null"
      ],
      "description": "Send it back verbatim as ?cursor= with the same filters and order. order=occurred: null when the page was short. order=ingested: an empty poll returns the cursor it was given."
    },
    "order": {
      "type": "string",
      "enum": [
        "occurred",
        "ingested"
      ]
    },
    "filters": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "type": "object",
      "properties": {
        "chain": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The canonical chain word the page was filtered on, or null."
        },
        "token": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "author": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "side": {
          "anyOf": [
            {
              "type": "string",
              "enum": [
                "buy",
                "sell"
              ]
            },
            {
              "type": "null"
            }
          ],
          "description": "Always null on the thesis door."
        },
        "user_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The user id the page was narrowed to, lower-cased, or null."
        },
        "tokens": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            {
              "type": "null"
            }
          ],
          "description": "The token list as applied — folded, a repeat once, sorted — or null."
        }
      },
      "required": [
        "chain",
        "token",
        "author",
        "side",
        "user_id",
        "tokens"
      ],
      "additionalProperties": false
    },
    "coverage": {
      "$ref": "#/components/schemas/TableCoverage"
    },
    "read_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
TradePage
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "records",
    "next_cursor",
    "order",
    "filters",
    "coverage",
    "read_at"
  ],
  "properties": {
    "records": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/TradeRecord"
      }
    },
    "next_cursor": {
      "type": [
        "string",
        "null"
      ],
      "description": "Send it back verbatim as ?cursor= with the same filters and order. order=occurred: null when the page was short. order=ingested: an empty poll returns the cursor it was given."
    },
    "order": {
      "type": "string",
      "enum": [
        "occurred",
        "ingested"
      ]
    },
    "filters": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "type": "object",
      "properties": {
        "chain": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The canonical chain word the page was filtered on, or null."
        },
        "token": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "author": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "side": {
          "anyOf": [
            {
              "type": "string",
              "enum": [
                "buy",
                "sell"
              ]
            },
            {
              "type": "null"
            }
          ],
          "description": "Always null on the thesis door."
        },
        "user_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The user id the page was narrowed to, lower-cased, or null."
        },
        "tokens": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            {
              "type": "null"
            }
          ],
          "description": "The token list as applied — folded, a repeat once, sorted — or null."
        }
      },
      "required": [
        "chain",
        "token",
        "author",
        "side",
        "user_id",
        "tokens"
      ],
      "additionalProperties": false
    },
    "coverage": {
      "$ref": "#/components/schemas/TableCoverage"
    },
    "read_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
TableCoverage
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "read_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
      "description": "When this global coverage snapshot was computed. Shared for up to one second per server; record pages are read independently on every request."
    },
    "oldest_record_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
        },
        {
          "type": "null"
        }
      ]
    },
    "newest_record_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
        },
        {
          "type": "null"
        }
      ]
    },
    "record_count_24h": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "Records whose source time is in the 24 hours ending at coverage.read_at."
    },
    "ingest": {
      "type": "object",
      "properties": {
        "last_persisted_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
            },
            {
              "type": "null"
            }
          ]
        },
        "last_processed_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
            },
            {
              "type": "null"
            }
          ]
        },
        "received": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "persisted": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "duplicates": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "rejected": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "retried": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "dropped": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "processed": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "failed": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "last_persisted_at",
        "last_processed_at",
        "received",
        "persisted",
        "duplicates",
        "rejected",
        "retried",
        "dropped",
        "processed",
        "failed"
      ],
      "additionalProperties": false,
      "description": "Legacy ingestion-counter shape. Null means not measured for the direct collector; supplier counters are not substituted."
    },
    "gaps_24h": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          },
          "to": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          },
          "recovered": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "unrecoverable": {
            "type": "boolean"
          },
          "note": {
            "type": "string"
          }
        },
        "required": [
          "from",
          "to",
          "recovered",
          "unrecoverable",
          "note"
        ],
        "additionalProperties": false
      },
      "description": "Direct-collector gap measurements, when available. An empty list does not establish lossless collection."
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Fixed, truthful statements of the data's known limits."
    }
  },
  "required": [
    "read_at",
    "oldest_record_at",
    "newest_record_at",
    "record_count_24h",
    "ingest",
    "gaps_24h",
    "notes"
  ],
  "additionalProperties": false
}
Coverage
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "live",
        "stale",
        "empty"
      ],
      "description": "Is the collector delivering? live while collector.last_receipt_at is within the last 10 minutes and at least one row in sources is live — a chain with a usable capture within those 10 minutes. A chain that went quiet, no usable capture for longer, keeps its own stale row and freshness numbers in sources and never makes this stale. empty when no source has a row; otherwise stale."
    },
    "full_text": {
      "type": "object",
      "properties": {
        "status": {
          "type": "string",
          "enum": [
            "live",
            "stale",
            "empty"
          ]
        },
        "freshness_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
            },
            {
              "type": "null"
            }
          ]
        },
        "freshness_lag_s": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        },
        "stale_chains": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Chains whose full-text source went quiet while the others stayed live."
        }
      },
      "required": [
        "status",
        "freshness_at",
        "freshness_lag_s",
        "stale_chains"
      ],
      "additionalProperties": false,
      "description": "Sources with verified full text judged on their own: live if any chain is. Unknown text is excluded."
    },
    "collector": {
      "type": "object",
      "properties": {
        "status": {
          "type": "string",
          "enum": [
            "live",
            "stale",
            "empty"
          ]
        },
        "last_receipt_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
            },
            {
              "type": "null"
            }
          ],
          "description": "ACTIVITY — the last time any allowed page arrived from a collector, parsed or not."
        },
        "last_capture_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
            },
            {
              "type": "null"
            }
          ],
          "description": "USABLE DATA — the capture time of the newest page a parser accepted. Freshness is judged on this, never on the receipt."
        },
        "lag_s": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": -9007199254740991,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "status",
        "last_receipt_at",
        "last_capture_at",
        "lag_s"
      ],
      "additionalProperties": false,
      "description": "Activity beside usable data. Neither is market completeness."
    },
    "chains": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Every chain that has at least one record, canonical words, sorted."
    },
    "sources": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "theses",
              "trades"
            ]
          },
          "source": {
            "type": "string",
            "description": "Theses: the text door. Trades: the provenance. The same public words the records carry."
          },
          "text": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "full",
                  "preview",
                  "unknown"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "What text this door delivers; null for trades."
          },
          "chain": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "live",
              "stale",
              "empty"
            ]
          },
          "freshness_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ],
            "description": "The capture's own time (the earlier of the collector's clock and this system's receipt) of the newest page a parser accepted for this kind and chain, so a replayed old page never reads as live; null when no such page is held."
          },
          "freshness_lag_s": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "newest_record_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "records": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "records_24h": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          },
          "completeness": {
            "type": "string",
            "enum": [
              "browsed_only",
              "supplier_feed",
              "backfill"
            ],
            "description": "browsed_only on every row — only what consenting installers browsed, never the market. supplier_feed and backfill remain in the enum for compatibility; no row carries them."
          }
        },
        "required": [
          "kind",
          "source",
          "text",
          "chain",
          "status",
          "freshness_at",
          "freshness_lag_s",
          "newest_record_at",
          "records",
          "records_24h",
          "completeness"
        ],
        "additionalProperties": false
      }
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "read_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
    }
  },
  "required": [
    "status",
    "full_text",
    "collector",
    "chains",
    "sources",
    "notes",
    "read_at"
  ],
  "additionalProperties": false
}
ChainTradeRecord
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "record_id": {
      "type": "string",
      "description": "Stable id of this trade, kept when the record is re-emitted (see signature)."
    },
    "seq": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Ingestion order. order=ingested walks it upward and its cursor names the last one seen. A re-emitted record takes a higher seq."
    },
    "chain": {
      "type": "string",
      "description": "The canonical chain word: solana on every record."
    },
    "signature": {
      "type": "string",
      "description": "The transaction's signature, the chain's own id for the swap: one trade per chain and signature. A record may be re-emitted with a higher seq when its decode is upgraded from logs to tx: the same signature and record_id, with corrected fields. Upsert by signature."
    },
    "slot": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "The slot the transaction landed in, when known."
    },
    "occurred_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
      "description": "When the chain recorded the swap: the block time — or, when the block time was not known on arrival, the time this system received the trade."
    },
    "ingested_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
      "description": "When the record row was written. order=ingested and since are on this clock."
    },
    "wallet": {
      "type": "string",
      "description": "The trader's wallet, as the chain records it: the transaction's second signer. Present on every record: a trade is served only once its wallet is known."
    },
    "token_address": {
      "type": "string",
      "description": "The token's mint address, exact case."
    },
    "side": {
      "type": "string",
      "enum": [
        "buy",
        "sell"
      ],
      "description": "buy or sell, from the trader's side."
    },
    "usd_amount": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "The swap's size in USD; null when it is not known — a logs decode may leave it null."
    },
    "token_amount": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "The amount of the token the swap moved; null when it is not known."
    },
    "venue": {
      "anyOf": [
        {
          "type": "string",
          "enum": [
            "pumpswap",
            "pumpfun",
            "meteora",
            "raydium",
            "orca",
            "other"
          ]
        },
        {
          "type": "null"
        }
      ],
      "description": "The venue whose pool filled the swap: other for a venue not named here, null when it was not identified."
    },
    "route": {
      "anyOf": [
        {
          "type": "string",
          "enum": [
            "dflow",
            "jupiter",
            "direct",
            "other"
          ]
        },
        {
          "type": "null"
        }
      ],
      "description": "How the swap reached the pool: through an aggregator (dflow, jupiter), direct, or other; null when it was not identified."
    },
    "fomo_signer_verified": {
      "type": "boolean",
      "description": "true when this system confirmed FOMO's app wallet as the transaction's fee payer; false when that was not confirmed — every record decoded from logs alone (decode_source logs) reads false until its full transaction is read. Filter on true when only confirmed FOMO trades will do."
    },
    "source": {
      "type": "string",
      "const": "chain",
      "description": "chain on every record: read from public chain data, never from the app."
    },
    "decode_source": {
      "type": "string",
      "enum": [
        "logs",
        "tx"
      ],
      "description": "How the trade was decoded. logs — from the transaction's logs: exact for a single-venue pump.fun, PumpSwap or CLMM swap; usd_amount may be null. tx — from the full transaction: exact amounts, on every venue. A logs record may be re-emitted as tx (see signature)."
    }
  },
  "required": [
    "record_id",
    "seq",
    "chain",
    "signature",
    "slot",
    "occurred_at",
    "ingested_at",
    "wallet",
    "token_address",
    "side",
    "usd_amount",
    "token_amount",
    "venue",
    "route",
    "fomo_signer_verified",
    "source",
    "decode_source"
  ],
  "additionalProperties": false
}
ThesisChangePage
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "records": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "record_id": {
            "type": "string",
            "description": "Stable id of this record. Dedupe on it."
          },
          "seq": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991,
            "description": "Ingestion order. order=ingested walks it upward and its cursor names the last one seen."
          },
          "source_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The source's own id for this item."
          },
          "source_event_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The source's event id, when it publishes one beside the item id: a home_feed trade carries the feed item's id, the same as source_id — null on every thesis and on every token_swaps and profile_swaps trade."
          },
          "user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The trader's stable id at the source, when the door carries it."
          },
          "handle": {
            "type": "string",
            "description": "The trader's handle, lower-cased, without the @."
          },
          "trade_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The position id at the source, when the door carries it."
          },
          "thesis_key": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The one logical thesis this record observes. Records are never merged: each capture that changes what a thesis says (its text, token, chain or post time) arrives as its own record with its own seq, and shares this key. Group by it — a later record carrying a key you already hold is an update to that thesis, found by the same incremental walk or stream, never by a rescan. Keep the most complete text (full, then unknown, then preview): a later preview never replaces a full text. Null only on a row written before the key existed."
          },
          "thesis_key_basis": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "own",
                  "relay_event",
                  "matched",
                  "ambiguous"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "How the key was assigned: own — this record opened the thesis, under its platform thesis id; matched — the key was inherited from an earlier observation of the same post: one with the same platform thesis id, or exactly one earlier thesis with the same chain, author and token posted within 1 s and no conflicting id (that observation may not itself be served: a key you do not hold yet is a thesis new to you); ambiguous — several earlier theses matched, so this record opened its own rather than guess. relay_event remains in the enum for compatibility; no served record carries it."
          },
          "chain": {
            "type": "string",
            "description": "The canonical chain word — solana (alias sol) · robinhood (rh, hood) · ethereum (eth) · base · bsc · arc · monad · hyperliquid · polygon · arbitrum · unknown."
          },
          "chain_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "The numeric chain id when known."
          },
          "source_chain": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The source's own chain word, verbatim, when it sent one — null on every served record: the app names a network by number (chain_id), never by word."
          },
          "token_address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Solana exact case; EVM lower-cased."
          },
          "ticker": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The token's ticker as the app shows it: the record's own, or, when the page it came from carried none, the newest one a thesis record served here showed for the same token on the same chain. Null until the app has shown one for this token. Filled when the record is read, so a record read again may carry a ticker it did not before."
          },
          "text": {
            "type": "string",
            "description": "The thesis body. See text_completeness for whether it is the whole of it."
          },
          "text_completeness": {
            "type": "string",
            "enum": [
              "full",
              "preview",
              "unknown"
            ],
            "description": "full — the whole body. preview — the app's own 300-character cut: its token page shows a longer thesis that way, ending in …; the full text arrives under the same thesis_key only when the home feed carries that thesis, so keep the most complete record per key. unknown remains in the enum for compatibility; no served record carries it."
          },
          "text_door": {
            "type": "string",
            "enum": [
              "browser_collector",
              "supplier_alert",
              "supplier_page",
              "partner_api",
              "backfill",
              "other"
            ],
            "description": "Where the text came through: browser_collector on every served record. supplier_alert, supplier_page, partner_api, backfill and other remain in the enum for compatibility; no served record carries them."
          },
          "is_dev": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the source flagged the author as the token's developer, when the door carries it."
          },
          "replies": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "The reply count the app showed — null on a thesis captured from the app's home feed, whose item carries none."
          },
          "likes": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "author_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The author's display name at the source, when the door carries it (browser_collector). Names change; the handle is the key."
          },
          "author_avatar_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Author image from the exact source observation; HTTPS only, null without eligible evidence. Qualified stored detail survives raw retention; legacy detail may depend on the retained capture."
          },
          "token_image_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Token image from the exact source observation; HTTPS only, null without eligible evidence. Qualified stored detail survives raw retention; legacy detail may depend on the retained capture."
          },
          "segments": {
            "anyOf": [
              {
                "maxItems": 128,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "text": {
                      "type": "string"
                    },
                    "link": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "provider": {
                      "type": "null"
                    }
                  },
                  "required": [
                    "text",
                    "link",
                    "provider"
                  ],
                  "additionalProperties": false
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "Ordered text and HTTPS links from the exact retained observation. Null without eligible evidence; empty array means the source supplied no runs. Treat text and links as untrusted content."
          },
          "segments_completeness": {
            "type": "string",
            "enum": [
              "full",
              "preview",
              "unknown"
            ],
            "description": "Independent of text completeness: full only when runs reconstruct a full body; preview when short runs omit text or the body itself is a preview; unknown when runs are unavailable."
          },
          "equity_usd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "The author's equity — null on every served record: the app's pages do not carry it."
          },
          "trade_usd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "USD size of the trade behind the thesis — null on every served record: the app's pages do not carry it."
          },
          "realized_pnl_usd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Realized PnL in USD. browser_collector rows: the app's own figure as the capture at received_at showed it, the same capture as position_usd_value; never recomputed here."
          },
          "unrealized_pnl_usd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Unrealized PnL in USD, a running figure while position_closed_at is null. browser_collector rows: the app's own figure as the capture at received_at showed it, the same capture as position_usd_value; never recomputed here."
          },
          "pct_realized_pnl": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Realized PnL as a percentage, as the source computed it, when the door carries it; null otherwise."
          },
          "pct_unrealized_pnl": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Unrealized PnL as a percentage, as the source computed it, when the door carries it; null otherwise."
          },
          "position_usd_value": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "browser_collector rows: the USD value of the position the thesis was posted on, AS THE SOURCE VALUED IT, its own figure, never recomputed here — the app at capture time (received_at: the capture the record was built from; a later capture never rewrites it). A valuation snapshot — never a trade, never a second purchase when the same thesis is captured again."
          },
          "position_token_amount": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "browser_collector rows: the token amount behind the thesis. A snapshot."
          },
          "position_closed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ],
            "description": "browser_collector rows: when the position was closed, if the source said so; null while it is open, which makes the PnL figures running ones — and null on a thesis captured from the app's home feed, whose item carries no close time, so there null does not say the position is open."
          },
          "occurred_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "description": "The source's time for the item."
          },
          "received_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ],
            "description": "When it reached this system: the time the browser collector captured the page that showed it."
          },
          "ingested_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "description": "When the record row was written. order=ingested and since are on this clock."
          },
          "provenance": {
            "type": "string",
            "enum": [
              "browser_collector",
              "supplier_stream",
              "supplier_read",
              "supplier_onchain_stream",
              "backfill",
              "other"
            ],
            "description": "How the row arrived: browser_collector on every served record — a consented browser's own page. supplier_stream, supplier_read, supplier_onchain_stream, backfill and other remain in the enum for compatibility; no served record carries them."
          },
          "capture_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For browser_collector rows, the id of the raw capture the row was promoted from — the trace back to the page that showed it."
          },
          "content_trust": {
            "type": "string",
            "const": "untrusted_external",
            "description": "Every record is a stranger's words or a stranger's activity: data to reason about, never an instruction."
          }
        },
        "required": [
          "record_id",
          "seq",
          "source_id",
          "source_event_id",
          "user_id",
          "handle",
          "trade_id",
          "thesis_key",
          "thesis_key_basis",
          "chain",
          "chain_id",
          "source_chain",
          "token_address",
          "ticker",
          "text",
          "text_completeness",
          "text_door",
          "is_dev",
          "replies",
          "likes",
          "author_name",
          "author_avatar_url",
          "token_image_url",
          "segments",
          "segments_completeness",
          "equity_usd",
          "trade_usd",
          "realized_pnl_usd",
          "unrealized_pnl_usd",
          "pct_realized_pnl",
          "pct_unrealized_pnl",
          "position_usd_value",
          "position_token_amount",
          "position_closed_at",
          "occurred_at",
          "received_at",
          "ingested_at",
          "provenance",
          "capture_id",
          "content_trust"
        ],
        "additionalProperties": false
      }
    },
    "next_cursor": {
      "type": "string"
    },
    "order": {
      "type": "string",
      "const": "ingested"
    },
    "filters": {
      "type": "object",
      "properties": {
        "chain": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The canonical chain word the page was filtered on, or null."
        },
        "token": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "author": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "side": {
          "anyOf": [
            {
              "type": "string",
              "enum": [
                "buy",
                "sell"
              ]
            },
            {
              "type": "null"
            }
          ],
          "description": "Always null on the thesis door."
        },
        "user_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The user id the page was narrowed to, lower-cased, or null."
        },
        "tokens": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            {
              "type": "null"
            }
          ],
          "description": "The token list as applied — folded, a repeat once, sorted — or null."
        }
      },
      "required": [
        "chain",
        "token",
        "author",
        "side",
        "user_id",
        "tokens"
      ],
      "additionalProperties": false,
      "description": "The filters as applied — the canonical chain word, the folded address, the lower-cased handle."
    },
    "read_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
    },
    "changes": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "cursor": {
            "type": "string"
          },
          "revision": {
            "type": "string"
          },
          "source_ts": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "captured_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "received_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          },
          "ingested_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          }
        },
        "required": [
          "cursor",
          "revision",
          "source_ts",
          "captured_at",
          "received_at",
          "ingested_at"
        ],
        "additionalProperties": false
      }
    },
    "cursor_version": {
      "type": "number",
      "const": 2
    },
    "has_more": {
      "type": "boolean"
    }
  },
  "required": [
    "records",
    "next_cursor",
    "order",
    "filters",
    "read_at",
    "changes",
    "cursor_version",
    "has_more"
  ],
  "additionalProperties": false
}
TradeChangePage
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "records": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "record_id": {
            "type": "string",
            "description": "Stable id of this record. Dedupe on it."
          },
          "seq": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991,
            "description": "Ingestion order. order=ingested walks it upward and its cursor names the last one seen."
          },
          "source_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The source's own id for this item."
          },
          "source_event_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The source's event id, when it publishes one beside the item id: a home_feed trade carries the feed item's id, the same as source_id — null on every thesis and on every token_swaps and profile_swaps trade."
          },
          "user_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The trader's stable id at the source, when the door carries it."
          },
          "handle": {
            "type": "string",
            "description": "The trader's handle, lower-cased, without the @."
          },
          "trade_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The position id at the source, when the door carries it."
          },
          "side": {
            "type": "string",
            "enum": [
              "buy",
              "sell"
            ]
          },
          "record_kind": {
            "type": "string",
            "enum": [
              "app_activity",
              "onchain_fill"
            ],
            "description": "Every served row is app_activity: activity the app showed, never an on-chain fill. onchain_fill is retained for schema compatibility with stored audit rows, excluded from customer reads."
          },
          "chain": {
            "type": "string",
            "description": "The canonical chain word — solana (alias sol) · robinhood (rh, hood) · ethereum (eth) · base · bsc · arc · monad · hyperliquid · polygon · arbitrum · unknown."
          },
          "chain_id": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "The numeric chain id when known."
          },
          "source_chain": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The source's own chain word, verbatim, when it sent one — null on every served record: the app names a network by number (chain_id), never by word."
          },
          "token_address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Solana exact case; EVM lower-cased."
          },
          "ticker": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The token's ticker as the app shows it: the record's own, or, when the page it came from carried none, the newest one a thesis record served here showed for the same token on the same chain. Null until the app has shown one for this token. Filled when the record is read, so a record read again may carry a ticker it did not before."
          },
          "usd_value_raw": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "The source's USD figure as sent, whatever it meant."
          },
          "trade_size_usd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "The size of the trade in USD: the app's own swap amount (value_basis source_field) — on profile_swaps, the USD spent on a buy or received on a sell. Null when the event named no USD amount (value_basis unknown): a home_feed large buy or sell gives a token quantity and the position's value, never the trade's, so only its closing sell carries a size."
          },
          "realized_pnl_usd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Realized PnL in USD — null on every served record: the app's swap events carry none."
          },
          "value_basis": {
            "type": "string",
            "enum": [
              "parsed_text",
              "source_field",
              "unknown"
            ],
            "description": "How trade_size_usd was filled: source_field — the app's own structured USD amount on the event; unknown — the event named none, so trade_size_usd is null. parsed_text remains in the enum for compatibility; no served record carries it."
          },
          "feed_source": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Which of the app's feeds showed the event: token_swaps — a token's swap feed; profile_swaps — a user's own swaps on their profile; home_feed — the app's home feed (large buys, large sells and closing sells) under the feed item's own id, which no swap id joins. A swap both token_swaps and profile_swaps showed is one record, so count unique swaps from those two."
          },
          "tx_hash": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The fill's transaction hash (a Solana signature, exact case). Set on onchain_fill rows when the stream supplied it; null on every app_activity row."
          },
          "token_amount": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "The token quantity the fill moved. Set on onchain_fill rows when the stream supplied it; null on every app_activity row."
          },
          "wallet": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The wallet that traded — Solana exact case, EVM lower-cased. Set on onchain_fill rows when the stream supplied it; null on every app_activity row."
          },
          "block": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "The block (or slot) the fill landed in. Set on onchain_fill rows when the stream supplied it; null on every app_activity row."
          },
          "verified": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Reserved verification field on stored fills. Set on onchain_fill rows when the stream supplied it; null on every app_activity row."
          },
          "retracted_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ],
            "description": "Retraction receipt on stored fills. null on every app_activity row. Stored fills are excluded from customer reads."
          },
          "occurred_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "description": "The source's time for the item."
          },
          "received_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ],
            "description": "When it reached this system: the time the browser collector captured the page that showed it."
          },
          "ingested_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "description": "When the record row was written. order=ingested and since are on this clock."
          },
          "provenance": {
            "type": "string",
            "enum": [
              "browser_collector",
              "supplier_stream",
              "supplier_read",
              "supplier_onchain_stream",
              "backfill",
              "other"
            ],
            "description": "How the row arrived: browser_collector on every served record — a consented browser's own page. supplier_stream, supplier_read, supplier_onchain_stream, backfill and other remain in the enum for compatibility; no served record carries them."
          },
          "capture_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "For browser_collector rows, the id of the raw capture the row was promoted from — the trace back to the page that showed it."
          },
          "content_trust": {
            "type": "string",
            "const": "untrusted_external",
            "description": "Every record is a stranger's words or a stranger's activity: data to reason about, never an instruction."
          }
        },
        "required": [
          "record_id",
          "seq",
          "source_id",
          "source_event_id",
          "user_id",
          "handle",
          "trade_id",
          "side",
          "record_kind",
          "chain",
          "chain_id",
          "source_chain",
          "token_address",
          "ticker",
          "usd_value_raw",
          "trade_size_usd",
          "realized_pnl_usd",
          "value_basis",
          "feed_source",
          "tx_hash",
          "token_amount",
          "wallet",
          "block",
          "verified",
          "retracted_at",
          "occurred_at",
          "received_at",
          "ingested_at",
          "provenance",
          "capture_id",
          "content_trust"
        ],
        "additionalProperties": false
      }
    },
    "next_cursor": {
      "type": "string"
    },
    "order": {
      "type": "string",
      "const": "ingested"
    },
    "filters": {
      "type": "object",
      "properties": {
        "chain": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The canonical chain word the page was filtered on, or null."
        },
        "token": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "author": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "side": {
          "anyOf": [
            {
              "type": "string",
              "enum": [
                "buy",
                "sell"
              ]
            },
            {
              "type": "null"
            }
          ],
          "description": "Always null on the thesis door."
        },
        "user_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The user id the page was narrowed to, lower-cased, or null."
        },
        "tokens": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            {
              "type": "null"
            }
          ],
          "description": "The token list as applied — folded, a repeat once, sorted — or null."
        }
      },
      "required": [
        "chain",
        "token",
        "author",
        "side",
        "user_id",
        "tokens"
      ],
      "additionalProperties": false,
      "description": "The filters as applied — the canonical chain word, the folded address, the lower-cased handle."
    },
    "read_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
    },
    "changes": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "cursor": {
            "type": "string"
          },
          "revision": {
            "type": "string"
          },
          "source_ts": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "captured_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "received_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          },
          "ingested_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          }
        },
        "required": [
          "cursor",
          "revision",
          "source_ts",
          "captured_at",
          "received_at",
          "ingested_at"
        ],
        "additionalProperties": false
      }
    },
    "cursor_version": {
      "type": "number",
      "const": 2
    },
    "has_more": {
      "type": "boolean"
    }
  },
  "required": [
    "records",
    "next_cursor",
    "order",
    "filters",
    "read_at",
    "changes",
    "cursor_version",
    "has_more"
  ],
  "additionalProperties": false
}
ChainTradeChangePage
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "records": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "record_id": {
            "type": "string",
            "description": "Stable id of this trade, kept when the record is re-emitted (see signature)."
          },
          "seq": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991,
            "description": "Ingestion order. order=ingested walks it upward and its cursor names the last one seen. A re-emitted record takes a higher seq."
          },
          "chain": {
            "type": "string",
            "description": "The canonical chain word: solana on every record."
          },
          "signature": {
            "type": "string",
            "description": "The transaction's signature, the chain's own id for the swap: one trade per chain and signature. A record may be re-emitted with a higher seq when its decode is upgraded from logs to tx: the same signature and record_id, with corrected fields. Upsert by signature."
          },
          "slot": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "The slot the transaction landed in, when known."
          },
          "occurred_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "description": "When the chain recorded the swap: the block time — or, when the block time was not known on arrival, the time this system received the trade."
          },
          "ingested_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "description": "When the record row was written. order=ingested and since are on this clock."
          },
          "wallet": {
            "type": "string",
            "description": "The trader's wallet, as the chain records it: the transaction's second signer. Present on every record: a trade is served only once its wallet is known."
          },
          "token_address": {
            "type": "string",
            "description": "The token's mint address, exact case."
          },
          "side": {
            "type": "string",
            "enum": [
              "buy",
              "sell"
            ],
            "description": "buy or sell, from the trader's side."
          },
          "usd_amount": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "The swap's size in USD; null when it is not known — a logs decode may leave it null."
          },
          "token_amount": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "The amount of the token the swap moved; null when it is not known."
          },
          "venue": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "pumpswap",
                  "pumpfun",
                  "meteora",
                  "raydium",
                  "orca",
                  "other"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "The venue whose pool filled the swap: other for a venue not named here, null when it was not identified."
          },
          "route": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "dflow",
                  "jupiter",
                  "direct",
                  "other"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "How the swap reached the pool: through an aggregator (dflow, jupiter), direct, or other; null when it was not identified."
          },
          "fomo_signer_verified": {
            "type": "boolean",
            "description": "true when this system confirmed FOMO's app wallet as the transaction's fee payer; false when that was not confirmed — every record decoded from logs alone (decode_source logs) reads false until its full transaction is read. Filter on true when only confirmed FOMO trades will do."
          },
          "source": {
            "type": "string",
            "const": "chain",
            "description": "chain on every record: read from public chain data, never from the app."
          },
          "decode_source": {
            "type": "string",
            "enum": [
              "logs",
              "tx"
            ],
            "description": "How the trade was decoded. logs — from the transaction's logs: exact for a single-venue pump.fun, PumpSwap or CLMM swap; usd_amount may be null. tx — from the full transaction: exact amounts, on every venue. A logs record may be re-emitted as tx (see signature)."
          }
        },
        "required": [
          "record_id",
          "seq",
          "chain",
          "signature",
          "slot",
          "occurred_at",
          "ingested_at",
          "wallet",
          "token_address",
          "side",
          "usd_amount",
          "token_amount",
          "venue",
          "route",
          "fomo_signer_verified",
          "source",
          "decode_source"
        ],
        "additionalProperties": false
      }
    },
    "next_cursor": {
      "type": "string"
    },
    "order": {
      "type": "string",
      "const": "ingested"
    },
    "filters": {
      "type": "object",
      "properties": {
        "chain": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The canonical chain word the page was filtered on, or null."
        },
        "token": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "wallet": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "side": {
          "anyOf": [
            {
              "type": "string",
              "enum": [
                "buy",
                "sell"
              ]
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "chain",
        "token",
        "wallet",
        "side"
      ],
      "additionalProperties": false,
      "description": "The filters as applied."
    },
    "read_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
    },
    "changes": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "cursor": {
            "type": "string"
          },
          "revision": {
            "type": "string"
          },
          "source_ts": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "captured_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "received_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          },
          "ingested_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          }
        },
        "required": [
          "cursor",
          "revision",
          "source_ts",
          "captured_at",
          "received_at",
          "ingested_at"
        ],
        "additionalProperties": false
      }
    },
    "cursor_version": {
      "type": "number",
      "const": 2
    },
    "has_more": {
      "type": "boolean"
    }
  },
  "required": [
    "records",
    "next_cursor",
    "order",
    "filters",
    "read_at",
    "changes",
    "cursor_version",
    "has_more"
  ],
  "additionalProperties": false
}
ChainTradePage
{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "records",
    "next_cursor",
    "order",
    "filters",
    "read_at"
  ],
  "properties": {
    "records": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ChainTradeRecord"
      }
    },
    "next_cursor": {
      "type": [
        "string",
        "null"
      ],
      "description": "Send it back verbatim as ?cursor= with the same filters and order. order=occurred: null when the page was short. order=ingested: an empty poll returns the cursor it was given."
    },
    "order": {
      "type": "string",
      "enum": [
        "occurred",
        "ingested"
      ]
    },
    "filters": {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "type": "object",
      "properties": {
        "chain": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The canonical chain word the page was filtered on, or null."
        },
        "token": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "wallet": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "side": {
          "anyOf": [
            {
              "type": "string",
              "enum": [
                "buy",
                "sell"
              ]
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "chain",
        "token",
        "wallet",
        "side"
      ],
      "additionalProperties": false,
      "description": "The filters as applied."
    },
    "read_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
Error
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string"
        },
        "message": {
          "type": "string",
          "description": "Names the parameter that was refused, never its value."
        },
        "type": {
          "type": "string"
        },
        "request_id": {
          "description": "Quote it when you write to support.",
          "type": "string"
        }
      },
      "required": [
        "code",
        "message",
        "type"
      ],
      "additionalProperties": {}
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}
User
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "user_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The person's stable id at the source, when a stored record or identity carries it. Store this, not the handle."
    },
    "handle": {
      "type": "string",
      "description": "Lower-cased, without the @. People rename — do not key on it."
    },
    "name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The display name, when a record or the leaderboard carries one."
    },
    "avatar_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The picture the leaderboard published, https only, or null."
    },
    "x_handle": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Reserved for independently verified X identity; currently null. A source-declared link is carried separately in x_profile."
    },
    "x_profile": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "handle": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_]{1,15}$"
            },
            "source": {
              "type": "string",
              "const": "fomo"
            },
            "observed_at": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
            },
            "identity_verified": {
              "type": "boolean",
              "const": false
            }
          },
          "required": [
            "handle",
            "source",
            "observed_at",
            "identity_verified"
          ],
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "The X profile explicitly published by FOMO for this user id, with its observation time. Source-declared, not identity verification. Only explicitly public actors in the freshest trusted board snapshot qualify; older windows and directory socials are not fallbacks. Null after removal, absence, privacy restriction or expired evidence."
    },
    "profile_details": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "bio": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "banner_url": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "avatar_url": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "followers": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991
                },
                {
                  "type": "null"
                }
              ]
            },
            "following": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991
                },
                {
                  "type": "null"
                }
              ]
            },
            "source": {
              "type": "string",
              "const": "fomo"
            },
            "observed_at": {
              "type": "object",
              "properties": {
                "bio": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "banner_url": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "avatar_url": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "followers": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "following": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "bio",
                "banner_url",
                "avatar_url",
                "followers",
                "following"
              ],
              "additionalProperties": false
            }
          },
          "required": [
            "bio",
            "banner_url",
            "avatar_url",
            "followers",
            "following",
            "source",
            "observed_at"
          ],
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Public profile fields for an explicitly public native user in the one freshest trusted FOMO board snapshot. Supplemental snapshot coverage only: actors outside that snapshot are null and coverage can change as boards rotate. No older-window fallback. Each present field has its observation clock; absent fields are null without a clock, explicit source null retains its clock. Counts are source-reported, not a verified social graph. Evidence expires after 26 hours and may disappear under retention."
    },
    "solana_wallet": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Present only when FOMO's own trade page attested this wallet and its persisted capture proof remains trusted. The page names the person's user id beside the wallet that traded the position. Proof survives raw-capture expiry; revoked or unknown proof returns null. Never one resolved from a handle. This Solana address is FOMO's account address for the person, not an on-chain trading wallet: none of these addresses signs a FOMO swap on chain, and those checked hold no account and no token account. The Solana wallet that signs and holds is solana_signer."
    },
    "evm_wallet": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Present only when FOMO's own trade page attested this wallet and its persisted capture proof remains trusted. The page names the person's user id beside the wallet that traded the position. Proof survives raw-capture expiry; revoked or unknown proof returns null. Never one resolved from a handle."
    },
    "solana_signer": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "wallet": {
              "type": "string",
              "description": "The Solana wallet that signs this person's FOMO trades on chain — the trader's own signer beside FOMO's app wallet on each swap — and holds what they trade."
            },
            "method": {
              "type": "string",
              "enum": [
                "chain_cooccurrence",
                "cross_chain_deposit"
              ],
              "description": "chain_cooccurrence: a FOMO swap on chain matched exactly one trade the app showed for this person — the same token and side, within 5 seconds, the USD amount within 2 % or $0.25 (and cross-chain deposits may count beside them). cross_chain_deposit (1.7.0): every match is a deposit this wallet made to pay for a FOMO buy on another chain, matching exactly one EVM buy the app showed for this person within 10 seconds, the USD amount within 3 % or $0.50, and that buy exactly one deposit."
            },
            "matches": {
              "type": "integer",
              "minimum": 2,
              "maximum": 9007199254740991,
              "description": "Matches between this person and this wallet: swaps on chain and cross-chain deposits together. At least 2; the wallet holds at least 80 % of this person's matches, and this person at least 80 % of the wallet's."
            },
            "first_matched_at": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
              "description": "Block time of the first matched swap or deposit."
            },
            "last_matched_at": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
              "description": "Block time of the newest matched swap or deposit."
            },
            "sample_signature": {
              "type": "string",
              "description": "The newest matched swap's or deposit's transaction signature: look it up on chain to see this wallet sign it."
            }
          },
          "required": [
            "wallet",
            "method",
            "matches",
            "first_matched_at",
            "last_matched_at",
            "sample_signature"
          ],
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "INFERRED, NOT ATTESTED: the Solana wallet that signs this person's trades on chain, with the evidence behind the inference. FOMO publishes no map from a user to this wallet; it is read from FOMO's own app-signed swaps that coincide with the trades the app showed for this person, and from the deposits that pay for their buys on other chains, counted only from trusted collector captures after the provenance floor and only while the person is public. Null without at least 2 such matches holding 80 % both ways. A different kind of address from solana_wallet."
    },
    "linked_wallets": {
      "maxItems": 25,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "platform": {
            "type": "string",
            "enum": [
              "pump",
              "axiom",
              "terminal"
            ],
            "description": "Whose public words name this wallet beside the X account: pump — a pump.fun account, served only where pump.fun's own payout board also names the account's numeric X id (its profile handle alone is self-declared); axiom — the caller of an Axiom call; terminal — another trading terminal's wallet profile or call."
          },
          "wallet": {
            "type": "string",
            "description": "The wallet as the platform names it: Solana exact, EVM lower-cased."
          },
          "chain_family": {
            "type": "string",
            "enum": [
              "solana",
              "evm"
            ],
            "description": "The address's family."
          },
          "via": {
            "type": "string",
            "const": "x_handle",
            "description": "x_handle: joined through the X username the platform names beside the wallet."
          },
          "level": {
            "type": "string",
            "const": "x_name_match",
            "description": "x_name_match: the handle and the display name both agree. The only level served; a handle alone links nothing."
          },
          "x_handle": {
            "type": "string",
            "pattern": "^[a-z0-9_]{1,15}$",
            "description": "The X username the platform names, lower-cased without the @ — equal to the person's handle."
          },
          "observed_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
            "description": "The platform's newest observation of this claim."
          }
        },
        "required": [
          "platform",
          "wallet",
          "chain_family",
          "via",
          "level",
          "x_handle",
          "observed_at"
        ],
        "additionalProperties": false
      },
      "description": "Wallets other platforms publish for the X account this person logged in with, newest first, at most 25; empty when none qualifies. A platform's claim joined by X account, never a verification and never attested: the person's FOMO handle equals the X username the platform names beside the wallet, AND FOMO's display name for the person equals the X display name a platform shows for that username (compared case-folded, spaces collapsed; a display name equal to the handle never counts). Nothing for a handle two people show, nor for a wallet a platform also names for another X account, nor while the person is private. A different kind of address from solana_wallet, evm_wallet and solana_signer, and never merged into them."
    },
    "resolution": {
      "anyOf": [
        {
          "type": "string",
          "enum": [
            "verified",
            "probable",
            "partial"
          ]
        },
        {
          "type": "null"
        }
      ],
      "description": "How far the sources behind a resolved identity agreed; null when none was resolved."
    },
    "basis": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "theses",
          "trades",
          "identity",
          "leaderboard"
        ]
      },
      "description": "Which stored tables named the person."
    }
  },
  "required": [
    "user_id",
    "handle",
    "name",
    "avatar_url",
    "x_handle",
    "x_profile",
    "profile_details",
    "solana_wallet",
    "evm_wallet",
    "solana_signer",
    "linked_wallets",
    "resolution",
    "basis"
  ],
  "additionalProperties": false
}
UserAnswer
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "user": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "user_id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The person's stable id at the source, when a stored record or identity carries it. Store this, not the handle."
            },
            "handle": {
              "type": "string",
              "description": "Lower-cased, without the @. People rename — do not key on it."
            },
            "name": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The display name, when a record or the leaderboard carries one."
            },
            "avatar_url": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The picture the leaderboard published, https only, or null."
            },
            "x_handle": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Reserved for independently verified X identity; currently null. A source-declared link is carried separately in x_profile."
            },
            "x_profile": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "handle": {
                      "type": "string",
                      "pattern": "^[A-Za-z0-9_]{1,15}$"
                    },
                    "source": {
                      "type": "string",
                      "const": "fomo"
                    },
                    "observed_at": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                    },
                    "identity_verified": {
                      "type": "boolean",
                      "const": false
                    }
                  },
                  "required": [
                    "handle",
                    "source",
                    "observed_at",
                    "identity_verified"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "null"
                }
              ],
              "description": "The X profile explicitly published by FOMO for this user id, with its observation time. Source-declared, not identity verification. Only explicitly public actors in the freshest trusted board snapshot qualify; older windows and directory socials are not fallbacks. Null after removal, absence, privacy restriction or expired evidence."
            },
            "profile_details": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "bio": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "banner_url": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "avatar_url": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "followers": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "following": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "source": {
                      "type": "string",
                      "const": "fomo"
                    },
                    "observed_at": {
                      "type": "object",
                      "properties": {
                        "bio": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time",
                              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "banner_url": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time",
                              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "avatar_url": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time",
                              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "followers": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time",
                              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "following": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "date-time",
                              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "bio",
                        "banner_url",
                        "avatar_url",
                        "followers",
                        "following"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "bio",
                    "banner_url",
                    "avatar_url",
                    "followers",
                    "following",
                    "source",
                    "observed_at"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "null"
                }
              ],
              "description": "Public profile fields for an explicitly public native user in the one freshest trusted FOMO board snapshot. Supplemental snapshot coverage only: actors outside that snapshot are null and coverage can change as boards rotate. No older-window fallback. Each present field has its observation clock; absent fields are null without a clock, explicit source null retains its clock. Counts are source-reported, not a verified social graph. Evidence expires after 26 hours and may disappear under retention."
            },
            "solana_wallet": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Present only when FOMO's own trade page attested this wallet and its persisted capture proof remains trusted. The page names the person's user id beside the wallet that traded the position. Proof survives raw-capture expiry; revoked or unknown proof returns null. Never one resolved from a handle. This Solana address is FOMO's account address for the person, not an on-chain trading wallet: none of these addresses signs a FOMO swap on chain, and those checked hold no account and no token account. The Solana wallet that signs and holds is solana_signer."
            },
            "evm_wallet": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Present only when FOMO's own trade page attested this wallet and its persisted capture proof remains trusted. The page names the person's user id beside the wallet that traded the position. Proof survives raw-capture expiry; revoked or unknown proof returns null. Never one resolved from a handle."
            },
            "solana_signer": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "wallet": {
                      "type": "string",
                      "description": "The Solana wallet that signs this person's FOMO trades on chain — the trader's own signer beside FOMO's app wallet on each swap — and holds what they trade."
                    },
                    "method": {
                      "type": "string",
                      "enum": [
                        "chain_cooccurrence",
                        "cross_chain_deposit"
                      ],
                      "description": "chain_cooccurrence: a FOMO swap on chain matched exactly one trade the app showed for this person — the same token and side, within 5 seconds, the USD amount within 2 % or $0.25 (and cross-chain deposits may count beside them). cross_chain_deposit (1.7.0): every match is a deposit this wallet made to pay for a FOMO buy on another chain, matching exactly one EVM buy the app showed for this person within 10 seconds, the USD amount within 3 % or $0.50, and that buy exactly one deposit."
                    },
                    "matches": {
                      "type": "integer",
                      "minimum": 2,
                      "maximum": 9007199254740991,
                      "description": "Matches between this person and this wallet: swaps on chain and cross-chain deposits together. At least 2; the wallet holds at least 80 % of this person's matches, and this person at least 80 % of the wallet's."
                    },
                    "first_matched_at": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                      "description": "Block time of the first matched swap or deposit."
                    },
                    "last_matched_at": {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                      "description": "Block time of the newest matched swap or deposit."
                    },
                    "sample_signature": {
                      "type": "string",
                      "description": "The newest matched swap's or deposit's transaction signature: look it up on chain to see this wallet sign it."
                    }
                  },
                  "required": [
                    "wallet",
                    "method",
                    "matches",
                    "first_matched_at",
                    "last_matched_at",
                    "sample_signature"
                  ],
                  "additionalProperties": false
                },
                {
                  "type": "null"
                }
              ],
              "description": "INFERRED, NOT ATTESTED: the Solana wallet that signs this person's trades on chain, with the evidence behind the inference. FOMO publishes no map from a user to this wallet; it is read from FOMO's own app-signed swaps that coincide with the trades the app showed for this person, and from the deposits that pay for their buys on other chains, counted only from trusted collector captures after the provenance floor and only while the person is public. Null without at least 2 such matches holding 80 % both ways. A different kind of address from solana_wallet."
            },
            "linked_wallets": {
              "maxItems": 25,
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "platform": {
                    "type": "string",
                    "enum": [
                      "pump",
                      "axiom",
                      "terminal"
                    ],
                    "description": "Whose public words name this wallet beside the X account: pump — a pump.fun account, served only where pump.fun's own payout board also names the account's numeric X id (its profile handle alone is self-declared); axiom — the caller of an Axiom call; terminal — another trading terminal's wallet profile or call."
                  },
                  "wallet": {
                    "type": "string",
                    "description": "The wallet as the platform names it: Solana exact, EVM lower-cased."
                  },
                  "chain_family": {
                    "type": "string",
                    "enum": [
                      "solana",
                      "evm"
                    ],
                    "description": "The address's family."
                  },
                  "via": {
                    "type": "string",
                    "const": "x_handle",
                    "description": "x_handle: joined through the X username the platform names beside the wallet."
                  },
                  "level": {
                    "type": "string",
                    "const": "x_name_match",
                    "description": "x_name_match: the handle and the display name both agree. The only level served; a handle alone links nothing."
                  },
                  "x_handle": {
                    "type": "string",
                    "pattern": "^[a-z0-9_]{1,15}$",
                    "description": "The X username the platform names, lower-cased without the @ — equal to the person's handle."
                  },
                  "observed_at": {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                    "description": "The platform's newest observation of this claim."
                  }
                },
                "required": [
                  "platform",
                  "wallet",
                  "chain_family",
                  "via",
                  "level",
                  "x_handle",
                  "observed_at"
                ],
                "additionalProperties": false
              },
              "description": "Wallets other platforms publish for the X account this person logged in with, newest first, at most 25; empty when none qualifies. A platform's claim joined by X account, never a verification and never attested: the person's FOMO handle equals the X username the platform names beside the wallet, AND FOMO's display name for the person equals the X display name a platform shows for that username (compared case-folded, spaces collapsed; a display name equal to the handle never counts). Nothing for a handle two people show, nor for a wallet a platform also names for another X account, nor while the person is private. A different kind of address from solana_wallet, evm_wallet and solana_signer, and never merged into them."
            },
            "resolution": {
              "anyOf": [
                {
                  "type": "string",
                  "enum": [
                    "verified",
                    "probable",
                    "partial"
                  ]
                },
                {
                  "type": "null"
                }
              ],
              "description": "How far the sources behind a resolved identity agreed; null when none was resolved."
            },
            "basis": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "theses",
                  "trades",
                  "identity",
                  "leaderboard"
                ]
              },
              "description": "Which stored tables named the person."
            }
          },
          "required": [
            "user_id",
            "handle",
            "name",
            "avatar_url",
            "x_handle",
            "x_profile",
            "profile_details",
            "solana_wallet",
            "evm_wallet",
            "solana_signer",
            "linked_wallets",
            "resolution",
            "basis"
          ],
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Null when no stored table names the person — a 200, never a 404."
    },
    "read_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
    }
  },
  "required": [
    "user",
    "read_at"
  ],
  "additionalProperties": false
}
ResolveFound
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "user": {
      "type": "object",
      "properties": {
        "user_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The person's stable id at the source, when a stored record or identity carries it. Store this, not the handle."
        },
        "handle": {
          "type": "string",
          "description": "Lower-cased, without the @. People rename — do not key on it."
        },
        "name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The display name, when a record or the leaderboard carries one."
        },
        "avatar_url": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The picture the leaderboard published, https only, or null."
        },
        "x_handle": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Reserved for independently verified X identity; currently null. A source-declared link is carried separately in x_profile."
        },
        "x_profile": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "handle": {
                  "type": "string",
                  "pattern": "^[A-Za-z0-9_]{1,15}$"
                },
                "source": {
                  "type": "string",
                  "const": "fomo"
                },
                "observed_at": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                },
                "identity_verified": {
                  "type": "boolean",
                  "const": false
                }
              },
              "required": [
                "handle",
                "source",
                "observed_at",
                "identity_verified"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ],
          "description": "The X profile explicitly published by FOMO for this user id, with its observation time. Source-declared, not identity verification. Only explicitly public actors in the freshest trusted board snapshot qualify; older windows and directory socials are not fallbacks. Null after removal, absence, privacy restriction or expired evidence."
        },
        "profile_details": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "bio": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "banner_url": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "avatar_url": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "followers": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "following": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "source": {
                  "type": "string",
                  "const": "fomo"
                },
                "observed_at": {
                  "type": "object",
                  "properties": {
                    "bio": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "banner_url": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "avatar_url": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "followers": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "following": {
                      "anyOf": [
                        {
                          "type": "string",
                          "format": "date-time",
                          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "bio",
                    "banner_url",
                    "avatar_url",
                    "followers",
                    "following"
                  ],
                  "additionalProperties": false
                }
              },
              "required": [
                "bio",
                "banner_url",
                "avatar_url",
                "followers",
                "following",
                "source",
                "observed_at"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ],
          "description": "Public profile fields for an explicitly public native user in the one freshest trusted FOMO board snapshot. Supplemental snapshot coverage only: actors outside that snapshot are null and coverage can change as boards rotate. No older-window fallback. Each present field has its observation clock; absent fields are null without a clock, explicit source null retains its clock. Counts are source-reported, not a verified social graph. Evidence expires after 26 hours and may disappear under retention."
        },
        "solana_wallet": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Present only when FOMO's own trade page attested this wallet and its persisted capture proof remains trusted. The page names the person's user id beside the wallet that traded the position. Proof survives raw-capture expiry; revoked or unknown proof returns null. Never one resolved from a handle. This Solana address is FOMO's account address for the person, not an on-chain trading wallet: none of these addresses signs a FOMO swap on chain, and those checked hold no account and no token account. The Solana wallet that signs and holds is solana_signer."
        },
        "evm_wallet": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Present only when FOMO's own trade page attested this wallet and its persisted capture proof remains trusted. The page names the person's user id beside the wallet that traded the position. Proof survives raw-capture expiry; revoked or unknown proof returns null. Never one resolved from a handle."
        },
        "solana_signer": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "wallet": {
                  "type": "string",
                  "description": "The Solana wallet that signs this person's FOMO trades on chain — the trader's own signer beside FOMO's app wallet on each swap — and holds what they trade."
                },
                "method": {
                  "type": "string",
                  "enum": [
                    "chain_cooccurrence",
                    "cross_chain_deposit"
                  ],
                  "description": "chain_cooccurrence: a FOMO swap on chain matched exactly one trade the app showed for this person — the same token and side, within 5 seconds, the USD amount within 2 % or $0.25 (and cross-chain deposits may count beside them). cross_chain_deposit (1.7.0): every match is a deposit this wallet made to pay for a FOMO buy on another chain, matching exactly one EVM buy the app showed for this person within 10 seconds, the USD amount within 3 % or $0.50, and that buy exactly one deposit."
                },
                "matches": {
                  "type": "integer",
                  "minimum": 2,
                  "maximum": 9007199254740991,
                  "description": "Matches between this person and this wallet: swaps on chain and cross-chain deposits together. At least 2; the wallet holds at least 80 % of this person's matches, and this person at least 80 % of the wallet's."
                },
                "first_matched_at": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                  "description": "Block time of the first matched swap or deposit."
                },
                "last_matched_at": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                  "description": "Block time of the newest matched swap or deposit."
                },
                "sample_signature": {
                  "type": "string",
                  "description": "The newest matched swap's or deposit's transaction signature: look it up on chain to see this wallet sign it."
                }
              },
              "required": [
                "wallet",
                "method",
                "matches",
                "first_matched_at",
                "last_matched_at",
                "sample_signature"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ],
          "description": "INFERRED, NOT ATTESTED: the Solana wallet that signs this person's trades on chain, with the evidence behind the inference. FOMO publishes no map from a user to this wallet; it is read from FOMO's own app-signed swaps that coincide with the trades the app showed for this person, and from the deposits that pay for their buys on other chains, counted only from trusted collector captures after the provenance floor and only while the person is public. Null without at least 2 such matches holding 80 % both ways. A different kind of address from solana_wallet."
        },
        "linked_wallets": {
          "maxItems": 25,
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "platform": {
                "type": "string",
                "enum": [
                  "pump",
                  "axiom",
                  "terminal"
                ],
                "description": "Whose public words name this wallet beside the X account: pump — a pump.fun account, served only where pump.fun's own payout board also names the account's numeric X id (its profile handle alone is self-declared); axiom — the caller of an Axiom call; terminal — another trading terminal's wallet profile or call."
              },
              "wallet": {
                "type": "string",
                "description": "The wallet as the platform names it: Solana exact, EVM lower-cased."
              },
              "chain_family": {
                "type": "string",
                "enum": [
                  "solana",
                  "evm"
                ],
                "description": "The address's family."
              },
              "via": {
                "type": "string",
                "const": "x_handle",
                "description": "x_handle: joined through the X username the platform names beside the wallet."
              },
              "level": {
                "type": "string",
                "const": "x_name_match",
                "description": "x_name_match: the handle and the display name both agree. The only level served; a handle alone links nothing."
              },
              "x_handle": {
                "type": "string",
                "pattern": "^[a-z0-9_]{1,15}$",
                "description": "The X username the platform names, lower-cased without the @ — equal to the person's handle."
              },
              "observed_at": {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                "description": "The platform's newest observation of this claim."
              }
            },
            "required": [
              "platform",
              "wallet",
              "chain_family",
              "via",
              "level",
              "x_handle",
              "observed_at"
            ],
            "additionalProperties": false
          },
          "description": "Wallets other platforms publish for the X account this person logged in with, newest first, at most 25; empty when none qualifies. A platform's claim joined by X account, never a verification and never attested: the person's FOMO handle equals the X username the platform names beside the wallet, AND FOMO's display name for the person equals the X display name a platform shows for that username (compared case-folded, spaces collapsed; a display name equal to the handle never counts). Nothing for a handle two people show, nor for a wallet a platform also names for another X account, nor while the person is private. A different kind of address from solana_wallet, evm_wallet and solana_signer, and never merged into them."
        },
        "resolution": {
          "anyOf": [
            {
              "type": "string",
              "enum": [
                "verified",
                "probable",
                "partial"
              ]
            },
            {
              "type": "null"
            }
          ],
          "description": "How far the sources behind a resolved identity agreed; null when none was resolved."
        },
        "basis": {
          "type": "array",
          "items": {
            "type": "string",
            "enum": [
              "theses",
              "trades",
              "identity",
              "leaderboard"
            ]
          },
          "description": "Which stored tables named the person."
        }
      },
      "required": [
        "user_id",
        "handle",
        "name",
        "avatar_url",
        "x_handle",
        "x_profile",
        "profile_details",
        "solana_wallet",
        "evm_wallet",
        "solana_signer",
        "linked_wallets",
        "resolution",
        "basis"
      ],
      "additionalProperties": false
    },
    "resolved": {
      "type": "string",
      "enum": [
        "cached",
        "live"
      ],
      "description": "cached — a handle already resolved answered at once; live — this call's lookup resolved it."
    },
    "read_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
    }
  },
  "required": [
    "user",
    "resolved",
    "read_at"
  ],
  "additionalProperties": false
}
ResolvePending
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "pending": {
      "type": "boolean",
      "const": true
    },
    "reason": {
      "type": "string",
      "enum": [
        "queued",
        "rate_limited",
        "unavailable",
        "no_preview"
      ],
      "description": "queued — the lookup is still running: ask again after retry_after_s and the running lookup answers. rate_limited — the key's resolve window is spent. unavailable — the lookup could not be made right now. no_preview — the lookup answered and could not resolve the handle; a prompt retry rarely helps."
    },
    "retryable": {
      "type": "boolean"
    },
    "retry_after_s": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "Seconds to wait before asking again; null on no_preview."
    }
  },
  "required": [
    "pending",
    "reason",
    "retryable",
    "retry_after_s"
  ],
  "additionalProperties": false
}
PnlEntry
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "handle": {
      "type": "string"
    },
    "name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "avatar_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "x_handle": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Reserved for independently verified X identity; currently null. A source-declared profile link does not establish identity or wallet ownership."
    },
    "x_profile": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "handle": {
              "type": "string",
              "pattern": "^[A-Za-z0-9_]{1,15}$"
            },
            "source": {
              "type": "string",
              "const": "fomo"
            },
            "observed_at": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
            },
            "identity_verified": {
              "type": "boolean",
              "const": false
            }
          },
          "required": [
            "handle",
            "source",
            "observed_at",
            "identity_verified"
          ],
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "The X profile explicitly published by FOMO for this user id, with its observation time. Source-declared, not identity verification. Only explicitly public actors in the freshest trusted board snapshot qualify; older windows and directory socials are not fallbacks. Null after removal, absence, privacy restriction or expired evidence."
    },
    "followers": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "Source-reported follower count from an eligible retained FOMO board; null without evidence. Its profile clock is separate from the PnL window clock."
    },
    "solana_wallet": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Present only when FOMO's own trade page attested this wallet and its persisted capture proof remains trusted. The page names the person's user id beside the wallet that traded the position. Proof survives raw-capture expiry; revoked or unknown proof returns null. Never one resolved from a handle. This Solana address is FOMO's account address for the person, not an on-chain trading wallet: none of these addresses signs a FOMO swap on chain, and those checked hold no account and no token account. The Solana wallet that signs and holds is solana_signer."
    },
    "evm_wallet": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Present only when FOMO's own trade page attested this wallet and its persisted capture proof remains trusted. The page names the person's user id beside the wallet that traded the position. Proof survives raw-capture expiry; revoked or unknown proof returns null. Never one resolved from a handle."
    },
    "solana_signer": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "wallet": {
              "type": "string",
              "description": "The Solana wallet that signs this person's FOMO trades on chain — the trader's own signer beside FOMO's app wallet on each swap — and holds what they trade."
            },
            "method": {
              "type": "string",
              "enum": [
                "chain_cooccurrence",
                "cross_chain_deposit"
              ],
              "description": "chain_cooccurrence: a FOMO swap on chain matched exactly one trade the app showed for this person — the same token and side, within 5 seconds, the USD amount within 2 % or $0.25 (and cross-chain deposits may count beside them). cross_chain_deposit (1.7.0): every match is a deposit this wallet made to pay for a FOMO buy on another chain, matching exactly one EVM buy the app showed for this person within 10 seconds, the USD amount within 3 % or $0.50, and that buy exactly one deposit."
            },
            "matches": {
              "type": "integer",
              "minimum": 2,
              "maximum": 9007199254740991,
              "description": "Matches between this person and this wallet: swaps on chain and cross-chain deposits together. At least 2; the wallet holds at least 80 % of this person's matches, and this person at least 80 % of the wallet's."
            },
            "first_matched_at": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
              "description": "Block time of the first matched swap or deposit."
            },
            "last_matched_at": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
              "description": "Block time of the newest matched swap or deposit."
            },
            "sample_signature": {
              "type": "string",
              "description": "The newest matched swap's or deposit's transaction signature: look it up on chain to see this wallet sign it."
            }
          },
          "required": [
            "wallet",
            "method",
            "matches",
            "first_matched_at",
            "last_matched_at",
            "sample_signature"
          ],
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "INFERRED, NOT ATTESTED: the Solana wallet that signs this person's trades on chain, with the evidence behind the inference. FOMO publishes no map from a user to this wallet; it is read from FOMO's own app-signed swaps that coincide with the trades the app showed for this person, and from the deposits that pay for their buys on other chains, counted only from trusted collector captures after the provenance floor and only while the person is public. Null without at least 2 such matches holding 80 % both ways. A different kind of address from solana_wallet."
    },
    "updated_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
        },
        {
          "type": "null"
        }
      ],
      "description": "When the leaderboard figures were stored; null when no window carries one."
    },
    "windows": {
      "type": "object",
      "properties": {
        "24h": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "net_usd": {
                  "type": "number",
                  "description": "The leaderboard's PnL for the window, USD."
                },
                "return_pct": {
                  "type": "null",
                  "description": "Always null: the leaderboard publishes no percentage."
                },
                "volume_usd": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Currently null in every window: the captured volume total has no proven window-specific period."
                },
                "trades": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Currently null in every window: the captured trade total has no proven window-specific period."
                },
                "rank": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "The rank on the 7-day board; null on the other windows."
                }
              },
              "required": [
                "net_usd",
                "return_pct",
                "volume_usd",
                "trades",
                "rank"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        },
        "7d": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "net_usd": {
                  "type": "number",
                  "description": "The leaderboard's PnL for the window, USD."
                },
                "return_pct": {
                  "type": "null",
                  "description": "Always null: the leaderboard publishes no percentage."
                },
                "volume_usd": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Currently null in every window: the captured volume total has no proven window-specific period."
                },
                "trades": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Currently null in every window: the captured trade total has no proven window-specific period."
                },
                "rank": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "The rank on the 7-day board; null on the other windows."
                }
              },
              "required": [
                "net_usd",
                "return_pct",
                "volume_usd",
                "trades",
                "rank"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        },
        "30d": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "net_usd": {
                  "type": "number",
                  "description": "The leaderboard's PnL for the window, USD."
                },
                "return_pct": {
                  "type": "null",
                  "description": "Always null: the leaderboard publishes no percentage."
                },
                "volume_usd": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Currently null in every window: the captured volume total has no proven window-specific period."
                },
                "trades": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Currently null in every window: the captured trade total has no proven window-specific period."
                },
                "rank": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "The rank on the 7-day board; null on the other windows."
                }
              },
              "required": [
                "net_usd",
                "return_pct",
                "volume_usd",
                "trades",
                "rank"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        },
        "all": {
          "type": "null",
          "description": "Currently null: this reader does not project a qualified all-time window."
        }
      },
      "required": [
        "24h",
        "7d",
        "30d",
        "all"
      ],
      "additionalProperties": false,
      "description": "One entry per window, all four keys present. A window is null when the board does not carry it, or the trader is off today's board."
    }
  },
  "required": [
    "handle",
    "name",
    "avatar_url",
    "x_handle",
    "x_profile",
    "followers",
    "solana_wallet",
    "evm_wallet",
    "solana_signer",
    "updated_at",
    "windows"
  ],
  "additionalProperties": false
}
PnlPage
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "count": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "Entries returned: the handles a stored table holds."
    },
    "missing": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Requested handles no stored table holds, lower-cased, without the @."
    },
    "entries": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "handle": {
            "type": "string"
          },
          "name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "avatar_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "x_handle": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Reserved for independently verified X identity; currently null. A source-declared profile link does not establish identity or wallet ownership."
          },
          "x_profile": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "handle": {
                    "type": "string",
                    "pattern": "^[A-Za-z0-9_]{1,15}$"
                  },
                  "source": {
                    "type": "string",
                    "const": "fomo"
                  },
                  "observed_at": {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
                  },
                  "identity_verified": {
                    "type": "boolean",
                    "const": false
                  }
                },
                "required": [
                  "handle",
                  "source",
                  "observed_at",
                  "identity_verified"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ],
            "description": "The X profile explicitly published by FOMO for this user id, with its observation time. Source-declared, not identity verification. Only explicitly public actors in the freshest trusted board snapshot qualify; older windows and directory socials are not fallbacks. Null after removal, absence, privacy restriction or expired evidence."
          },
          "followers": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "Source-reported follower count from an eligible retained FOMO board; null without evidence. Its profile clock is separate from the PnL window clock."
          },
          "solana_wallet": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Present only when FOMO's own trade page attested this wallet and its persisted capture proof remains trusted. The page names the person's user id beside the wallet that traded the position. Proof survives raw-capture expiry; revoked or unknown proof returns null. Never one resolved from a handle. This Solana address is FOMO's account address for the person, not an on-chain trading wallet: none of these addresses signs a FOMO swap on chain, and those checked hold no account and no token account. The Solana wallet that signs and holds is solana_signer."
          },
          "evm_wallet": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Present only when FOMO's own trade page attested this wallet and its persisted capture proof remains trusted. The page names the person's user id beside the wallet that traded the position. Proof survives raw-capture expiry; revoked or unknown proof returns null. Never one resolved from a handle."
          },
          "solana_signer": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "wallet": {
                    "type": "string",
                    "description": "The Solana wallet that signs this person's FOMO trades on chain — the trader's own signer beside FOMO's app wallet on each swap — and holds what they trade."
                  },
                  "method": {
                    "type": "string",
                    "enum": [
                      "chain_cooccurrence",
                      "cross_chain_deposit"
                    ],
                    "description": "chain_cooccurrence: a FOMO swap on chain matched exactly one trade the app showed for this person — the same token and side, within 5 seconds, the USD amount within 2 % or $0.25 (and cross-chain deposits may count beside them). cross_chain_deposit (1.7.0): every match is a deposit this wallet made to pay for a FOMO buy on another chain, matching exactly one EVM buy the app showed for this person within 10 seconds, the USD amount within 3 % or $0.50, and that buy exactly one deposit."
                  },
                  "matches": {
                    "type": "integer",
                    "minimum": 2,
                    "maximum": 9007199254740991,
                    "description": "Matches between this person and this wallet: swaps on chain and cross-chain deposits together. At least 2; the wallet holds at least 80 % of this person's matches, and this person at least 80 % of the wallet's."
                  },
                  "first_matched_at": {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                    "description": "Block time of the first matched swap or deposit."
                  },
                  "last_matched_at": {
                    "type": "string",
                    "format": "date-time",
                    "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
                    "description": "Block time of the newest matched swap or deposit."
                  },
                  "sample_signature": {
                    "type": "string",
                    "description": "The newest matched swap's or deposit's transaction signature: look it up on chain to see this wallet sign it."
                  }
                },
                "required": [
                  "wallet",
                  "method",
                  "matches",
                  "first_matched_at",
                  "last_matched_at",
                  "sample_signature"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ],
            "description": "INFERRED, NOT ATTESTED: the Solana wallet that signs this person's trades on chain, with the evidence behind the inference. FOMO publishes no map from a user to this wallet; it is read from FOMO's own app-signed swaps that coincide with the trades the app showed for this person, and from the deposits that pay for their buys on other chains, counted only from trusted collector captures after the provenance floor and only while the person is public. Null without at least 2 such matches holding 80 % both ways. A different kind of address from solana_wallet."
          },
          "updated_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ],
            "description": "When the leaderboard figures were stored; null when no window carries one."
          },
          "windows": {
            "type": "object",
            "properties": {
              "24h": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "net_usd": {
                        "type": "number",
                        "description": "The leaderboard's PnL for the window, USD."
                      },
                      "return_pct": {
                        "type": "null",
                        "description": "Always null: the leaderboard publishes no percentage."
                      },
                      "volume_usd": {
                        "anyOf": [
                          {
                            "type": "number"
                          },
                          {
                            "type": "null"
                          }
                        ],
                        "description": "Currently null in every window: the captured volume total has no proven window-specific period."
                      },
                      "trades": {
                        "anyOf": [
                          {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991
                          },
                          {
                            "type": "null"
                          }
                        ],
                        "description": "Currently null in every window: the captured trade total has no proven window-specific period."
                      },
                      "rank": {
                        "anyOf": [
                          {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991
                          },
                          {
                            "type": "null"
                          }
                        ],
                        "description": "The rank on the 7-day board; null on the other windows."
                      }
                    },
                    "required": [
                      "net_usd",
                      "return_pct",
                      "volume_usd",
                      "trades",
                      "rank"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "7d": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "net_usd": {
                        "type": "number",
                        "description": "The leaderboard's PnL for the window, USD."
                      },
                      "return_pct": {
                        "type": "null",
                        "description": "Always null: the leaderboard publishes no percentage."
                      },
                      "volume_usd": {
                        "anyOf": [
                          {
                            "type": "number"
                          },
                          {
                            "type": "null"
                          }
                        ],
                        "description": "Currently null in every window: the captured volume total has no proven window-specific period."
                      },
                      "trades": {
                        "anyOf": [
                          {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991
                          },
                          {
                            "type": "null"
                          }
                        ],
                        "description": "Currently null in every window: the captured trade total has no proven window-specific period."
                      },
                      "rank": {
                        "anyOf": [
                          {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991
                          },
                          {
                            "type": "null"
                          }
                        ],
                        "description": "The rank on the 7-day board; null on the other windows."
                      }
                    },
                    "required": [
                      "net_usd",
                      "return_pct",
                      "volume_usd",
                      "trades",
                      "rank"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "30d": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "net_usd": {
                        "type": "number",
                        "description": "The leaderboard's PnL for the window, USD."
                      },
                      "return_pct": {
                        "type": "null",
                        "description": "Always null: the leaderboard publishes no percentage."
                      },
                      "volume_usd": {
                        "anyOf": [
                          {
                            "type": "number"
                          },
                          {
                            "type": "null"
                          }
                        ],
                        "description": "Currently null in every window: the captured volume total has no proven window-specific period."
                      },
                      "trades": {
                        "anyOf": [
                          {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991
                          },
                          {
                            "type": "null"
                          }
                        ],
                        "description": "Currently null in every window: the captured trade total has no proven window-specific period."
                      },
                      "rank": {
                        "anyOf": [
                          {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991
                          },
                          {
                            "type": "null"
                          }
                        ],
                        "description": "The rank on the 7-day board; null on the other windows."
                      }
                    },
                    "required": [
                      "net_usd",
                      "return_pct",
                      "volume_usd",
                      "trades",
                      "rank"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "all": {
                "type": "null",
                "description": "Currently null: this reader does not project a qualified all-time window."
              }
            },
            "required": [
              "24h",
              "7d",
              "30d",
              "all"
            ],
            "additionalProperties": false,
            "description": "One entry per window, all four keys present. A window is null when the board does not carry it, or the trader is off today's board."
          }
        },
        "required": [
          "handle",
          "name",
          "avatar_url",
          "x_handle",
          "x_profile",
          "followers",
          "solana_wallet",
          "evm_wallet",
          "solana_signer",
          "updated_at",
          "windows"
        ],
        "additionalProperties": false
      },
      "description": "In the order requested."
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "How these figures differ from a cash-flow ledger."
    },
    "read_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
    }
  },
  "required": [
    "count",
    "missing",
    "entries",
    "notes",
    "read_at"
  ],
  "additionalProperties": false
}
Me
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "key": {
      "type": "object",
      "properties": {
        "prefix": {
          "type": "string",
          "description": "The key's display prefix — never the key."
        },
        "plan": {
          "type": "string",
          "description": "The data plan the key is sold on."
        }
      },
      "required": [
        "prefix",
        "plan"
      ],
      "additionalProperties": false
    },
    "allowance": {
      "type": "object",
      "properties": {
        "requests_per_minute": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "requests_per_day": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "used_today": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991,
          "description": "Requests counted today, this one included."
        },
        "remaining_today": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "resets_at": {
          "type": "string",
          "format": "date-time",
          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$",
          "description": "The next UTC midnight."
        },
        "streams": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991,
          "description": "Push sockets the key may hold open at once, across every push door."
        }
      },
      "required": [
        "requests_per_minute",
        "requests_per_day",
        "used_today",
        "remaining_today",
        "resets_at",
        "streams"
      ],
      "additionalProperties": false
    },
    "read_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
    }
  },
  "required": [
    "key",
    "allowance",
    "read_at"
  ],
  "additionalProperties": false
}
PumpUser
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "wallet": {
      "type": "string"
    },
    "username": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "profile_image": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "x_username": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The X handle pump.fun shows for the account — the platform's word, not a verification."
    },
    "followers": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ]
    },
    "following": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "Accounts this one follows on pump.fun, from the account's last stored profile read."
    },
    "bio": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The profile's own bio, verbatim, from the last stored profile read."
    },
    "is_pump_user": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "description": "False is pump.fun's answer for a wallet that traded without creating an account."
    },
    "is_verified": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "description": "pump.fun's own verified badge on the account, as pump.fun showed it; null when no stored observation carries one. The platform's word, not a verification of the X account or of wallet ownership."
    },
    "group_badges": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "role": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "name",
          "role"
        ],
        "additionalProperties": false
      },
      "description": "The squads pump.fun names on the profile: the squad's id, its name and the account's role in it. Empty when it names none or no profile was read."
    },
    "canonical_svm_wallet": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The account's Solana wallet as pump.fun links it."
    },
    "canonical_evm_wallet": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The account's EVM wallet as pump.fun links it to the same account."
    },
    "x_user_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "X's numeric user id, as pump.fun's public payout board publishes it for the account — rename-stable, and the platform's word, not a verification."
    }
  },
  "required": [
    "wallet",
    "username",
    "profile_image",
    "x_username",
    "followers",
    "following",
    "bio",
    "is_pump_user",
    "is_verified",
    "group_badges",
    "canonical_svm_wallet",
    "canonical_evm_wallet",
    "x_user_id"
  ],
  "additionalProperties": false
}
PumpUserAnswer
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "user": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "wallet": {
              "type": "string"
            },
            "username": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "profile_image": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "x_username": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The X handle pump.fun shows for the account — the platform's word, not a verification."
            },
            "followers": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991
                },
                {
                  "type": "null"
                }
              ]
            },
            "following": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991
                },
                {
                  "type": "null"
                }
              ],
              "description": "Accounts this one follows on pump.fun, from the account's last stored profile read."
            },
            "bio": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The profile's own bio, verbatim, from the last stored profile read."
            },
            "is_pump_user": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "description": "False is pump.fun's answer for a wallet that traded without creating an account."
            },
            "is_verified": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "description": "pump.fun's own verified badge on the account, as pump.fun showed it; null when no stored observation carries one. The platform's word, not a verification of the X account or of wallet ownership."
            },
            "group_badges": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string"
                  },
                  "name": {
                    "type": "string"
                  },
                  "role": {
                    "anyOf": [
                      {
                        "type": "string"
                      },
                      {
                        "type": "null"
                      }
                    ]
                  }
                },
                "required": [
                  "id",
                  "name",
                  "role"
                ],
                "additionalProperties": false
              },
              "description": "The squads pump.fun names on the profile: the squad's id, its name and the account's role in it. Empty when it names none or no profile was read."
            },
            "canonical_svm_wallet": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The account's Solana wallet as pump.fun links it."
            },
            "canonical_evm_wallet": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "The account's EVM wallet as pump.fun links it to the same account."
            },
            "x_user_id": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "X's numeric user id, as pump.fun's public payout board publishes it for the account — rename-stable, and the platform's word, not a verification."
            }
          },
          "required": [
            "wallet",
            "username",
            "profile_image",
            "x_username",
            "followers",
            "following",
            "bio",
            "is_pump_user",
            "is_verified",
            "group_badges",
            "canonical_svm_wallet",
            "canonical_evm_wallet",
            "x_user_id"
          ],
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "Null when no stored record holds the wallet."
    },
    "read_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
    }
  },
  "required": [
    "user",
    "read_at"
  ],
  "additionalProperties": false
}
PumpCallout
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "callout_id": {
      "type": "string",
      "description": "Dedupe on it; send the page's last as ?before= to continue."
    },
    "wallet": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The caller — on pump.fun the wallet is the identity."
    },
    "user_name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The caller's pump.fun username when they published one."
    },
    "x_username": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The X handle pump.fun showed with the callout, else the caller's stored profile's; the platform's word, not a verification."
    },
    "profile_image": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Stored caller image joined by the exact source wallet, else the image pump.fun showed with the callout; HTTPS only, null without one. Names and X handles are never join keys."
    },
    "is_verified": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "description": "pump.fun's own verified badge on the account, as pump.fun showed it; null when no stored observation carries one. The platform's word, not a verification of the X account or of wallet ownership."
    },
    "coin_mint": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The coin's address: a Solana mint exact, an EVM address lower-cased."
    },
    "chain": {
      "type": "string",
      "description": "The coin's chain, in this API's chain words (solana, ethereum, base, bsc, robinhood, …)."
    },
    "coin_symbol": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "coin_name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "text": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The caller's own words; null when they wrote none."
    },
    "media_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The media the caller attached to the callout, HTTPS only; null without one."
    },
    "called_out_at_mcap": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "Market cap (USD) when the callout was posted, as pump.fun read it."
    },
    "multiple": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "Price move since the callout, ×, when stored."
    },
    "max_multiplier": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "The peak move since the callout, ×, when stored."
    },
    "occurred_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
    }
  },
  "required": [
    "callout_id",
    "wallet",
    "user_name",
    "x_username",
    "profile_image",
    "is_verified",
    "coin_mint",
    "chain",
    "coin_symbol",
    "coin_name",
    "text",
    "media_url",
    "called_out_at_mcap",
    "multiple",
    "max_multiplier",
    "occurred_at"
  ],
  "additionalProperties": false
}
PumpCalloutPage
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "count": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "has_more": {
      "type": "boolean"
    },
    "next_before": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The page's oldest callout_id while has_more; null on the last page. 25 to a page."
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "callout_id": {
            "type": "string",
            "description": "Dedupe on it; send the page's last as ?before= to continue."
          },
          "wallet": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The caller — on pump.fun the wallet is the identity."
          },
          "user_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The caller's pump.fun username when they published one."
          },
          "x_username": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The X handle pump.fun showed with the callout, else the caller's stored profile's; the platform's word, not a verification."
          },
          "profile_image": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Stored caller image joined by the exact source wallet, else the image pump.fun showed with the callout; HTTPS only, null without one. Names and X handles are never join keys."
          },
          "is_verified": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "pump.fun's own verified badge on the account, as pump.fun showed it; null when no stored observation carries one. The platform's word, not a verification of the X account or of wallet ownership."
          },
          "coin_mint": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The coin's address: a Solana mint exact, an EVM address lower-cased."
          },
          "chain": {
            "type": "string",
            "description": "The coin's chain, in this API's chain words (solana, ethereum, base, bsc, robinhood, …)."
          },
          "coin_symbol": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "coin_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The caller's own words; null when they wrote none."
          },
          "media_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The media the caller attached to the callout, HTTPS only; null without one."
          },
          "called_out_at_mcap": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Market cap (USD) when the callout was posted, as pump.fun read it."
          },
          "multiple": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Price move since the callout, ×, when stored."
          },
          "max_multiplier": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "The peak move since the callout, ×, when stored."
          },
          "occurred_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          }
        },
        "required": [
          "callout_id",
          "wallet",
          "user_name",
          "x_username",
          "profile_image",
          "is_verified",
          "coin_mint",
          "chain",
          "coin_symbol",
          "coin_name",
          "text",
          "media_url",
          "called_out_at_mcap",
          "multiple",
          "max_multiplier",
          "occurred_at"
        ],
        "additionalProperties": false
      }
    },
    "read_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
    }
  },
  "required": [
    "count",
    "has_more",
    "next_before",
    "items",
    "read_at"
  ],
  "additionalProperties": false
}
PumpCalloutChangePage
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "count": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "has_more": {
      "type": "boolean"
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "callout_id": {
            "type": "string",
            "description": "Dedupe on it; send the page's last as ?before= to continue."
          },
          "wallet": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The caller — on pump.fun the wallet is the identity."
          },
          "user_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The caller's pump.fun username when they published one."
          },
          "x_username": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The X handle pump.fun showed with the callout, else the caller's stored profile's; the platform's word, not a verification."
          },
          "profile_image": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Stored caller image joined by the exact source wallet, else the image pump.fun showed with the callout; HTTPS only, null without one. Names and X handles are never join keys."
          },
          "is_verified": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "pump.fun's own verified badge on the account, as pump.fun showed it; null when no stored observation carries one. The platform's word, not a verification of the X account or of wallet ownership."
          },
          "coin_mint": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The coin's address: a Solana mint exact, an EVM address lower-cased."
          },
          "chain": {
            "type": "string",
            "description": "The coin's chain, in this API's chain words (solana, ethereum, base, bsc, robinhood, …)."
          },
          "coin_symbol": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "coin_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "text": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The caller's own words; null when they wrote none."
          },
          "media_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The media the caller attached to the callout, HTTPS only; null without one."
          },
          "called_out_at_mcap": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Market cap (USD) when the callout was posted, as pump.fun read it."
          },
          "multiple": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Price move since the callout, ×, when stored."
          },
          "max_multiplier": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "The peak move since the callout, ×, when stored."
          },
          "occurred_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          }
        },
        "required": [
          "callout_id",
          "wallet",
          "user_name",
          "x_username",
          "profile_image",
          "is_verified",
          "coin_mint",
          "chain",
          "coin_symbol",
          "coin_name",
          "text",
          "media_url",
          "called_out_at_mcap",
          "multiple",
          "max_multiplier",
          "occurred_at"
        ],
        "additionalProperties": false
      }
    },
    "read_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
    },
    "changes": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "cursor": {
            "type": "string"
          },
          "revision": {
            "type": "string"
          },
          "source_ts": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "captured_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "received_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          },
          "ingested_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"
          }
        },
        "required": [
          "cursor",
          "revision",
          "source_ts",
          "captured_at",
          "received_at",
          "ingested_at"
        ],
        "additionalProperties": false
      }
    },
    "cursor_version": {
      "type": "number",
      "const": 2
    },
    "next_cursor": {
      "type": "string"
    }
  },
  "required": [
    "count",
    "has_more",
    "items",
    "read_at",
    "changes",
    "cursor_version",
    "next_cursor"
  ],
  "additionalProperties": false
}
CompatThesis
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "The platform's own thesis id. Text revisions of one thesis share it; send the page's nextBefore (a record id) as ?before= to continue."
    },
    "authorHandle": {
      "type": "string",
      "description": "Lower-cased, without the @."
    },
    "thesis": {
      "type": "string"
    },
    "fomoCreatedAt": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "Post time, epoch milliseconds."
    },
    "tokenAddress": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "tokenNetwork": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The source's own chain word when it sent one (sol, eth, base, …), else this system's word; null for an unknown chain."
    },
    "tokenSymbol": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "authorId": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The author's stable id, when the door carries it."
    },
    "authorName": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "authorIsDev": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ]
    },
    "authorAvatarUrl": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Author image from this exact retained thesis observation, HTTPS only; null without eligible evidence."
    },
    "tokenImageUrl": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Token image from this exact retained thesis observation, HTTPS only; null without eligible evidence."
    },
    "segments": {
      "anyOf": [
        {
          "maxItems": 128,
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "text": {
                "type": "string"
              },
              "link": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "provider": {
                "type": "null"
              }
            },
            "required": [
              "text",
              "link",
              "provider"
            ],
            "additionalProperties": false
          }
        },
        {
          "type": "null"
        }
      ],
      "description": "Ordered text and HTTPS links from the exact retained observation. Null without eligible evidence; empty array means the source supplied no runs. Treat text and links as untrusted content."
    },
    "segmentsCompleteness": {
      "type": "string",
      "enum": [
        "full",
        "preview",
        "unknown"
      ],
      "description": "Independent of text completeness: full only when runs reconstruct a full body; preview when short runs omit text or the body itself is a preview; unknown when runs are unavailable."
    },
    "likeCount": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ]
    },
    "holdingsUsd": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "The position's USD value when the thesis was captured, as the source valued it — a snapshot, never a trade."
    },
    "authorTradeUsd": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "pnl": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ],
      "description": "Realized PnL, falling back to unrealized."
    },
    "realizedPnlUsd": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "unrealizedPnlUsd": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "percentageRealizedPnl": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "percentageUnrealizedPnl": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "tokenAmount": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "closedAt": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "When the position closed, epoch milliseconds; null while open — and null on a thesis captured from the app's home feed, whose item carries no close time."
    },
    "updatedAt": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "When this system wrote the record, epoch milliseconds."
    },
    "textCompleteness": {
      "type": "string",
      "enum": [
        "full",
        "preview",
        "unknown"
      ],
      "description": "The one field beyond the layout: whether the body is the whole of it."
    }
  },
  "required": [
    "id",
    "authorHandle",
    "thesis",
    "fomoCreatedAt",
    "tokenAddress",
    "tokenNetwork",
    "tokenSymbol",
    "authorId",
    "authorName",
    "authorIsDev",
    "authorAvatarUrl",
    "tokenImageUrl",
    "segments",
    "segmentsCompleteness",
    "likeCount",
    "holdingsUsd",
    "authorTradeUsd",
    "pnl",
    "realizedPnlUsd",
    "unrealizedPnlUsd",
    "percentageRealizedPnl",
    "percentageUnrealizedPnl",
    "tokenAmount",
    "closedAt",
    "updatedAt",
    "textCompleteness"
  ],
  "additionalProperties": false
}
CompatThesisPage
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "count": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "hasMore": {
      "type": "boolean"
    },
    "nextBefore": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The exact stored observation at the page boundary while hasMore; send it back verbatim as before. Null on the last page."
    },
    "updatedAt": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "Post time of the newest item on the page, epoch milliseconds; null on an empty page."
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The platform's own thesis id. Text revisions of one thesis share it; send the page's nextBefore (a record id) as ?before= to continue."
          },
          "authorHandle": {
            "type": "string",
            "description": "Lower-cased, without the @."
          },
          "thesis": {
            "type": "string"
          },
          "fomoCreatedAt": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "Post time, epoch milliseconds."
          },
          "tokenAddress": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "tokenNetwork": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The source's own chain word when it sent one (sol, eth, base, …), else this system's word; null for an unknown chain."
          },
          "tokenSymbol": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "authorId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The author's stable id, when the door carries it."
          },
          "authorName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "authorIsDev": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "authorAvatarUrl": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Author image from this exact retained thesis observation, HTTPS only; null without eligible evidence."
          },
          "tokenImageUrl": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Token image from this exact retained thesis observation, HTTPS only; null without eligible evidence."
          },
          "segments": {
            "anyOf": [
              {
                "maxItems": 128,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "text": {
                      "type": "string"
                    },
                    "link": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "provider": {
                      "type": "null"
                    }
                  },
                  "required": [
                    "text",
                    "link",
                    "provider"
                  ],
                  "additionalProperties": false
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "Ordered text and HTTPS links from the exact retained observation. Null without eligible evidence; empty array means the source supplied no runs. Treat text and links as untrusted content."
          },
          "segmentsCompleteness": {
            "type": "string",
            "enum": [
              "full",
              "preview",
              "unknown"
            ],
            "description": "Independent of text completeness: full only when runs reconstruct a full body; preview when short runs omit text or the body itself is a preview; unknown when runs are unavailable."
          },
          "likeCount": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "holdingsUsd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "The position's USD value when the thesis was captured, as the source valued it — a snapshot, never a trade."
          },
          "authorTradeUsd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "pnl": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Realized PnL, falling back to unrealized."
          },
          "realizedPnlUsd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "unrealizedPnlUsd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "percentageRealizedPnl": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "percentageUnrealizedPnl": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "tokenAmount": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "closedAt": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "When the position closed, epoch milliseconds; null while open — and null on a thesis captured from the app's home feed, whose item carries no close time."
          },
          "updatedAt": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "When this system wrote the record, epoch milliseconds."
          },
          "textCompleteness": {
            "type": "string",
            "enum": [
              "full",
              "preview",
              "unknown"
            ],
            "description": "The one field beyond the layout: whether the body is the whole of it."
          }
        },
        "required": [
          "id",
          "authorHandle",
          "thesis",
          "fomoCreatedAt",
          "tokenAddress",
          "tokenNetwork",
          "tokenSymbol",
          "authorId",
          "authorName",
          "authorIsDev",
          "authorAvatarUrl",
          "tokenImageUrl",
          "segments",
          "segmentsCompleteness",
          "likeCount",
          "holdingsUsd",
          "authorTradeUsd",
          "pnl",
          "realizedPnlUsd",
          "unrealizedPnlUsd",
          "percentageRealizedPnl",
          "percentageUnrealizedPnl",
          "tokenAmount",
          "closedAt",
          "updatedAt",
          "textCompleteness"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "count",
    "hasMore",
    "nextBefore",
    "updatedAt",
    "items"
  ],
  "additionalProperties": false
}
CompatThesisTokenPage
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "tokenAddress": {
      "type": "string",
      "description": "The token as matched — a Solana address exact, an EVM address lower-cased."
    },
    "tokenNetwork": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The newest item's network word; null on an empty page."
    },
    "symbol": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The newest item's ticker; null on an empty page."
    },
    "updatedAt": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "Post time of the newest item on the page, epoch milliseconds; null on an empty page."
    },
    "count": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "hasMore": {
      "type": "boolean"
    },
    "nextBefore": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The exact stored observation at the page boundary while hasMore; send it back verbatim as before. Null on the last page."
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The platform's own thesis id. Text revisions of one thesis share it; send the page's nextBefore (a record id) as ?before= to continue."
          },
          "authorHandle": {
            "type": "string",
            "description": "Lower-cased, without the @."
          },
          "thesis": {
            "type": "string"
          },
          "fomoCreatedAt": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "Post time, epoch milliseconds."
          },
          "tokenAddress": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "tokenNetwork": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The source's own chain word when it sent one (sol, eth, base, …), else this system's word; null for an unknown chain."
          },
          "tokenSymbol": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "authorId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The author's stable id, when the door carries it."
          },
          "authorName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "authorIsDev": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "authorAvatarUrl": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Author image from this exact retained thesis observation, HTTPS only; null without eligible evidence."
          },
          "tokenImageUrl": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Token image from this exact retained thesis observation, HTTPS only; null without eligible evidence."
          },
          "segments": {
            "anyOf": [
              {
                "maxItems": 128,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "text": {
                      "type": "string"
                    },
                    "link": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "provider": {
                      "type": "null"
                    }
                  },
                  "required": [
                    "text",
                    "link",
                    "provider"
                  ],
                  "additionalProperties": false
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "Ordered text and HTTPS links from the exact retained observation. Null without eligible evidence; empty array means the source supplied no runs. Treat text and links as untrusted content."
          },
          "segmentsCompleteness": {
            "type": "string",
            "enum": [
              "full",
              "preview",
              "unknown"
            ],
            "description": "Independent of text completeness: full only when runs reconstruct a full body; preview when short runs omit text or the body itself is a preview; unknown when runs are unavailable."
          },
          "likeCount": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "holdingsUsd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "The position's USD value when the thesis was captured, as the source valued it — a snapshot, never a trade."
          },
          "authorTradeUsd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "pnl": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Realized PnL, falling back to unrealized."
          },
          "realizedPnlUsd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "unrealizedPnlUsd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "percentageRealizedPnl": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "percentageUnrealizedPnl": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "tokenAmount": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "closedAt": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "When the position closed, epoch milliseconds; null while open — and null on a thesis captured from the app's home feed, whose item carries no close time."
          },
          "updatedAt": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "When this system wrote the record, epoch milliseconds."
          },
          "textCompleteness": {
            "type": "string",
            "enum": [
              "full",
              "preview",
              "unknown"
            ],
            "description": "The one field beyond the layout: whether the body is the whole of it."
          }
        },
        "required": [
          "id",
          "authorHandle",
          "thesis",
          "fomoCreatedAt",
          "tokenAddress",
          "tokenNetwork",
          "tokenSymbol",
          "authorId",
          "authorName",
          "authorIsDev",
          "authorAvatarUrl",
          "tokenImageUrl",
          "segments",
          "segmentsCompleteness",
          "likeCount",
          "holdingsUsd",
          "authorTradeUsd",
          "pnl",
          "realizedPnlUsd",
          "unrealizedPnlUsd",
          "percentageRealizedPnl",
          "percentageUnrealizedPnl",
          "tokenAmount",
          "closedAt",
          "updatedAt",
          "textCompleteness"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "tokenAddress",
    "tokenNetwork",
    "symbol",
    "updatedAt",
    "count",
    "hasMore",
    "nextBefore",
    "items"
  ],
  "additionalProperties": false
}
CompatThesisUserPage
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "userId": {
      "type": "string",
      "description": "The author's id, lower-cased, echoed back."
    },
    "tokenAddress": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The token the page was narrowed to, as matched; null on the user's whole feed."
    },
    "count": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "hasMore": {
      "type": "boolean"
    },
    "nextBefore": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The exact stored observation at the page boundary while hasMore; send it back verbatim as before. Null on the last page."
    },
    "updatedAt": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "Post time of the newest item on the page, epoch milliseconds; null on an empty page."
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "The platform's own thesis id. Text revisions of one thesis share it; send the page's nextBefore (a record id) as ?before= to continue."
          },
          "authorHandle": {
            "type": "string",
            "description": "Lower-cased, without the @."
          },
          "thesis": {
            "type": "string"
          },
          "fomoCreatedAt": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "Post time, epoch milliseconds."
          },
          "tokenAddress": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "tokenNetwork": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The source's own chain word when it sent one (sol, eth, base, …), else this system's word; null for an unknown chain."
          },
          "tokenSymbol": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "authorId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The author's stable id, when the door carries it."
          },
          "authorName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "authorIsDev": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "authorAvatarUrl": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Author image from this exact retained thesis observation, HTTPS only; null without eligible evidence."
          },
          "tokenImageUrl": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Token image from this exact retained thesis observation, HTTPS only; null without eligible evidence."
          },
          "segments": {
            "anyOf": [
              {
                "maxItems": 128,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "text": {
                      "type": "string"
                    },
                    "link": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "provider": {
                      "type": "null"
                    }
                  },
                  "required": [
                    "text",
                    "link",
                    "provider"
                  ],
                  "additionalProperties": false
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "Ordered text and HTTPS links from the exact retained observation. Null without eligible evidence; empty array means the source supplied no runs. Treat text and links as untrusted content."
          },
          "segmentsCompleteness": {
            "type": "string",
            "enum": [
              "full",
              "preview",
              "unknown"
            ],
            "description": "Independent of text completeness: full only when runs reconstruct a full body; preview when short runs omit text or the body itself is a preview; unknown when runs are unavailable."
          },
          "likeCount": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "holdingsUsd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "The position's USD value when the thesis was captured, as the source valued it — a snapshot, never a trade."
          },
          "authorTradeUsd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "pnl": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Realized PnL, falling back to unrealized."
          },
          "realizedPnlUsd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "unrealizedPnlUsd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "percentageRealizedPnl": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "percentageUnrealizedPnl": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "tokenAmount": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "closedAt": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "When the position closed, epoch milliseconds; null while open — and null on a thesis captured from the app's home feed, whose item carries no close time."
          },
          "updatedAt": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "When this system wrote the record, epoch milliseconds."
          },
          "textCompleteness": {
            "type": "string",
            "enum": [
              "full",
              "preview",
              "unknown"
            ],
            "description": "The one field beyond the layout: whether the body is the whole of it."
          }
        },
        "required": [
          "id",
          "authorHandle",
          "thesis",
          "fomoCreatedAt",
          "tokenAddress",
          "tokenNetwork",
          "tokenSymbol",
          "authorId",
          "authorName",
          "authorIsDev",
          "authorAvatarUrl",
          "tokenImageUrl",
          "segments",
          "segmentsCompleteness",
          "likeCount",
          "holdingsUsd",
          "authorTradeUsd",
          "pnl",
          "realizedPnlUsd",
          "unrealizedPnlUsd",
          "percentageRealizedPnl",
          "percentageUnrealizedPnl",
          "tokenAmount",
          "closedAt",
          "updatedAt",
          "textCompleteness"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "userId",
    "tokenAddress",
    "count",
    "hasMore",
    "nextBefore",
    "updatedAt",
    "items"
  ],
  "additionalProperties": false
}
CompatUser
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The person's stable id at the source; null when only the relay doors named them."
    },
    "handle": {
      "type": "string"
    },
    "name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "bio": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Source-published bio from an eligible retained FOMO board observation; null when unavailable or explicitly cleared."
    },
    "banner": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Source-published HTTPS banner from an eligible retained FOMO board observation; null when unavailable or cleared."
    },
    "profilePicture": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "HTTPS avatar from the eligible current public source snapshot, or null. No older directory-image fallback when evidence is missing, cleared or privacy-suppressed."
    },
    "twitter": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Source-declared X profile URL published by FOMO for this user id; null without an eligible public observation. This field is not identity or wallet-ownership verification."
    },
    "solanaAddress": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Present only when FOMO's own trade page attested this wallet and its persisted capture proof remains trusted. The page names the person's user id beside the wallet that traded the position. Proof survives raw-capture expiry; revoked or unknown proof returns null. Never one resolved from a handle. This Solana address is FOMO's account address for the person, not an on-chain trading wallet: none of these addresses signs a FOMO swap on chain, and those checked hold no account and no token account. The Solana wallet that signs and holds is solana_signer."
    },
    "evmAddress": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Present only when FOMO's own trade page attested this wallet and its persisted capture proof remains trusted. The page names the person's user id beside the wallet that traded the position. Proof survives raw-capture expiry; revoked or unknown proof returns null. Never one resolved from a handle."
    },
    "solanaSignerAddress": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Added: the Solana wallet that signs this person's trades on chain: the native lookup's solana_signer.wallet — INFERRED from FOMO's own app-signed swaps that coincide with the trades the app showed for the person (at least 2 matches holding 80 % both ways; the native lookup carries the evidence), never attested. Null without a served link."
    },
    "linkedWallets": {
      "maxItems": 25,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "platform": {
            "type": "string",
            "enum": [
              "pump",
              "axiom",
              "terminal"
            ],
            "description": "Whose public words name this wallet beside the X account: pump — a pump.fun account, served only where pump.fun's own payout board also names the account's numeric X id (its profile handle alone is self-declared); axiom — the caller of an Axiom call; terminal — another trading terminal's wallet profile or call."
          },
          "wallet": {
            "type": "string"
          },
          "chainFamily": {
            "type": "string",
            "enum": [
              "solana",
              "evm"
            ]
          },
          "via": {
            "type": "string",
            "const": "x_handle"
          },
          "level": {
            "type": "string",
            "const": "x_name_match"
          },
          "xHandle": {
            "type": "string",
            "pattern": "^[a-z0-9_]{1,15}$"
          },
          "observedAt": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "The platform's newest observation of this claim, epoch milliseconds."
          }
        },
        "required": [
          "platform",
          "wallet",
          "chainFamily",
          "via",
          "level",
          "xHandle",
          "observedAt"
        ],
        "additionalProperties": false
      },
      "description": "Added: the native lookup's linked_wallets in the layout's names. A platform's claim joined by X account, never a verification and never attested: the person's FOMO handle equals the X username the platform names beside the wallet, AND FOMO's display name for the person equals the X display name a platform shows for that username (compared case-folded, spaces collapsed; a display name equal to the handle never counts). Nothing for a handle two people show, nor for a wallet a platform also names for another X account, nor while the person is private. A different kind of address from solana_wallet, evm_wallet and solana_signer, and never merged into them."
    }
  },
  "required": [
    "id",
    "handle",
    "name",
    "bio",
    "banner",
    "profilePicture",
    "twitter",
    "solanaAddress",
    "evmAddress",
    "solanaSignerAddress",
    "linkedWallets"
  ],
  "additionalProperties": false
}
CompatPending
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "pending": {
      "type": "boolean",
      "const": true
    },
    "reason": {
      "type": "string",
      "enum": [
        "queued",
        "rate_limited",
        "unavailable",
        "no_preview"
      ]
    },
    "retryable": {
      "type": "boolean"
    },
    "retryAfterSeconds": {
      "description": "Present unless the reason is no_preview.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "pending",
    "reason",
    "retryable"
  ],
  "additionalProperties": false
}
CompatPnlEntry
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "handle": {
      "type": "string"
    },
    "displayName": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "avatarUrl": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "twitter": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Source-declared X profile URL from the same eligible public observation used for profile fields; null without evidence. This is not identity or wallet-ownership verification."
    },
    "followers": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "Source-reported followers from eligible retained FOMO board evidence; null without evidence."
    },
    "wallet": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Present only when FOMO's own trade page attested this wallet and its persisted capture proof remains trusted. The page names the person's user id beside the wallet that traded the position. Proof survives raw-capture expiry; revoked or unknown proof returns null. Never one resolved from a handle. This Solana address is FOMO's account address for the person, not an on-chain trading wallet: none of these addresses signs a FOMO swap on chain, and those checked hold no account and no token account. The Solana wallet that signs and holds is solana_signer."
    },
    "evmWallet": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Present only when FOMO's own trade page attested this wallet and its persisted capture proof remains trusted. The page names the person's user id beside the wallet that traded the position. Proof survives raw-capture expiry; revoked or unknown proof returns null. Never one resolved from a handle."
    },
    "signerWallet": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Added: the Solana wallet that signs this trader's trades on chain: the native entry's solana_signer.wallet — inferred, never attested; null without a served link. The figures beside it are the leaderboard's, not computed from this wallet."
    },
    "updatedAt": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "When the leaderboard figures were stored, epoch milliseconds."
    },
    "windows": {
      "type": "object",
      "properties": {
        "24h": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "netUsd": {
                  "type": "number",
                  "description": "The leaderboard's PnL for the window, USD — not a cash flow."
                },
                "returnPct": {
                  "type": "null",
                  "description": "Always null: the leaderboard publishes no percentage."
                },
                "volumeUsd": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Currently null in every window: the captured volume total has no proven window-specific period."
                },
                "trades": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Currently null in every window: the captured trade total has no proven window-specific period."
                },
                "rank": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "netUsd",
                "returnPct",
                "volumeUsd",
                "trades",
                "rank"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        },
        "7d": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "netUsd": {
                  "type": "number",
                  "description": "The leaderboard's PnL for the window, USD — not a cash flow."
                },
                "returnPct": {
                  "type": "null",
                  "description": "Always null: the leaderboard publishes no percentage."
                },
                "volumeUsd": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Currently null in every window: the captured volume total has no proven window-specific period."
                },
                "trades": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Currently null in every window: the captured trade total has no proven window-specific period."
                },
                "rank": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "netUsd",
                "returnPct",
                "volumeUsd",
                "trades",
                "rank"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        },
        "30d": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "netUsd": {
                  "type": "number",
                  "description": "The leaderboard's PnL for the window, USD — not a cash flow."
                },
                "returnPct": {
                  "type": "null",
                  "description": "Always null: the leaderboard publishes no percentage."
                },
                "volumeUsd": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Currently null in every window: the captured volume total has no proven window-specific period."
                },
                "trades": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Currently null in every window: the captured trade total has no proven window-specific period."
                },
                "rank": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "netUsd",
                "returnPct",
                "volumeUsd",
                "trades",
                "rank"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        },
        "all": {
          "type": "null"
        }
      },
      "required": [
        "24h",
        "7d",
        "30d",
        "all"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "handle",
    "displayName",
    "avatarUrl",
    "twitter",
    "followers",
    "wallet",
    "evmWallet",
    "signerWallet",
    "updatedAt",
    "windows"
  ],
  "additionalProperties": false
}
CompatPnl
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "handle": {
      "type": "string"
    },
    "displayName": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "avatarUrl": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "twitter": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Source-declared X profile URL from the same eligible public observation used for profile fields; null without evidence. This is not identity or wallet-ownership verification."
    },
    "followers": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "Source-reported followers from eligible retained FOMO board evidence; null without evidence."
    },
    "wallet": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Present only when FOMO's own trade page attested this wallet and its persisted capture proof remains trusted. The page names the person's user id beside the wallet that traded the position. Proof survives raw-capture expiry; revoked or unknown proof returns null. Never one resolved from a handle. This Solana address is FOMO's account address for the person, not an on-chain trading wallet: none of these addresses signs a FOMO swap on chain, and those checked hold no account and no token account. The Solana wallet that signs and holds is solana_signer."
    },
    "evmWallet": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Present only when FOMO's own trade page attested this wallet and its persisted capture proof remains trusted. The page names the person's user id beside the wallet that traded the position. Proof survives raw-capture expiry; revoked or unknown proof returns null. Never one resolved from a handle."
    },
    "signerWallet": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Added: the Solana wallet that signs this trader's trades on chain: the native entry's solana_signer.wallet — inferred, never attested; null without a served link. The figures beside it are the leaderboard's, not computed from this wallet."
    },
    "updatedAt": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "When the leaderboard figures were stored, epoch milliseconds."
    },
    "windows": {
      "type": "object",
      "properties": {
        "24h": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "netUsd": {
                  "type": "number",
                  "description": "The leaderboard's PnL for the window, USD — not a cash flow."
                },
                "returnPct": {
                  "type": "null",
                  "description": "Always null: the leaderboard publishes no percentage."
                },
                "volumeUsd": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Currently null in every window: the captured volume total has no proven window-specific period."
                },
                "trades": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Currently null in every window: the captured trade total has no proven window-specific period."
                },
                "rank": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "netUsd",
                "returnPct",
                "volumeUsd",
                "trades",
                "rank"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        },
        "7d": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "netUsd": {
                  "type": "number",
                  "description": "The leaderboard's PnL for the window, USD — not a cash flow."
                },
                "returnPct": {
                  "type": "null",
                  "description": "Always null: the leaderboard publishes no percentage."
                },
                "volumeUsd": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Currently null in every window: the captured volume total has no proven window-specific period."
                },
                "trades": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Currently null in every window: the captured trade total has no proven window-specific period."
                },
                "rank": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "netUsd",
                "returnPct",
                "volumeUsd",
                "trades",
                "rank"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        },
        "30d": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "netUsd": {
                  "type": "number",
                  "description": "The leaderboard's PnL for the window, USD — not a cash flow."
                },
                "returnPct": {
                  "type": "null",
                  "description": "Always null: the leaderboard publishes no percentage."
                },
                "volumeUsd": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Currently null in every window: the captured volume total has no proven window-specific period."
                },
                "trades": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Currently null in every window: the captured trade total has no proven window-specific period."
                },
                "rank": {
                  "anyOf": [
                    {
                      "type": "integer",
                      "minimum": -9007199254740991,
                      "maximum": 9007199254740991
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "netUsd",
                "returnPct",
                "volumeUsd",
                "trades",
                "rank"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        },
        "all": {
          "type": "null"
        }
      },
      "required": [
        "24h",
        "7d",
        "30d",
        "all"
      ],
      "additionalProperties": false
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "handle",
    "displayName",
    "avatarUrl",
    "twitter",
    "followers",
    "wallet",
    "evmWallet",
    "signerWallet",
    "updatedAt",
    "windows",
    "notes"
  ],
  "additionalProperties": false
}
CompatPnlBatch
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "count": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "missing": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "entries": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "handle": {
            "type": "string"
          },
          "displayName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "avatarUrl": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "twitter": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Source-declared X profile URL from the same eligible public observation used for profile fields; null without evidence. This is not identity or wallet-ownership verification."
          },
          "followers": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "Source-reported followers from eligible retained FOMO board evidence; null without evidence."
          },
          "wallet": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Present only when FOMO's own trade page attested this wallet and its persisted capture proof remains trusted. The page names the person's user id beside the wallet that traded the position. Proof survives raw-capture expiry; revoked or unknown proof returns null. Never one resolved from a handle. This Solana address is FOMO's account address for the person, not an on-chain trading wallet: none of these addresses signs a FOMO swap on chain, and those checked hold no account and no token account. The Solana wallet that signs and holds is solana_signer."
          },
          "evmWallet": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Present only when FOMO's own trade page attested this wallet and its persisted capture proof remains trusted. The page names the person's user id beside the wallet that traded the position. Proof survives raw-capture expiry; revoked or unknown proof returns null. Never one resolved from a handle."
          },
          "signerWallet": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Added: the Solana wallet that signs this trader's trades on chain: the native entry's solana_signer.wallet — inferred, never attested; null without a served link. The figures beside it are the leaderboard's, not computed from this wallet."
          },
          "updatedAt": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "When the leaderboard figures were stored, epoch milliseconds."
          },
          "windows": {
            "type": "object",
            "properties": {
              "24h": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "netUsd": {
                        "type": "number",
                        "description": "The leaderboard's PnL for the window, USD — not a cash flow."
                      },
                      "returnPct": {
                        "type": "null",
                        "description": "Always null: the leaderboard publishes no percentage."
                      },
                      "volumeUsd": {
                        "anyOf": [
                          {
                            "type": "number"
                          },
                          {
                            "type": "null"
                          }
                        ],
                        "description": "Currently null in every window: the captured volume total has no proven window-specific period."
                      },
                      "trades": {
                        "anyOf": [
                          {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991
                          },
                          {
                            "type": "null"
                          }
                        ],
                        "description": "Currently null in every window: the captured trade total has no proven window-specific period."
                      },
                      "rank": {
                        "anyOf": [
                          {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": [
                      "netUsd",
                      "returnPct",
                      "volumeUsd",
                      "trades",
                      "rank"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "7d": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "netUsd": {
                        "type": "number",
                        "description": "The leaderboard's PnL for the window, USD — not a cash flow."
                      },
                      "returnPct": {
                        "type": "null",
                        "description": "Always null: the leaderboard publishes no percentage."
                      },
                      "volumeUsd": {
                        "anyOf": [
                          {
                            "type": "number"
                          },
                          {
                            "type": "null"
                          }
                        ],
                        "description": "Currently null in every window: the captured volume total has no proven window-specific period."
                      },
                      "trades": {
                        "anyOf": [
                          {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991
                          },
                          {
                            "type": "null"
                          }
                        ],
                        "description": "Currently null in every window: the captured trade total has no proven window-specific period."
                      },
                      "rank": {
                        "anyOf": [
                          {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": [
                      "netUsd",
                      "returnPct",
                      "volumeUsd",
                      "trades",
                      "rank"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "30d": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "netUsd": {
                        "type": "number",
                        "description": "The leaderboard's PnL for the window, USD — not a cash flow."
                      },
                      "returnPct": {
                        "type": "null",
                        "description": "Always null: the leaderboard publishes no percentage."
                      },
                      "volumeUsd": {
                        "anyOf": [
                          {
                            "type": "number"
                          },
                          {
                            "type": "null"
                          }
                        ],
                        "description": "Currently null in every window: the captured volume total has no proven window-specific period."
                      },
                      "trades": {
                        "anyOf": [
                          {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991
                          },
                          {
                            "type": "null"
                          }
                        ],
                        "description": "Currently null in every window: the captured trade total has no proven window-specific period."
                      },
                      "rank": {
                        "anyOf": [
                          {
                            "type": "integer",
                            "minimum": -9007199254740991,
                            "maximum": 9007199254740991
                          },
                          {
                            "type": "null"
                          }
                        ]
                      }
                    },
                    "required": [
                      "netUsd",
                      "returnPct",
                      "volumeUsd",
                      "trades",
                      "rank"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "all": {
                "type": "null"
              }
            },
            "required": [
              "24h",
              "7d",
              "30d",
              "all"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "handle",
          "displayName",
          "avatarUrl",
          "twitter",
          "followers",
          "wallet",
          "evmWallet",
          "signerWallet",
          "updatedAt",
          "windows"
        ],
        "additionalProperties": false
      },
      "description": "In the order requested."
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "count",
    "missing",
    "entries",
    "notes"
  ],
  "additionalProperties": false
}
CompatMe
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "plan": {
      "type": "string"
    },
    "scopes": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Always empty: a data key reads every path on its plan."
    },
    "entitlement": {
      "type": "object",
      "properties": {
        "monthlyUnits": {
          "type": "null"
        },
        "ratePerMinute": {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "monthlyReveals": {
          "type": "null"
        },
        "unmetered": {
          "type": "boolean",
          "const": false
        }
      },
      "required": [
        "monthlyUnits",
        "ratePerMinute",
        "monthlyReveals",
        "unmetered"
      ],
      "additionalProperties": false
    },
    "usage": {
      "type": "object",
      "properties": {
        "period": {
          "type": "string",
          "description": "The UTC day, YYYY-MM-DD."
        },
        "unitsUsed": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991,
          "description": "Requests counted today, this one included."
        },
        "unitsRemaining": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        "additionalUnits": {
          "type": "null"
        },
        "revealsUsed": {
          "type": "null"
        },
        "revealsRemaining": {
          "type": "null"
        }
      },
      "required": [
        "period",
        "unitsUsed",
        "unitsRemaining",
        "additionalUnits",
        "revealsUsed",
        "revealsRemaining"
      ],
      "additionalProperties": false
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "plan",
    "scopes",
    "entitlement",
    "usage",
    "notes"
  ],
  "additionalProperties": false
}
CompatPumpUser
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "wallet": {
      "type": "string"
    },
    "username": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "bio": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The profile's own bio from the last stored profile read; null when none is stored."
    },
    "profileImage": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "xUsername": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The X handle pump.fun shows for the account — the platform's word, not a verification."
    },
    "isVerified": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "description": "pump.fun's own verified badge on the account, as pump.fun showed it; null when no stored observation carries one. The platform's word, not a verification of the X account or of wallet ownership."
    },
    "isPumpUser": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "description": "False for a wallet that traded without creating an account; null when no profile read is stored."
    },
    "followers": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ]
    },
    "following": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "From the last stored profile read; null when none is stored."
    },
    "groupBadges": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The names of the squads pump.fun names on the profile; empty when it names none or no profile read is stored."
    }
  },
  "required": [
    "wallet",
    "username",
    "bio",
    "profileImage",
    "xUsername",
    "isVerified",
    "isPumpUser",
    "followers",
    "following",
    "groupBadges"
  ],
  "additionalProperties": false
}
CompatCallout
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {
      "type": "string"
    },
    "wallet": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "userName": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "xUsername": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The X handle pump.fun showed with the callout, else the caller's stored profile's."
    },
    "profileImage": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Stored caller image joined by the exact source wallet, else the image pump.fun showed with the callout; HTTPS only."
    },
    "isVerified": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "description": "pump.fun's own verified badge on the account, as pump.fun showed it; null when no stored observation carries one. The platform's word, not a verification of the X account or of wallet ownership."
    },
    "coinMint": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "chain": {
      "type": "string"
    },
    "coinSymbol": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "coinName": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "thesis": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The caller's own words; null when they wrote none."
    },
    "mediaUrl": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "The media the caller attached, HTTPS only; null without one."
    },
    "calledOutAtMcap": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "multiple": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "maxMultiplier": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "createdAt": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "Post time, epoch milliseconds."
    }
  },
  "required": [
    "id",
    "wallet",
    "userName",
    "xUsername",
    "profileImage",
    "isVerified",
    "coinMint",
    "chain",
    "coinSymbol",
    "coinName",
    "thesis",
    "mediaUrl",
    "calledOutAtMcap",
    "multiple",
    "maxMultiplier",
    "createdAt"
  ],
  "additionalProperties": false
}
CompatCalloutPage
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "count": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991
    },
    "hasMore": {
      "type": "boolean"
    },
    "nextBefore": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "wallet": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "userName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "xUsername": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The X handle pump.fun showed with the callout, else the caller's stored profile's."
          },
          "profileImage": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Stored caller image joined by the exact source wallet, else the image pump.fun showed with the callout; HTTPS only."
          },
          "isVerified": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "pump.fun's own verified badge on the account, as pump.fun showed it; null when no stored observation carries one. The platform's word, not a verification of the X account or of wallet ownership."
          },
          "coinMint": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "chain": {
            "type": "string"
          },
          "coinSymbol": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "coinName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "thesis": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The caller's own words; null when they wrote none."
          },
          "mediaUrl": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "The media the caller attached, HTTPS only; null without one."
          },
          "calledOutAtMcap": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "multiple": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "maxMultiplier": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "createdAt": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "Post time, epoch milliseconds."
          }
        },
        "required": [
          "id",
          "wallet",
          "userName",
          "xUsername",
          "profileImage",
          "isVerified",
          "coinMint",
          "chain",
          "coinSymbol",
          "coinName",
          "thesis",
          "mediaUrl",
          "calledOutAtMcap",
          "multiple",
          "maxMultiplier",
          "createdAt"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "count",
    "hasMore",
    "nextBefore",
    "items"
  ],
  "additionalProperties": false
}
CompatLeaderboard
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "enum": [
        "daily",
        "weekly",
        "monthly"
      ]
    },
    "capturedAt": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "Qualified observation time in epoch milliseconds, never the source window start or import time."
    },
    "count": {
      "type": "integer",
      "minimum": 0,
      "maximum": 100
    },
    "entries": {
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "rank": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "wallet": {
            "type": "string",
            "pattern": "^[1-9A-HJ-NP-Za-km-z]{32,44}$"
          },
          "username": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 2048
              },
              {
                "type": "null"
              }
            ]
          },
          "profileImage": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 2048
              },
              {
                "type": "null"
              }
            ]
          },
          "userId": {
            "anyOf": [
              {
                "type": "string",
                "maxLength": 2048
              },
              {
                "type": "null"
              }
            ]
          },
          "xUsername": {
            "anyOf": [
              {
                "type": "string",
                "pattern": "^[A-Za-z0-9_]{1,15}$"
              },
              {
                "type": "null"
              }
            ],
            "description": "Source-declared X handle; not verified ownership or a FOMO identity."
          },
          "isVerified": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "description": "Pump's profile flag, not verification of the X declaration."
          },
          "verifiedBadgeVisible": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ]
          },
          "pnlSol": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "pnlUsd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "pnlPercent": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "realizedPnlSol": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "realizedPnlUsd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "unrealizedPnlSol": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "unrealizedPnlUsd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "buySpendSol": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Source buy-spend figure in SOL; not total buy+sell USD volume."
          },
          "positionsCount": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "lastRefreshedAtMs": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ]
          },
          "topPositions": {
            "anyOf": [
              {
                "maxItems": 5,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "mint": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 128
                    },
                    "chainId": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "symbol": {
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 2048
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "name": {
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 2048
                        },
                        {
                          "type": "null"
                        }
                      ]
                    },
                    "imageUri": {
                      "anyOf": [
                        {
                          "type": "string",
                          "maxLength": 2048
                        },
                        {
                          "type": "null"
                        }
                      ]
                    }
                  },
                  "required": [
                    "mint",
                    "chainId",
                    "symbol",
                    "name",
                    "imageUri"
                  ],
                  "additionalProperties": false
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "Bounded source icons, not a full holdings inventory."
          }
        },
        "required": [
          "rank",
          "wallet",
          "username",
          "profileImage",
          "userId",
          "xUsername",
          "isVerified",
          "verifiedBadgeVisible",
          "pnlSol",
          "pnlUsd",
          "pnlPercent",
          "realizedPnlSol",
          "realizedPnlUsd",
          "unrealizedPnlSol",
          "unrealizedPnlUsd",
          "buySpendSol",
          "positionsCount",
          "lastRefreshedAtMs",
          "topPositions"
        ],
        "additionalProperties": false
      }
    },
    "note": {
      "type": "string"
    },
    "sourcePeriodType": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ]
    },
    "sourcePeriodLabel": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "sourceWindowStartSec": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "The source's declared window start, preserved without assuming it is a rolling window."
    },
    "sourceHttpDate": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Source HTTP Date metadata, separate from our observation clock."
    }
  },
  "required": [
    "period",
    "capturedAt",
    "count",
    "entries",
    "note",
    "sourcePeriodType",
    "sourcePeriodLabel",
    "sourceWindowStartSec",
    "sourceHttpDate"
  ],
  "additionalProperties": false
}
CompatError
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "enum": [
            "VALIDATION_ERROR",
            "UNAUTHORIZED",
            "QUOTA_EXCEEDED",
            "FORBIDDEN",
            "NOT_OBSERVED",
            "NOT_FOUND",
            "BAD_REQUEST",
            "RATE_LIMITED",
            "OVERLOADED",
            "INTERNAL_ERROR"
          ]
        },
        "message": {
          "type": "string",
          "description": "Names the refused parameter, never its value."
        },
        "retryAfter": {
          "description": "Seconds; only on RATE_LIMITED.",
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        "addUrl": {
          "description": "Where the answer lives instead; only on the socket path's NOT_FOUND.",
          "type": "string"
        }
      },
      "required": [
        "code",
        "message"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "error"
  ],
  "additionalProperties": false
}