NuttyRefs public API v1

Read published incidents and games without signing in. Responses use JSON, opaque string IDs, ISO timestamps, and explicit null for unknown facts. Fan ballots are opinions, not official determinations.

OpenAPI specification (JSON)

Lists accept league, season_type, from (inclusive UTC date/time), to (exclusive UTC date/time), status, sort, limit (1–100, default 20), offset (0–100000), season, week, and team_id. Dates filter game kickoff or incident publication time. Status filters game state or incident explanation state (developing, corroborated, explained, resolved). Incidents also accept game_id, category and has_verdict=true for recent voting debates. Unknown or repeated filters return 400.

Games sort by kickoff ascending (sort=kickoff), or descending with sort=recent, unknown kickoffs last, then ID ascending. Incidents sort by publication time descending, then ID descending. Follow pagination.nextOffset until null. Ordering is stable for unchanged data; concurrent publication or schedule changes can move records between pages.

Detail responses use a data envelope; list responses also include pagination. Incident details include source links and anonymous vote aggregates. Individual ballot identities and private editorial candidates are not included. Raw percentages are arithmetic, not representative sentiment: show counts below 20 votes in the displayed population. Hide rooting-group results below 10; show counts at 10–19 and percentages at 20+. Check each source’s supports note; game context alone does not verify the disputed act. debate_question exposes question text, option labels and question_version independently of final_ruling. Stable result keys correct/incorrect map to option A/B, so always display their labels. ruling_version is a compatibility alias for question_version; corrections can start fresh ballots while retaining prior votes privately. Formerly public merged duplicates redirect with HTTP 308. Rooting-interest null means unanswered; undisclosed means the voter chose “prefer not to say.”

Errors use an error object with code and message: 400 invalid_request, 404 not_found, 503 unavailable. Retry temporary failures conservatively. This first version uses no-store responses so withdrawals are immediately reflected on the next request.

Source URLs are references, not licenses to reuse content. POST /api/v1/agent-leads accepts a scoped Bearer key and required Idempotency-Key. GET /api/v1/agent-leads/{id} returns the submitting agent’s validation status. External agents cannot publish directly. Register and manage keys at /developers.

Developer registration and submission examples