{"openapi":"3.1.0","info":{"title":"closet.lat","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Home","operationId":"home__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/swipe":{"get":{"summary":"Swipe Page","operationId":"swipe_page_swipe_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Swipe Action","operationId":"swipe_action_swipe_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_swipe_action_swipe_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/armario":{"get":{"summary":"Armario Page","description":"Catálogo del armario. Acepta `?formality=N` y `?layer=X` como\npre-filtros sugeridos desde otras páginas (ej. /likes con avg formality).\nEl frontend respeta estos hints aplicando los pills correspondientes.","operationId":"armario_page_armario_get","parameters":[{"name":"formality","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Formality"}},{"name":"layer","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Layer"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/armario/toggle":{"post":{"summary":"Armario Toggle","operationId":"armario_toggle_armario_toggle_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_armario_toggle_armario_toggle_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/outfits":{"get":{"summary":"Outfits Page","operationId":"outfits_page_outfits_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/grid":{"get":{"summary":"Grid Page","operationId":"grid_page_grid_get","parameters":[{"name":"vibe","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vibe"}},{"name":"formality","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Formality"}},{"name":"season","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Season"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":60,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/likes":{"get":{"summary":"Likes Page","operationId":"likes_page_likes_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/v1/like/toggle":{"post":{"summary":"Like Toggle","description":"Tag-style like toggle used by grid view. Distinct from /swipe which\nrecords ordered Tinder-style actions. This one is idempotent per (sid,look).","operationId":"like_toggle_v1_like_toggle_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_like_toggle_v1_like_toggle_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/likes":{"get":{"summary":"V1 My Likes","operationId":"v1_my_likes_v1_me_likes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/looks/{look_id}/flag":{"post":{"summary":"Flag Look","description":"User reports that this cover photo doesn't match the outfit it's shown\nwith. Effects:\n- immediate hide for this session (session filter in all queries)\n- global demotion via flag_count (recommender deprioritizes)\n- at flag_count >= AUTO_HIDE_THRESHOLD the look is hidden entirely and\n  surfaced in /admin/flags for moderator decision.","operationId":"flag_look_v1_looks__look_id__flag_post","parameters":[{"name":"look_id","in":"path","required":true,"schema":{"type":"integer","title":"Look Id"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_flag_look_v1_looks__look_id__flag_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me/flagged":{"get":{"summary":"My Flagged Ids","description":"IDs this session has flagged — used client-side to filter lists.","operationId":"my_flagged_ids_v1_me_flagged_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/flags":{"get":{"summary":"Admin Flags Page","operationId":"admin_flags_page_admin_flags_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/flags/{look_id}/action":{"post":{"summary":"Admin Flag Action","operationId":"admin_flag_action_admin_flags__look_id__action_post","parameters":[{"name":"look_id","in":"path","required":true,"schema":{"type":"integer","title":"Look Id"}}],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_admin_flag_action_admin_flags__look_id__action_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/more-like-this":{"get":{"summary":"V1 More Like This","description":"Simple tag-based recommender: score unseen looks by vibe match +\nformality proximity + season match against the user's liked set. Honest,\nno ML, reproducible. Returns ranked looks.","operationId":"v1_more_like_this_v1_more_like_this_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":24,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/types":{"get":{"summary":"List Types","operationId":"list_types_v1_types_get","parameters":[{"name":"layer","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Layer"}},{"name":"formality","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Formality"}},{"name":"locale","in":"query","required":false,"schema":{"type":"string","default":"es","title":"Locale"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/looks":{"get":{"summary":"List Looks","operationId":"list_looks_v1_looks_get","parameters":[{"name":"formality","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Formality"}},{"name":"vibe","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vibe"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/recommend":{"get":{"summary":"Recommend","operationId":"recommend_v1_recommend_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":12,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/export":{"get":{"summary":"Export User Data","description":"Anti-Thread/Polyvore lock-in: el user puede exportar TODO su data.","operationId":"export_user_data_v1_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/stats-live":{"get":{"summary":"Stats Live","description":"Live numbers for the welcome popup: launched_at, last_update_at,\ntoday's unique visitors, countries touched, prendas added, likes given.","operationId":"stats_live_v1_stats_live_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/sitemap.xml":{"get":{"summary":"Sitemap","operationId":"sitemap_sitemap_xml_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/manifest.json":{"get":{"summary":"Manifest","operationId":"manifest_manifest_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/health":{"get":{"summary":"Health V1","description":"Health enriquecido — usado por hub tile + smoke tests.","operationId":"health_v1_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/llms.txt":{"get":{"summary":"Llms","operationId":"llms_llms_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/ceiba.json":{"get":{"summary":"Ceiba Manifest","operationId":"ceiba_manifest_ceiba_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/robots.txt":{"get":{"summary":"Robots","operationId":"robots_robots_txt_get","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"Body_admin_flag_action_admin_flags__look_id__action_post":{"properties":{"action":{"type":"string","title":"Action"},"token":{"type":"string","title":"Token","default":""}},"type":"object","required":["action"],"title":"Body_admin_flag_action_admin_flags__look_id__action_post"},"Body_armario_toggle_armario_toggle_post":{"properties":{"prenda_tipo_id":{"type":"integer","title":"Prenda Tipo Id"}},"type":"object","required":["prenda_tipo_id"],"title":"Body_armario_toggle_armario_toggle_post"},"Body_flag_look_v1_looks__look_id__flag_post":{"properties":{"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"Body_flag_look_v1_looks__look_id__flag_post"},"Body_like_toggle_v1_like_toggle_post":{"properties":{"look_id":{"type":"integer","title":"Look Id"}},"type":"object","required":["look_id"],"title":"Body_like_toggle_v1_like_toggle_post"},"Body_swipe_action_swipe_post":{"properties":{"look_id":{"type":"integer","title":"Look Id"},"action":{"type":"string","title":"Action"}},"type":"object","required":["look_id","action"],"title":"Body_swipe_action_swipe_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"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"}}}}