{"openapi":"3.1.0","info":{"title":"Scarlet Sync Public Rutgers API","version":"1.0.0","description":"Read-only, source-provenanced Rutgers public data. Student records are excluded and remain behind OAuth."},"servers":[{"url":"https://scarletsync.app"}],"paths":{"/api/v1/public/rutgers/search":{"get":{"summary":"Search normalized public Rutgers knowledge","security":[{"DeveloperApiKey":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2}},{"name":"kinds","in":"query","schema":{"type":"string","description":"Comma-separated guide","course":null,"professor":null,"or place values":null}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":20,"default":10}}],"responses":{"200":{"description":"Source-provenanced results with canonical citation URLs and freshness disclosures"},"401":{"$ref":"#/components/responses/Problem"},"429":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/developer/keys":{"get":{"summary":"List the signed-in user's API keys without secrets","security":[{"SupabaseBearer":[]}],"responses":{"200":{"description":"Key metadata"}}},"post":{"summary":"Create a scoped API key; plaintext is returned exactly once","security":[{"SupabaseBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":1,"maxLength":80},"expiresAt":{"type":"string","format":"date-time"}}}}}},"responses":{"201":{"description":"New key metadata and one-time secret"}}}},"/api/v1/developer/keys/{keyId}":{"delete":{"summary":"Revoke an owned key","security":[{"SupabaseBearer":[]}],"parameters":[{"name":"keyId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Revocation confirmation"},"404":{"$ref":"#/components/responses/Problem"}}}},"/api/v1/developer/keys/{keyId}/rotate":{"post":{"summary":"Atomically replace an owned key and reveal the replacement once","security":[{"SupabaseBearer":[]}],"parameters":[{"name":"keyId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"201":{"description":"Replacement key and one-time secret"},"404":{"$ref":"#/components/responses/Problem"}}}}},"components":{"securitySchemes":{"DeveloperApiKey":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Scoped to rutgers.public.read"},"SupabaseBearer":{"type":"http","scheme":"bearer","bearerFormat":"Supabase access token"}},"responses":{"Problem":{"description":"RFC 9457-style problem document","content":{"application/problem+json":{"schema":{"type":"object"}}}}}}}