{"openapi":"3.1.0","info":{"title":"Find My Pack API","description":"Student-profile-first club matching for NC State.","version":"0.1.0"},"paths":{"/health":{"get":{"tags":["health"],"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/match":{"post":{"tags":["match"],"summary":"Match","description":"Turn a free-text student message into a structured profile plus a\nranked list of clubs. The top `explain_count` matches also come\nback with a short human `why` / `consider`.\n\nWorks without auth. If the caller is signed in, the extracted\nprofile is saved to their account (best effort).","operationId":"match_match_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/clubs":{"get":{"tags":["clubs"],"summary":"List Clubs","operationId":"list_clubs_clubs_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"description":"case-insensitive name search","title":"Q"},"description":"case-insensitive name search"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clubs/{club_id}":{"get":{"tags":["clubs"],"summary":"Get Club","operationId":"get_club_clubs__club_id__get","parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"string","title":"Club Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClubSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/me":{"get":{"tags":["me"],"summary":"Get Me","operationId":"get_me_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeProfile"}}}}},"security":[{"HTTPBearer":[]}]}},"/me/clubs":{"get":{"tags":["me"],"summary":"List Saved Clubs","operationId":"list_saved_clubs_me_clubs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedClubList"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["me"],"summary":"Save Club","operationId":"save_club_me_clubs_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveClubRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SavedClub"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/me/clubs/{club_id}":{"delete":{"tags":["me"],"summary":"Unsave Club","operationId":"unsave_club_me_clubs__club_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"club_id","in":"path","required":true,"schema":{"type":"string","title":"Club Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ClubListResponse":{"properties":{"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"clubs":{"items":{"$ref":"#/components/schemas/ClubSummary"},"type":"array","title":"Clubs"}},"type":"object","required":["total","limit","offset","clubs"],"title":"ClubListResponse"},"ClubMatch":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","default":[]},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"social_links":{"items":{"type":"string"},"type":"array","title":"Social Links","default":[]},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"meeting_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meeting Style"},"similarity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Similarity"},"display_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Display Score"},"why":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Why"},"consider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Consider"}},"type":"object","required":["id","name"],"title":"ClubMatch"},"ClubSummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","default":[]},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"social_links":{"items":{"type":"string"},"type":"array","title":"Social Links","default":[]},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"meeting_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meeting Style"}},"type":"object","required":["id","name"],"title":"ClubSummary"},"ComponentHealth":{"properties":{"ok":{"type":"boolean","title":"Ok"},"detail":{"type":"string","title":"Detail"}},"type":"object","required":["ok","detail"],"title":"ComponentHealth"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status"},"database":{"$ref":"#/components/schemas/ComponentHealth"},"ollama":{"$ref":"#/components/schemas/ComponentHealth"}},"type":"object","required":["status","database","ollama"],"title":"HealthResponse"},"MatchRequest":{"properties":{"message":{"type":"string","maxLength":4000,"minLength":1,"title":"Message"},"limit":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Limit","default":10},"explain_count":{"type":"integer","maximum":10.0,"minimum":0.0,"title":"Explain Count","default":3}},"type":"object","required":["message"],"title":"MatchRequest"},"MatchResponse":{"properties":{"profile":{"$ref":"#/components/schemas/StudentProfile"},"matches":{"items":{"$ref":"#/components/schemas/ClubMatch"},"type":"array","title":"Matches"}},"type":"object","required":["profile","matches"],"title":"MatchResponse"},"MeProfile":{"properties":{"id":{"type":"string","title":"Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"latest_profile":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Latest Profile"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id"],"title":"MeProfile"},"SaveClubRequest":{"properties":{"club_id":{"type":"string","minLength":1,"title":"Club Id"},"status":{"type":"string","enum":["interested","joined"],"title":"Status","default":"interested"}},"type":"object","required":["club_id"],"title":"SaveClubRequest"},"SavedClub":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","default":[]},"website":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"social_links":{"items":{"type":"string"},"type":"array","title":"Social Links","default":[]},"source_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Url"},"meeting_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meeting Style"},"status":{"type":"string","enum":["interested","joined"],"title":"Status","default":"interested"},"saved_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Saved At"}},"type":"object","required":["id","name"],"title":"SavedClub"},"SavedClubList":{"properties":{"clubs":{"items":{"$ref":"#/components/schemas/SavedClub"},"type":"array","title":"Clubs"}},"type":"object","required":["clubs"],"title":"SavedClubList"},"StudentProfile":{"properties":{"interests":{"items":{"type":"string"},"type":"array","title":"Interests","default":[]},"goals":{"items":{"type":"string"},"type":"array","title":"Goals","default":[]},"skills":{"items":{"type":"string"},"type":"array","title":"Skills","default":[]},"preferences":{"items":{"type":"string"},"type":"array","title":"Preferences","default":[]},"experience_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Experience Level"},"social_preferences":{"items":{"type":"string"},"type":"array","title":"Social Preferences","default":[]},"career_interests":{"items":{"type":"string"},"type":"array","title":"Career Interests","default":[]}},"type":"object","title":"StudentProfile"},"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"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}