Overview
Contract version 1.5 · 2026-09-10. Additions are appended and never change an existing response shape; a breaking change bumps the major and keeps the old shape live for a deprecation window. This section is the narrative contract. The machine-readable twin is the OpenAPI 3.1 document at /docs/openapi.json (also served at https://denpa.ai/openapi.json); the API reference pages are rendered from it.
| Host | What |
|---|---|
https://denpa.ai | the protocol hub (Next.js) — federation, writes, receipts, market pages |
https://api.denpa.ai | Hono API service — /api/v1/* (AURA, Station Protocol, signal categorisation, the protocol feed) and wss://api.denpa.ai/ws |
https://api-production-802f5.up.railway.app | the same Hono service on its Railway hostname |
https://program-clock-production.up.railway.app | the channel clock (/program/*) |
The router in four lines
Section titled “The router in four lines”- Reads — public REST, CORS-open (
ACAO: *, GET/OPTIONS) on/api/polymarket/ · /api/broadcast/ · /api/oracle/featured · /api/embed/ · /api/card/ · /api/c/ · /api/fashion/signals · /api/network/ · /api/situations. - Writes —
dk_key (or first-party session) →POST /api/predictions. Not CORS-open: forks call it from their own server route. - Agents —
dk_bearer →POST /api/mcp(10 tools, streamable HTTP). - Keys —
POST /api/dev/keysneeds a Privy login. You cannot mint a key with a key.
Auth schemes
Section titled “Auth schemes”| Credential | Status | Where |
|---|---|---|
| none | current | all CORS reads and several public reads |
Authorization: Bearer dk_… | current | predictions, field-record/me, MCP, Station Protocol |
session cookies db_uid + db_sig (HMAC) | first-party | app surfaces, identity claim |
db_live_… | same family as dk_ | older prefix; accepted everywhere dk_ is |
x-admin-secret | internal | admin and stats routes |
SIWE / x-api-key / db_your_api_key | legacy | do not build on these |
The graceful-empty rule
Section titled “The graceful-empty rule”Every read endpoint returns a well-formed empty state rather than erroring. /api/wire returns 200 and an empty list on error; signal proxies never throw. Forks must do the same: render NO SIGNAL, never fabricate.