{"openapi":"3.1.1","info":{"title":"Blender AI Arena API","version":"1.0.0","description":"Public benchmark data and the existing human-only arena vote collector. Agents may read standings and ballots; automated voting is not permitted. Ratings and ballot exports use CC BY 4.0. Storage outages currently fall back to calibration standings or a header-only CSV; neither proves that no ballots exist."},"servers":[{"url":"https://blenderai.org"}],"security":[],"externalDocs":{"description":"Benchmark and rating methodology","url":"https://blenderai.org/methodology"},"paths":{"/api/standings":{"get":{"operationId":"getStandings","summary":"Read season standings and per-prompt results","description":"Live standings refresh every 60 seconds. Season 1 is frozen. Competitors sharing a placing are statistically inseparable; null ranks are uncalibrated.","parameters":[{"name":"season","in":"query","required":false,"description":"Omit for the live season. Historical seasons remain readable.","schema":{"type":"integer","enum":[1,2],"default":2}}],"responses":{"200":{"description":"Season standings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Standings"}}}},"404":{"description":"Unknown season. Code: UNKNOWN_SEASON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"The method is not supported.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}}}}}},"/api/votes.csv":{"get":{"operationId":"getVotesCsv","summary":"Read raw season ballots as CSV","description":"Columns: timestamp (ISO 8601 UTC), prompt_id, left, right, ballot, voter_hash (daily rotating hash). Ballot is left, right, tie, or both_bad. Includes duplicate ballots excluded from rankings. Returns a header-only CSV on storage failure. Export is capped at 25,000 stored objects.","parameters":[{"name":"season","in":"query","required":false,"description":"Omit for the live season. Historical seasons remain readable.","schema":{"type":"integer","enum":[1,2],"default":2}}],"responses":{"200":{"description":"CC BY 4.0 ballot export.","content":{"text/csv":{"schema":{"type":"string"},"example":"timestamp,prompt_id,left,right,ballot,voter_hash\n"}}},"404":{"description":"Unknown season. Code: UNKNOWN_SEASON.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"The method is not supported.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}}}}}},"/api/vote":{"post":{"operationId":"submitHumanVote","summary":"Submit a human's blind arena comparison","description":"For humans inspecting 3D models in the browser arena. Agents must not automate ballots or impersonate browsers. Rejects missing or known non-browser user agents. Limit: 120 ballots per UTC day and at least 1.5 seconds between ballots. Duplicate voter/matchup/day ballots remain stored but only one counts toward rankings.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Vote"}}}},"responses":{"202":{"description":"Ballot logged, but durable storage failed. Empty response body; do not automatically resubmit."},"204":{"description":"Ballot stored. Empty response body."},"400":{"description":"Malformed JSON or invalid vote. Codes: INVALID_JSON, INVALID_VOTE.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"A browser is required. Code: BROWSER_REQUIRED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"405":{"description":"The method is not supported.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Allow":{"schema":{"type":"string"},"description":"Supported HTTP methods."}}},"429":{"description":"Vote rate limit reached. Codes: VOTE_TOO_FAST, DAILY_LIMIT_REACHED.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"3 seconds for VOTE_TOO_FAST. Omitted for the daily limit; wait for the next UTC day.","schema":{"type":"string"}}}}}}}},"components":{"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string","description":"Legacy alias of message, retained for compatibility."},"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"}},"required":["error","code","message","hint"]},"Vote":{"type":"object","properties":{"promptId":{"type":"string","pattern":"^P\\d{2}$","description":"Benchmark prompt ID used by the displayed matchup, for example P01."},"left":{"type":"string","enum":["3d-agent","gpt-6-astra","claude-fable-5-1","claude-opus-5","gpt-5-6-sol","grok-4-6","claude-fable"]},"right":{"type":"string","enum":["3d-agent","gpt-6-astra","claude-fable-5-1","claude-opus-5","gpt-5-6-sol","grok-4-6","claude-fable"],"description":"Must differ from left."},"ballot":{"type":"string","enum":["left","right","tie","both_bad"]}},"required":["promptId","left","right","ballot"]},"Standing":{"type":"object","properties":{"competitor":{"type":"string"},"label":{"type":"string"},"tool":{"type":"string"},"rating":{"type":"number"},"rd":{"type":"number"},"conservative":{"type":"number"},"confidence":{"type":"number","minimum":0,"maximum":100},"tier":{"type":"string","enum":["Calibrating","Provisional","Stable"]},"rank":{"type":["integer","null"],"minimum":1},"wins":{"type":"integer","minimum":0},"losses":{"type":"integer","minimum":0},"draws":{"type":"integer","minimum":0},"bothBad":{"type":"integer","minimum":0},"decisiveVotes":{"type":"integer","minimum":0},"totalVotes":{"type":"integer","minimum":0},"promptCoverage":{"type":"number","minimum":0,"maximum":1},"votesToRank":{"type":"integer","minimum":0,"description":"Present for live standings; omitted from the frozen Season 1 snapshot."}},"required":["competitor","label","tool","rating","rd","conservative","confidence","tier","rank","wins","losses","draws","bothBad","decisiveVotes","totalVotes","promptCoverage"]},"PromptResult":{"type":"object","properties":{"promptId":{"type":"string"},"ballots":{"type":"integer","minimum":0},"bothBad":{"type":"integer","minimum":0},"wins":{"type":"array","items":{"type":"object","properties":{"competitor":{"type":"string"},"label":{"type":"string"},"wins":{"type":"integer","minimum":0},"losses":{"type":"integer","minimum":0}},"required":["competitor","label","wins","losses"]}}},"required":["promptId","ballots","bothBad","wins"]},"Standings":{"type":"object","properties":{"season":{"type":"integer"},"seasonStatus":{"type":"string","enum":["live","final"]},"seasonClosedAt":{"type":["string","null"],"description":"Closing date or timestamp, or null for a live season."},"promptSetVersion":{"type":"string"},"license":{"const":"CC BY 4.0"},"source":{"type":"string","format":"uri"},"placings":{"type":"array","items":{"type":"object","properties":{"placing":{"type":"string"},"technicalDraw":{"type":"boolean"},"competitors":{"type":"array","items":{"type":"string"}}},"required":["placing","technicalDraw","competitors"]}},"standings":{"type":"array","items":{"$ref":"#/components/schemas/Standing"}},"byPrompt":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/PromptResult"}},"totalBallots":{"type":"integer","minimum":0},"countedBallots":{"type":"integer","minimum":0},"duplicateBallots":{"type":"integer","minimum":0},"bothBadBallots":{"type":"integer","minimum":0},"lastVoteAt":{"type":["integer","null"],"description":"Unix time in milliseconds."},"truncated":{"type":"boolean"},"computedAt":{"type":["integer","null"],"description":"Unix time in milliseconds. The legacy Season 1 snapshot currently serializes this field as null."}},"required":["season","seasonStatus","seasonClosedAt","promptSetVersion","license","source","placings","standings","byPrompt","totalBallots","countedBallots","duplicateBallots","bothBadBallots","lastVoteAt","truncated","computedAt"]}}}}