GET /api/protocol/v1 · demo: /developer/siwd-demoGET /api/operator/:handleGET https://api-production-802f5.up.railway.app/api/v1/signals/externalGET /api/operator/:handle → moments[]GET /api/operator/leaderboardGET /api/broadcast/program?preset=# Fetch an operator field record
curl https://denpa.ai/api/operator/sporty
# Response
{
"handle": "sporty",
"rank": "OPERATOR",
"stats": {
"totalCalls": 24,
"resolvedCalls": 18,
"correctCalls": 12,
"accuracy": 67
},
"liveSignal": {
"marketId": "...",
"name": "Will X happen?",
"yesPct": 73
},
"_meta": {
"atomVersion": "1.0",
"embedUrl": "https://denpa.ai/operator/sporty/embed"
}
}/api/network/tapesDenpa Network tape reel — clips from every station, origin-labeled (?exclude=denpa|basetv)/api/network/operatorsDenpa Network operator board — every station, origin-labeled, merged by score/api/operator/:handleOperator atom — identity, stats, live signal, moments/api/operator/leaderboardSignal board — ranked by broadcast scorehttps://api-production-802f5.up.railway.app/api/v1/signals/externalAURA signal feed — top live market attention (API service host, not denpa.ai)/api/polymarket/featuredFeatured market tiles — editorial + AURA ranked/api/polymarket/marketsAll active Polymarket markets (Gamma-normalized)/api/broadcast/programMarket clock — lanes + time-positioned segments (?preset=hot|resolving|close); powers /tv/api/network/programThe same clock scoped to your station (?providers=polymarket|kalshi&categories=…)/api/network/field-record/:handleField record (Layer 8) — rank, accuracy, streak, recent calls with receipt URLs/api/network/field-record/meYour own field record — Authorization: Bearer dk_… ("who am I")/api/situationsTHE WIRE grouped into stories — moving markets per event (?lane=&window=15m|1h|6h|24h)/api/wireWireEvent[] — markets ranked by belief movement. Not CORS-open: fetch server-side/api/predictionsFile a SIGNAL as your operator — proxy it through your own server route (not CORS-open)<iframe src="https://denpa.ai/operator/your-handle/embed" width="320" height="520" frameborder="0" style="border:none" ></iframe>
# Denpa MCP — drive your operator surface from Claude Code (or any MCP client). # 1. Sign in above with your Denpa account and create an API key (dk_…). # 2. Connect: claude mcp add --transport http denpa https://denpa.ai/api/mcp \ --header "Authorization: Bearer dk_YOUR_KEY" # 3. Ask your agent things like: # "push a signal for the top featured market to my live page" # "bind my HLS stream to market 516830" # "get my OBS ingest and stream key" (approved operators) # # Tools: denpa_whoami · denpa_featured_markets · denpa_market · denpa_push_signal # denpa_clear_signal · denpa_get_signal · denpa_bind_stream · denpa_unbind_stream # denpa_go_live · denpa_my_broadcasts # Every write acts as YOUR operator identity — the handle is resolved server-side # from the key, never from tool arguments.
network/market · polymarket/market-history · polymarket/markets · broadcast/program · polymarket/featured · situations · network/tapes · network/operators · network/field-record · v1/signals/leaderboardnetwork/tapes · network/operatorsnetwork/tapes · network/operators (server-side; own public read APIs are consumed by denpa.ai in turn)# Clone the reference fork — it already wires every protocol API # and ships the static-TV broadcast placeholder. ~60 seconds to live. git clone https://github.com/bananaemojiii/denpa-fork-zero cd denpa-fork-zero cp .env.example .env # endpoints prefilled — denpa.ai + api service npm install npm run dev # → http://localhost:5173
# Asked to "fork the Denpa protocol"? Follow this exactly. # DATA — all reads are public REST over HTTPS, CORS-enabled. # There is NO npm SDK and NO auth for reads. Do not block first paint on a # WebSocket; poll REST every 30s. (A panel stuck on "loading…" means you wired # a non-existent SDK / dead socket — use these endpoints instead.) GET denpa.ai/api/broadcast/program?preset=default # the denpa.ai channel clock (lanes → rundown) GET denpa.ai/api/network/program?providers=kalshi&categories= # the same clock scoped to YOUR station GET denpa.ai/api/polymarket/featured # heatmap tiles GET denpa.ai/api/polymarket/market-history?marketId=ID&interval=1H # YES price history (chart) GET denpa.ai/api/situations?window=24h&limit=30 # stories of belief movement GET denpa.ai/api/network/tapes?limit=20 # federated clip reel (HLS) GET denpa.ai/api/network/operators # merged operator board GET denpa.ai/api/network/field-record/HANDLE # public field record GET api-production-802f5.up.railway.app/api/v1/signals/leaderboard?operators=human # RULES # - A fork owns its surface + theme; it must NOT reimplement Signal / Market / # User / Outcome — those resolve through denpa.ai (Layer 14). # - Always render the static-TV <NoSignal/> for loading / empty / error states. # - Reads are public; SIGNAL writes go through the API service (API-key gated). # NEW VERTICAL? Ask the user only what you cannot infer, then build: # 1. Name + vertical? (sport / music / crypto / culture / film / news …) # 2. Theme — reuse the Ceefax teletext skin, or custom colors + font? # 3. Standalone repo, or an app inside the denpa monorepo? # Then edit CHANNELS + theme in src/lib/denpa.ts and src/App.tsx. That's it.
// <NoSignal/> — premade static-TV broadcast placeholder. Render for any
// loading / empty / error state so a fork never dead-loads. Pure CSS, no assets.
export function NoSignal({ caption = "TUNING…" }: { caption?: string }) {
const css =
"@keyframes ns-flicker{0%,100%{opacity:.5}9%{opacity:.35}53%{opacity:.4}}" +
"@keyframes ns-roll{to{background-position:0 6px}}";
const noise =
"repeating-linear-gradient(0deg,rgba(255,255,255,.06) 0,rgba(0,0,0,.1) 1px,rgba(255,255,255,.04) 2px,rgba(0,0,0,.08) 3px)";
return (
<div style={{ position:"relative", height:280, background:"#0a0a0a", overflow:"hidden", display:"grid", placeItems:"center" }}>
<style>{css}</style>
<div style={{ position:"absolute", inset:"-10%", backgroundImage:noise, backgroundSize:"100% 4px", opacity:.5, mixBlendMode:"screen", animation:"ns-flicker 2.4s steps(2) infinite" }} />
<div style={{ position:"absolute", inset:0, backgroundImage:"linear-gradient(#3333 50%,transparent 50%)", backgroundSize:"100% 6px", opacity:.4, animation:"ns-roll 8s linear infinite" }} />
<div style={{ position:"relative", textAlign:"center", fontFamily:"monospace" }}>
<div style={{ color:"#fff", fontWeight:900, letterSpacing:".3em" }}>NO SIGNAL</div>
<div style={{ marginTop:".5rem", color:"#a0a0a0", fontSize:".7rem", letterSpacing:".14em" }}>{caption}</div>
</div>
</div>
);
}