{"openapi":"3.1.0","info":{"title":"paper-server","description":"CS citation sanitizer backed by DBLP + pgvector + EmbeddingGemma.","version":"0.1.0"},"paths":{"/api/health":{"get":{"summary":"Health","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Api Health Get"}}}}}}},"/api/meta":{"get":{"summary":"Meta","description":"Lightweight metadata for the frontend: paper count + DBLP version.","operationId":"meta_api_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Meta Api Meta Get"}}}}}}},"/api/search":{"post":{"summary":"Search Endpoint","operationId":"search_endpoint_api_search_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sanitize":{"post":{"summary":"Sanitize Endpoint","operationId":"sanitize_endpoint_api_sanitize_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SanitizeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SanitizeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sanitize-bibtex":{"post":{"summary":"Sanitize Bibtex Endpoint","description":"Parse raw BibTeX, look up the best DBLP match per entry, return diffs.","operationId":"sanitize_bibtex_endpoint_api_sanitize_bibtex_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BibtexSanitizeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BibtexSanitizeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/papers/{dblp_key}/bibtex":{"get":{"summary":"Paper Bibtex","operationId":"paper_bibtex_api_papers__dblp_key__bibtex_get","parameters":[{"name":"dblp_key","in":"path","required":true,"schema":{"type":"string","title":"Dblp Key"}}],"responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feedback":{"post":{"summary":"Feedback Endpoint","operationId":"feedback_endpoint_api_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stats":{"get":{"summary":"Stats Endpoint","operationId":"stats_endpoint_api_stats_get","parameters":[{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Stats Endpoint Api Stats Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stats/feedback/{feedback_id}":{"patch":{"summary":"Update Feedback Status","operationId":"update_feedback_status_api_stats_feedback__feedback_id__patch","parameters":[{"name":"feedback_id","in":"path","required":true,"schema":{"type":"integer","title":"Feedback Id"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackStatusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Update Feedback Status Api Stats Feedback  Feedback Id  Patch"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stats/blocked-ips/{ip_hash}":{"delete":{"summary":"Unblock Ip","operationId":"unblock_ip_api_stats_blocked_ips__ip_hash__delete","parameters":[{"name":"ip_hash","in":"path","required":true,"schema":{"type":"string","title":"Ip Hash"}},{"name":"X-Admin-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Admin-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Unblock Ip Api Stats Blocked Ips  Ip Hash  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Index","operationId":"index__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"BibtexEntryResult":{"properties":{"original_text":{"type":"string","title":"Original Text"},"original_fields":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object","title":"Original Fields"},"match":{"anyOf":[{"$ref":"#/components/schemas/SearchHitOut"},{"type":"null"}]},"corrected_fields":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object","title":"Corrected Fields"},"field_diffs":{"items":{"$ref":"#/components/schemas/FieldDiffOut"},"type":"array","title":"Field Diffs"},"candidates":{"items":{"$ref":"#/components/schemas/SearchHitOut"},"type":"array","title":"Candidates","default":[]},"status":{"type":"string","title":"Status","default":"no_match"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["original_text","original_fields","match","corrected_fields","field_diffs"],"title":"BibtexEntryResult"},"BibtexSanitizeRequest":{"properties":{"bibtex":{"type":"string","maxLength":200000,"minLength":1,"title":"Bibtex"},"regularize_keys":{"type":"boolean","title":"Regularize Keys","default":true}},"type":"object","required":["bibtex"],"title":"BibtexSanitizeRequest"},"BibtexSanitizeResponse":{"properties":{"entries":{"items":{"$ref":"#/components/schemas/BibtexEntryResult"},"type":"array","title":"Entries"},"bibtex":{"type":"string","title":"Bibtex"}},"type":"object","required":["entries","bibtex"],"title":"BibtexSanitizeResponse"},"FeedbackRequest":{"properties":{"category":{"type":"string","maxLength":32,"minLength":1,"title":"Category"},"message":{"type":"string","maxLength":4000,"minLength":1,"title":"Message"},"contact":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Contact"},"page":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Page"}},"type":"object","required":["category","message"],"title":"FeedbackRequest"},"FeedbackResponse":{"properties":{"id":{"type":"integer","title":"Id"},"status":{"type":"string","title":"Status","default":"received"}},"type":"object","required":["id"],"title":"FeedbackResponse"},"FeedbackStatusUpdate":{"properties":{"status":{"type":"string","pattern":"^(new|triaged|closed)$","title":"Status"}},"type":"object","required":["status"],"title":"FeedbackStatusUpdate"},"FieldDiffOut":{"properties":{"field":{"type":"string","title":"Field"},"original":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Original"},"corrected":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Corrected"},"status":{"type":"string","title":"Status"}},"type":"object","required":["field","original","corrected","status"],"title":"FieldDiffOut"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"SanitizeItem":{"properties":{"title":{"type":"string","maxLength":2000,"minLength":1,"title":"Title"},"authors":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":50},{"type":"null"}],"title":"Authors"},"venue":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Venue"},"year":{"anyOf":[{"type":"integer","maximum":2100.0,"minimum":1900.0},{"type":"null"}],"title":"Year"}},"type":"object","required":["title"],"title":"SanitizeItem"},"SanitizeRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SanitizeItem"},"type":"array","maxItems":200,"minItems":1,"title":"Items"},"limit_per_item":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Limit Per Item","default":3}},"type":"object","required":["items"],"title":"SanitizeRequest"},"SanitizeResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/SanitizeResult"},"type":"array","title":"Results"},"bibtex":{"type":"string","title":"Bibtex"}},"type":"object","required":["results","bibtex"],"title":"SanitizeResponse"},"SanitizeResult":{"properties":{"input":{"$ref":"#/components/schemas/SanitizeItem"},"best":{"anyOf":[{"$ref":"#/components/schemas/SearchHitOut"},{"type":"null"}]},"candidates":{"items":{"$ref":"#/components/schemas/SearchHitOut"},"type":"array","title":"Candidates"},"status":{"type":"string","title":"Status","default":"no_match"}},"type":"object","required":["input","best","candidates"],"title":"SanitizeResult"},"SearchHitOut":{"properties":{"dblp_key":{"type":"string","title":"Dblp Key"},"entry_type":{"type":"string","title":"Entry Type"},"title":{"type":"string","title":"Title"},"authors":{"items":{"type":"string"},"type":"array","title":"Authors"},"editors":{"items":{"type":"string"},"type":"array","title":"Editors"},"year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Year"},"venue":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue"},"venue_acronym":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Venue Acronym"},"score":{"type":"number","title":"Score"},"vector_score":{"type":"number","title":"Vector Score"},"title_score":{"type":"number","title":"Title Score"},"fts_score":{"type":"number","title":"Fts Score","default":0.0},"phrase_score":{"type":"number","title":"Phrase Score","default":0.0},"overlap_score":{"type":"number","title":"Overlap Score","default":0.0},"concentration_score":{"type":"number","title":"Concentration Score","default":0.0},"verifiable":{"type":"boolean","title":"Verifiable","default":false},"bibtex":{"type":"string","title":"Bibtex"}},"type":"object","required":["dblp_key","entry_type","title","authors","editors","year","venue","venue_acronym","score","vector_score","title_score","bibtex"],"title":"SearchHitOut"},"SearchRequest":{"properties":{"title":{"type":"string","maxLength":2000,"minLength":1,"title":"Title"},"authors":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":50},{"type":"null"}],"title":"Authors"},"venue":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Venue"},"year":{"anyOf":[{"type":"integer","maximum":2100.0,"minimum":1900.0},{"type":"null"}],"title":"Year"},"limit":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Limit","default":10}},"type":"object","required":["title"],"title":"SearchRequest"},"SearchResponse":{"properties":{"query":{"$ref":"#/components/schemas/SearchRequest"},"hits":{"items":{"$ref":"#/components/schemas/SearchHitOut"},"type":"array","title":"Hits"}},"type":"object","required":["query","hits"],"title":"SearchResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}