{"openapi":"3.1.1","info":{"title":"CurateGrid API","version":"2026-10-13","description":"Live, unversioned read API. Tokens bind one workspace and explicit abilities. Current user\/project permissions apply on every request. 120 requests\/minute per authenticated user. No upload, voting or administrative mutation endpoints are advertised by this contract."},"servers":[{"url":"\/api"}],"paths":{"\/projects":{"get":{"operationId":"curator.projects","summary":"List accessible projects in the token workspace.","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100000}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}}],"security":[{"bearerAuth":[]}],"x-required-ability":"projects:read","responses":{"200":{"description":"Successful, private response.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ProjectPage"}}}},"401":{"description":"Missing, invalid or expired bearer token.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"Scope or current access denied.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"Resource is not available in this workspace\/project.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Invalid pagination.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"429":{"description":"Request limit reached. Respect Retry-After.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/projects\/{project}":{"get":{"operationId":"curator.project","summary":"Read an accessible project.","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"security":[{"bearerAuth":[]}],"x-required-ability":"projects:read","responses":{"200":{"description":"Successful, private response.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ProjectResponse"}}}},"401":{"description":"Missing, invalid or expired bearer token.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"Scope or current access denied.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"Resource is not available in this workspace\/project.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Invalid pagination.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"429":{"description":"Request limit reached. Respect Retry-After.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/projects\/{project}\/items":{"get":{"operationId":"curator.items","summary":"List current resources without private paths or capture metadata.","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100000}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}}],"security":[{"bearerAuth":[]}],"x-required-ability":"resources:read","responses":{"200":{"description":"Successful, private response.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ResourcePage"}}}},"401":{"description":"Missing, invalid or expired bearer token.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"Scope or current access denied.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"Resource is not available in this workspace\/project.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Invalid pagination.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"429":{"description":"Request limit reached. Respect Retry-After.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/projects\/{project}\/items\/{item}":{"get":{"operationId":"curator.item","summary":"Read a resource belonging to the specified project.","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"item","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"security":[{"bearerAuth":[]}],"x-required-ability":"resources:read","responses":{"200":{"description":"Successful, private response.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ResourceResponse"}}}},"401":{"description":"Missing, invalid or expired bearer token.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"Scope or current access denied.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"Resource is not available in this workspace\/project.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Invalid pagination.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"429":{"description":"Request limit reached. Respect Retry-After.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}},"\/projects\/{project}\/results":{"get":{"operationId":"curator.results","summary":"Read the canonical active-round ranking; blind results remain forbidden.","parameters":[{"name":"project","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100000}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100}}],"security":[{"bearerAuth":[]}],"x-required-ability":"results:read","responses":{"200":{"description":"Successful, private response.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ResultsPage"}}}},"401":{"description":"Missing, invalid or expired bearer token.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"403":{"description":"Scope or current access denied.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"404":{"description":"Resource is not available in this workspace\/project.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"422":{"description":"Invalid pagination.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}},"429":{"description":"Request limit reached. Respect Retry-After.","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/Error"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"A workspace-bound Sanctum token issued in the authenticated developer panel."}},"schemas":{"Project":{"type":"object","required":["id","name","slug","type","status","description","active_round_id","created_at","updated_at"],"properties":{"id":{"type":"integer","minimum":1},"name":{"type":"string"},"slug":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"description":{"type":["string","null"]},"active_round_id":{"type":["integer","null"]},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"Resource":{"type":"object","required":["id","project_id","type","filename","version_id","version_sequence","size_bytes","quarantined","metadata_visible","decision"],"properties":{"id":{"type":"integer","minimum":1},"project_id":{"type":"integer","minimum":1},"type":{"type":"string"},"filename":{"type":["string","null"]},"version_id":{"type":"integer","minimum":1},"version_sequence":{"type":"integer","minimum":1},"size_bytes":{"type":"integer","minimum":0},"quarantined":{"type":"boolean"},"metadata_visible":{"type":"boolean"},"decision":{"type":["string","null"],"enum":["pending","selected","rejected",null]}}},"ResultResource":{"type":"object","required":["id","project_id","type","filename","version_id","version_sequence","size_bytes","quarantined","metadata_visible","decision","votes","raw_average","bayesian_average","estimate","below_quorum"],"properties":{"id":{"type":"integer","minimum":1},"project_id":{"type":"integer","minimum":1},"type":{"type":"string"},"filename":{"type":["string","null"]},"version_id":{"type":"integer","minimum":1},"version_sequence":{"type":"integer","minimum":1},"size_bytes":{"type":"integer","minimum":0},"quarantined":{"type":"boolean"},"metadata_visible":{"type":"boolean"},"decision":{"type":["string","null"],"enum":["pending","selected","rejected",null]},"votes":{"type":"integer","minimum":0},"raw_average":{"type":["number","null"]},"bayesian_average":{"type":"number"},"estimate":{"type":["object","null"]},"below_quorum":{"type":"boolean"}}},"Pagination":{"type":"object","required":["page","per_page","total","last_page"],"properties":{"page":{"type":"integer","minimum":1},"per_page":{"type":"integer","minimum":1,"maximum":100},"total":{"type":"integer","minimum":0},"last_page":{"type":"integer","minimum":1}}},"ProjectResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#\/components\/schemas\/Project"}}},"ResourceResponse":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#\/components\/schemas\/Resource"}}},"ProjectPage":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/Project"}},"meta":{"$ref":"#\/components\/schemas\/Pagination"}}},"ResourcePage":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/Resource"}},"meta":{"$ref":"#\/components\/schemas\/Pagination"}}},"ResultsPage":{"type":"object","required":["data","meta","analysis","summary"],"properties":{"data":{"type":"array","items":{"$ref":"#\/components\/schemas\/ResultResource"}},"meta":{"$ref":"#\/components\/schemas\/Pagination"},"analysis":{"type":"object","required":["method","round_id","generated_at","total_votes","minimum_votes"],"properties":{"method":{"type":"string"},"round_id":{"type":["integer","null"]},"generated_at":{"type":"string","format":"date-time"},"total_votes":{"type":"integer","minimum":0},"minimum_votes":{"type":"integer","minimum":1},"snapshot_sha256":{"type":["string","null"]}}},"summary":{"type":"object","required":["total_items","rated_items","total_ratings","average","completion_percent","collaborators","selected","distribution"],"properties":{"total_items":{"type":"integer","minimum":0},"rated_items":{"type":"integer","minimum":0},"total_ratings":{"type":"integer","minimum":0},"average":{"type":"number"},"completion_percent":{"type":"integer","minimum":0,"maximum":100},"collaborators":{"type":"integer","minimum":0},"selected":{"type":"integer","minimum":0},"distribution":{"type":"object","additionalProperties":{"type":"integer","minimum":0}}}}}},"Error":{"type":"object","required":["message"],"properties":{"message":{"type":"string"},"errors":{"type":"object"}}}}}}