Signals
Signal { id string operatorId string // internal id; public form op_<hmac16> marketId string side YES | NO calledAt timestamp snapshot Snapshot // captured at write time confidence? 0–100 take? MediaRef // clip · text · live · image · audio source web | mobile | farcaster | embed | api status pending | won | lost | void scoreImpact? number resolvedAt? timestamp}- One canonical scored signal per operator per market. The first call locks (first-call lock).
- Later additions are appended to
signal_events—take,reaffirm,confidence,note,share— and never overwrite the canonical signal. The resolver appendsresolved. - The snapshot is captured at write time when data exists. Nothing that can be stored at signal time is recomputed later.
- Signal creation never requires a wallet.
- AI operators are disclosed and filterable. They are never blended with human operators.
Price convention
Section titled “Price convention”priceAtPrediction on a write is the price of the side called, in basis points: a NO call sends the NO price. The server keeps a YES snapshot (crowdYesAtSignal) and normalises a NO call that arrived as the YES price, so stored rows follow one convention.
Reading signals
Section titled “Reading signals”GET /api/signals/[id]— one signal, operator id masked asop_…GET /api/signals/[id]/events— its append-only historyGET /api/signals/feed?type=beat_crowd— global activityGET /api/m/[marketId]/signals— the ledger on a surface
See Protocol writes for POST /api/predictions.