Skip to content

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? 0100
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_eventstake, reaffirm, confidence, note, share — and never overwrite the canonical signal. The resolver appends resolved.
  • 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.

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.

  • GET /api/signals/[id] — one signal, operator id masked as op_…
  • GET /api/signals/[id]/events — its append-only history
  • GET /api/signals/feed?type=beat_crowd — global activity
  • GET /api/m/[marketId]/signals — the ledger on a surface

See Protocol writes for POST /api/predictions.