{"openapi":"3.1.0","info":{"title":"FasoData API","description":"Plateforme de données ouvertes pour le Burkina Faso","version":"1.0.0"},"paths":{"/api/metrics":{"get":{"summary":"Metrics","description":"Endpoint that serves Prometheus metrics.","operationId":"metrics_api_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/register":{"post":{"tags":["auth"],"summary":"Register","operationId":"register_api_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"tags":["auth"],"summary":"Login","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_api_auth_login_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh Token","operationId":"refresh_token_api_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me":{"get":{"tags":["auth"],"summary":"Me","operationId":"me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/users":{"get":{"tags":["users"],"summary":"List Users","operationId":"list_users_api_users_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOutList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/me":{"get":{"tags":["users"],"summary":"Get Me","operationId":"get_me_api_users_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"patch":{"tags":["users"],"summary":"Update Me","operationId":"update_me_api_users_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/users/me/avatar":{"post":{"tags":["users"],"summary":"Upload Avatar","description":"Upload d'une photo de profil — stockée dans MinIO.","operationId":"upload_avatar_api_users_me_avatar_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_avatar_api_users_me_avatar_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/users/me/avatar/{filename}":{"get":{"tags":["users"],"summary":"Serve Avatar","description":"Proxy de l'avatar depuis MinIO (URL signée 1h).","operationId":"serve_avatar_api_users_me_avatar__filename__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/me/submissions":{"get":{"tags":["users"],"summary":"My Submissions","description":"Historique des relevés de prix soumis par l'utilisateur courant.\nCherche par : reporter = email OU reporter = user_id (terrain web).","operationId":"my_submissions_api_users_me_submissions_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/{user_id}":{"get":{"tags":["users"],"summary":"Get User","operationId":"get_user_api_users__user_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["users"],"summary":"Admin Update User","operationId":"admin_update_user_api_users__user_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAdminUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["users"],"summary":"Delete User","operationId":"delete_user_api_users__user_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datasets":{"get":{"tags":["datasets"],"summary":"List Datasets","operationId":"list_datasets_api_datasets_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/DatasetStatus"},{"type":"null"}],"default":"published","title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["datasets"],"summary":"Create Dataset","operationId":"create_dataset_api_datasets_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datasets/my":{"get":{"tags":["datasets"],"summary":"My Datasets","description":"Retourne les datasets de l'utilisateur connecté (tous statuts).","operationId":"my_datasets_api_datasets_my_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/DatasetStatus"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datasets/admin-list":{"get":{"tags":["datasets"],"summary":"Admin List Datasets","description":"Liste tous les datasets (tous statuts) — réservé admin.","operationId":"admin_list_datasets_api_datasets_admin_list_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/DatasetStatus"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetListOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datasets/{slug}":{"get":{"tags":["datasets"],"summary":"Get Dataset","operationId":"get_dataset_api_datasets__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["datasets"],"summary":"Update Dataset","operationId":"update_dataset_api_datasets__slug__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["datasets"],"summary":"Delete Dataset","operationId":"delete_dataset_api_datasets__slug__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datasets/{slug}/preview":{"get":{"tags":["datasets"],"summary":"Preview Dataset","operationId":"preview_dataset_api_datasets__slug__preview_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetPreview"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datasets/{slug}/stats":{"get":{"tags":["datasets"],"summary":"Stats Dataset","operationId":"stats_dataset_api_datasets__slug__stats_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datasets/{slug}/download":{"get":{"tags":["datasets"],"summary":"Download Dataset","operationId":"download_dataset_api_datasets__slug__download_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datasets/{slug}/upload":{"post":{"tags":["datasets"],"summary":"Upload File","operationId":"upload_file_api_datasets__slug__upload_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_file_api_datasets__slug__upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJobOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datasets/{slug}/jobs":{"get":{"tags":["datasets"],"summary":"List Import Jobs","operationId":"list_import_jobs_api_datasets__slug__jobs_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ImportJobOut"},"title":"Response List Import Jobs Api Datasets  Slug  Jobs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/datasets/jobs/{job_id}":{"get":{"tags":["datasets"],"summary":"Get Job Status","operationId":"get_job_status_api_datasets_jobs__job_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportJobOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dashboard/food-prices":{"get":{"tags":["dashboard"],"summary":"Food Prices","operationId":"food_prices_api_dashboard_food_prices_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard/alerts":{"get":{"tags":["dashboard"],"summary":"Alerts","operationId":"alerts_api_dashboard_alerts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard/supervision":{"get":{"tags":["dashboard"],"summary":"Supervision","operationId":"supervision_api_dashboard_supervision_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard/validation":{"get":{"tags":["dashboard"],"summary":"Validation Quality","operationId":"validation_quality_api_dashboard_validation_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard/organizations":{"get":{"tags":["dashboard"],"summary":"Organizations","operationId":"organizations_api_dashboard_organizations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/dashboard/alert-rules":{"get":{"tags":["dashboard"],"summary":"List Alert Rules","operationId":"list_alert_rules_api_dashboard_alert_rules_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"metric_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AlertRuleOut"},"title":"Response List Alert Rules Api Dashboard Alert Rules Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["dashboard"],"summary":"Create Alert Rule","operationId":"create_alert_rule_api_dashboard_alert_rules_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertRuleCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertRuleOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dashboard/alert-rules/{rule_id}":{"patch":{"tags":["dashboard"],"summary":"Update Alert Rule","operationId":"update_alert_rule_api_dashboard_alert_rules__rule_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Rule Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertRuleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertRuleOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["dashboard"],"summary":"Delete Alert Rule","operationId":"delete_alert_rule_api_dashboard_alert_rules__rule_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"rule_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Rule Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dashboard/system-metrics":{"get":{"tags":["dashboard"],"summary":"List System Metrics","operationId":"list_system_metrics_api_dashboard_system_metrics_get","parameters":[{"name":"service","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Service"}},{"name":"metric_key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Key"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SystemMetricOut"},"title":"Response List System Metrics Api Dashboard System Metrics Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["dashboard"],"summary":"Create System Metric","operationId":"create_system_metric_api_dashboard_system_metrics_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemMetricCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemMetricOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dashboard/team-members":{"get":{"tags":["dashboard"],"summary":"List Team Members","operationId":"list_team_members_api_dashboard_team_members_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"organization","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TeamMemberOut"},"title":"Response List Team Members Api Dashboard Team Members Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["dashboard"],"summary":"Create Team Member","operationId":"create_team_member_api_dashboard_team_members_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamMemberCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamMemberOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dashboard/team-members/{member_id}":{"patch":{"tags":["dashboard"],"summary":"Update Team Member","operationId":"update_team_member_api_dashboard_team_members__member_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamMemberUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamMemberOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["dashboard"],"summary":"Delete Team Member","operationId":"delete_team_member_api_dashboard_team_members__member_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"member_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Member Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dashboard/quality-checks":{"get":{"tags":["dashboard"],"summary":"List Quality Checks","operationId":"list_quality_checks_api_dashboard_quality_checks_get","parameters":[{"name":"dataset_slug","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dataset Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/QualityCheckOut"},"title":"Response List Quality Checks Api Dashboard Quality Checks Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["dashboard"],"summary":"Create Quality Check","operationId":"create_quality_check_api_dashboard_quality_checks_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualityCheckCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualityCheckOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dashboard/quality-checks/{check_id}":{"get":{"tags":["dashboard"],"summary":"Get Quality Check","operationId":"get_quality_check_api_dashboard_quality_checks__check_id__get","parameters":[{"name":"check_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Check Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualityCheckOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["dashboard"],"summary":"Update Quality Check","operationId":"update_quality_check_api_dashboard_quality_checks__check_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"check_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Check Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualityCheckUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualityCheckOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dashboard/quality-checks/{check_id}/publish":{"post":{"tags":["dashboard"],"summary":"Publish Quality Check","operationId":"publish_quality_check_api_dashboard_quality_checks__check_id__publish_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"check_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Check Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualityCheckOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dashboard/quality-issues/{issue_id}/resolve":{"patch":{"tags":["dashboard"],"summary":"Resolve Quality Issue","operationId":"resolve_quality_issue_api_dashboard_quality_issues__issue_id__resolve_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"issue_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Issue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualityIssueOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dashboard/quality-issues/{issue_id}/apply-suggestion":{"patch":{"tags":["dashboard"],"summary":"Apply Quality Issue Suggestion","operationId":"apply_quality_issue_suggestion_api_dashboard_quality_issues__issue_id__apply_suggestion_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"issue_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Issue Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualityIssueOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dashboard/quality-issues/{issue_id}/correct":{"patch":{"tags":["dashboard"],"summary":"Correct Quality Issue","operationId":"correct_quality_issue_api_dashboard_quality_issues__issue_id__correct_patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"issue_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Issue Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualityIssueCorrection"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualityIssueOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/search":{"get":{"tags":["search"],"summary":"Search","operationId":"search_api_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Q"}},{"name":"dataset_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dataset Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/geo/{dataset_id}/bbox":{"get":{"tags":["geo"],"summary":"Geo Bbox","operationId":"geo_bbox_api_geo__dataset_id__bbox_get","parameters":[{"name":"dataset_id","in":"path","required":true,"schema":{"type":"string","title":"Dataset Id"}},{"name":"minx","in":"query","required":true,"schema":{"type":"number","title":"Minx"}},{"name":"miny","in":"query","required":true,"schema":{"type":"number","title":"Miny"}},{"name":"maxx","in":"query","required":true,"schema":{"type":"number","title":"Maxx"}},{"name":"maxy","in":"query","required":true,"schema":{"type":"number","title":"Maxy"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"default":1000,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/geo/{dataset_id}/centroid":{"get":{"tags":["geo"],"summary":"Geo Centroid","operationId":"geo_centroid_api_geo__dataset_id__centroid_get","parameters":[{"name":"dataset_id","in":"path","required":true,"schema":{"type":"string","title":"Dataset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/subscribe":{"post":{"tags":["alerts"],"summary":"Subscribe","description":"S'abonner à une alerte prix.\nUn email de confirmation est envoyé (double opt-in RGPD).\nL'abonnement n'est actif qu'après confirmation.","operationId":"subscribe_api_alerts_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/confirm/{token}":{"get":{"tags":["alerts"],"summary":"Confirm Subscription","description":"Confirme l'abonnement via le lien envoyé par email.","operationId":"confirm_subscription_api_alerts_confirm__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","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"}}}}}}},"/api/alerts/unsubscribe/{token}":{"get":{"tags":["alerts"],"summary":"Unsubscribe","description":"Désactive l'abonnement via le lien dans l'email.","operationId":"unsubscribe_api_alerts_unsubscribe__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","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"}}}}}}},"/api/alerts/status":{"get":{"tags":["alerts"],"summary":"Alert Status","description":"Statistiques globales des alertes (publiques).","operationId":"alert_status_api_alerts_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/alerts/subscriptions":{"get":{"tags":["alerts"],"summary":"List Subscriptions","description":"Liste des abonnements (admin).","operationId":"list_subscriptions_api_alerts_subscriptions_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Page Size"}},{"name":"active","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/subscriptions/{sub_id}":{"delete":{"tags":["alerts"],"summary":"Delete Subscription","description":"Supprimer un abonnement (admin).","operationId":"delete_subscription_api_alerts_subscriptions__sub_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Sub Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["alerts"],"summary":"Update Subscription","description":"Modifier un abonnement email (admin).","operationId":"update_subscription_api_alerts_subscriptions__sub_id__patch","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Sub Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscribeOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/alerts/trigger-check":{"post":{"tags":["alerts"],"summary":"Trigger Check","description":"Lancer manuellement la vérification des alertes (admin).","operationId":"trigger_check_api_alerts_trigger_check_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/prices/commodities":{"get":{"tags":["prices"],"summary":"List Commodities","description":"Liste les produits disponibles avec leur dernier prix.","operationId":"list_commodities_api_prices_commodities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/prices/latest":{"get":{"tags":["prices"],"summary":"Latest Prices","description":"Dernier prix de chaque produit pour une région.","operationId":"latest_prices_api_prices_latest_get","parameters":[{"name":"region","in":"query","required":false,"schema":{"type":"string","default":"National","title":"Region"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prices/series":{"get":{"tags":["prices"],"summary":"Price Series","description":"Retourne la série temporelle agrégée (moyenne mensuelle ou annuelle)\npour un produit et une région donnés.","operationId":"price_series_api_prices_series_get","parameters":[{"name":"commodity","in":"query","required":true,"schema":{"type":"string","description":"Ex: sorghum, rice_local","title":"Commodity"},"description":"Ex: sorghum, rice_local"},{"name":"region","in":"query","required":false,"schema":{"type":"string","default":"National","title":"Region"}},{"name":"granularity","in":"query","required":false,"schema":{"type":"string","pattern":"^(monthly|yearly)$","default":"monthly","title":"Granularity"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM","title":"Start"},"description":"YYYY-MM"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM","title":"End"},"description":"YYYY-MM"},{"name":"sources","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sources separees par virgule: wfp,sms,aggregated","title":"Sources"},"description":"Sources separees par virgule: wfp,sms,aggregated"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceSeries"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prices":{"get":{"tags":["prices"],"summary":"List Prices","description":"Liste paginée des relevés bruts.","operationId":"list_prices_api_prices_get","parameters":[{"name":"commodity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commodity"}},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Prices Api Prices Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["prices"],"summary":"Add Price","description":"Ajouter un relevé de prix (opérateur institutionnel).","operationId":"add_price_api_prices_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceDataCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PriceDataOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prices/ingest/sms":{"post":{"tags":["prices"],"summary":"Ingest Sms","description":"Point d'entrée pour les agrégateurs SMS (Africa's Talking, Twilio, etc.).\nLe message doit suivre le format : <PRODUIT> <REGION> <PRIX>\nEx: \"SORGHO SAHEL 285\"","operationId":"ingest_sms_api_prices_ingest_sms_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmsIngestPayload"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prices/ingest/whatsapp":{"post":{"tags":["prices"],"summary":"Ingest Whatsapp","description":"Point d'entrée WhatsApp Business API.\nMême format de message que SMS.","operationId":"ingest_whatsapp_api_prices_ingest_whatsapp_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhatsAppIngestPayload"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prices/sms/at-callback":{"post":{"tags":["prices"],"summary":"At Incoming Sms","description":"Webhook Africa's Talking — reçoit les SMS des enquêteurs terrain.\n\nAT envoie un POST form-urlencoded avec les champs :\n  - from   : numéro expéditeur (+22670XXXXXX)\n  - to     : votre numéro AT / shortcode\n  - text   : contenu du SMS\n  - date   : horodatage AT\n  - id     : identifiant unique du message\n\nFormat SMS attendu : <PRODUIT> <REGION> <PRIX>\nExemples : \"SORGHO SAHEL 285\" · \"RIZ BOBO 520\" · \"MAIS OUAGA 302\"\n\n⚙️ Configurer dans le portail AT :\n  Callback URL → https://votre-domaine.bf/api/prices/sms/at-callback","operationId":"at_incoming_sms_api_prices_sms_at_callback_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/prices/sms/status":{"get":{"tags":["prices"],"summary":"At Status","description":"Statut de la configuration Africa's Talking.","operationId":"at_status_api_prices_sms_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/prices/sms/send":{"post":{"tags":["prices"],"summary":"Send Test Sms","description":"Envoyer un SMS de test — réservé admin.","operationId":"send_test_sms_api_prices_sms_send_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendSmsRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/prices/sms/alert":{"post":{"tags":["prices"],"summary":"Send Price Alert Sms","description":"Déclencher une alerte SMS prix.","operationId":"send_price_alert_sms_api_prices_sms_alert_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlertRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/api/prices/sms/history":{"get":{"tags":["prices"],"summary":"Sms History","description":"Historique des SMS reçus (source=sms).","operationId":"sms_history_api_prices_sms_history_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prices/validation/queue":{"get":{"tags":["prices"],"summary":"Validation Queue","description":"File d'attente de validation des relevés SMS.\nPar défaut retourne les relevés \"pending\" (suspects, anomalies).","operationId":"validation_queue_api_prices_validation_queue_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"pending | validated | rejected | aggregated","title":"Status"},"description":"pending | validated | rejected | aggregated"},{"name":"commodity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commodity"}},{"name":"region","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prices/validation/{price_id}":{"post":{"tags":["prices"],"summary":"Validate Price","description":"Valider ou rejeter un relevé SMS.\n- validate : inclura ce relevé dans la prochaine agrégation nocturne\n- reject   : exclura ce relevé, enregistre la raison","operationId":"validate_price_api_prices_validation__price_id__post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"price_id","in":"path","required":true,"schema":{"type":"string","title":"Price Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationAction"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prices/validation/bulk":{"post":{"tags":["prices"],"summary":"Bulk Validate","description":"Valider ou rejeter plusieurs relevés en une fois.","operationId":"bulk_validate_api_prices_validation_bulk_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"action","in":"query","required":true,"schema":{"type":"string","pattern":"^(validate|reject)$","title":"Action"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"type":"string"},"title":"Ids"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prices/aggregation/trigger":{"post":{"tags":["prices"],"summary":"Trigger Aggregation","description":"Déclencher manuellement l'agrégation nocturne — réservé admin.\nUtile pour tester sans attendre 23h00.","operationId":"trigger_aggregation_api_prices_aggregation_trigger_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"target_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD (défaut: aujourd'hui)","title":"Target Date"},"description":"YYYY-MM-DD (défaut: aujourd'hui)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prices/wfp/fetch":{"post":{"tags":["prices"],"summary":"Trigger Wfp Fetch","description":"Declencher manuellement la synchronisation WFP DataBridges.","operationId":"trigger_wfp_fetch_api_prices_wfp_fetch_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD","title":"Start Date"},"description":"YYYY-MM-DD"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM-DD","title":"End Date"},"description":"YYYY-MM-DD"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prices/aggregation/history":{"get":{"tags":["prices"],"summary":"Aggregation History","description":"Historique des enregistrements agrégés (source=aggregated).","operationId":"aggregation_history_api_prices_aggregation_history_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/prices/countries":{"get":{"tags":["prices"],"summary":"List Countries","description":"Liste des pays disponibles dans la base.","operationId":"list_countries_api_prices_countries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/prices/compare":{"get":{"tags":["prices"],"summary":"Compare Countries","description":"Comparaison des prix d'un produit entre plusieurs pays.\nRetourne une série temporelle par pays.\n\nExemple : /api/prices/compare?commodity=sorghum&countries=BFA,MLI,NER&granularity=monthly&start=2022-01","operationId":"compare_countries_api_prices_compare_get","parameters":[{"name":"commodity","in":"query","required":false,"schema":{"type":"string","description":"Clé du produit","default":"sorghum","title":"Commodity"},"description":"Clé du produit"},{"name":"countries","in":"query","required":false,"schema":{"type":"string","description":"Codes ISO-3 séparés par virgule","default":"BFA,MLI,NER","title":"Countries"},"description":"Codes ISO-3 séparés par virgule"},{"name":"granularity","in":"query","required":false,"schema":{"type":"string","pattern":"^(monthly|yearly)$","default":"monthly","title":"Granularity"}},{"name":"start","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM","title":"Start"},"description":"YYYY-MM"},{"name":"end","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"YYYY-MM","title":"End"},"description":"YYYY-MM"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reports/{dataset_id}/export/csv":{"post":{"tags":["reports"],"summary":"Export Csv","operationId":"export_csv_api_reports__dataset_id__export_csv_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"dataset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Dataset Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExportRequest","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/reports/tasks/{task_id}":{"get":{"tags":["reports"],"summary":"Get Task Result","operationId":"get_task_result_api_reports_tasks__task_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/health":{"get":{"summary":"Health","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AlertRequest":{"properties":{"recipients":{"items":{"type":"string"},"type":"array","title":"Recipients"},"commodity":{"type":"string","title":"Commodity"},"region":{"type":"string","title":"Region"},"current_price":{"type":"number","title":"Current Price"},"threshold":{"type":"number","title":"Threshold"}},"type":"object","required":["recipients","commodity","region","current_price","threshold"],"title":"AlertRequest"},"AlertRuleCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":3,"title":"Name"},"metric_key":{"type":"string","title":"Metric Key"},"comparator":{"type":"string","title":"Comparator"},"threshold_value":{"type":"number","title":"Threshold Value"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"channels":{"items":{"type":"string"},"type":"array","title":"Channels","default":[]},"severity":{"$ref":"#/components/schemas/AlertSeverity","default":"warning"},"status":{"$ref":"#/components/schemas/AlertRuleStatus","default":"active"}},"type":"object","required":["name","metric_key","comparator","threshold_value"],"title":"AlertRuleCreate"},"AlertRuleOut":{"properties":{"name":{"type":"string","maxLength":255,"minLength":3,"title":"Name"},"metric_key":{"type":"string","title":"Metric Key"},"comparator":{"type":"string","title":"Comparator"},"threshold_value":{"type":"number","title":"Threshold Value"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"channels":{"items":{"type":"string"},"type":"array","title":"Channels","default":[]},"severity":{"$ref":"#/components/schemas/AlertSeverity","default":"warning"},"status":{"$ref":"#/components/schemas/AlertRuleStatus","default":"active"},"id":{"type":"string","format":"uuid","title":"Id"},"created_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["name","metric_key","comparator","threshold_value","id","created_at","updated_at"],"title":"AlertRuleOut"},"AlertRuleStatus":{"type":"string","enum":["active","paused"],"title":"AlertRuleStatus"},"AlertRuleUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"metric_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Metric Key"},"comparator":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comparator"},"threshold_value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Threshold Value"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"channels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Channels"},"severity":{"anyOf":[{"$ref":"#/components/schemas/AlertSeverity"},{"type":"null"}]},"status":{"anyOf":[{"$ref":"#/components/schemas/AlertRuleStatus"},{"type":"null"}]}},"type":"object","title":"AlertRuleUpdate"},"AlertSeverity":{"type":"string","enum":["info","warning","critical"],"title":"AlertSeverity"},"Body_login_api_auth_login_post":{"properties":{"grant_type":{"anyOf":[{"type":"string","pattern":"password"},{"type":"null"}],"title":"Grant Type"},"username":{"type":"string","title":"Username"},"password":{"type":"string","title":"Password"},"scope":{"type":"string","title":"Scope","default":""},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"}},"type":"object","required":["username","password"],"title":"Body_login_api_auth_login_post"},"Body_upload_avatar_api_users_me_avatar_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_avatar_api_users_me_avatar_post"},"Body_upload_file_api_datasets__slug__upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"delimiter":{"type":"string","title":"Delimiter","default":","},"has_header":{"type":"boolean","title":"Has Header","default":true},"lat_field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lat Field"},"lon_field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lon Field"}},"type":"object","required":["file"],"title":"Body_upload_file_api_datasets__slug__upload_post"},"DatasetCreate":{"properties":{"name":{"type":"string","maxLength":255,"minLength":3,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","default":[]},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"license":{"$ref":"#/components/schemas/DatasetLicense","default":"open"}},"type":"object","required":["name"],"title":"DatasetCreate"},"DatasetLicense":{"type":"string","enum":["open","cc-by","cc-by-sa","cc-by-nc","proprietary"],"title":"DatasetLicense"},"DatasetListOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DatasetOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["items","total","page","page_size"],"title":"DatasetListOut"},"DatasetOut":{"properties":{"name":{"type":"string","maxLength":255,"minLength":3,"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags","default":[]},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"license":{"$ref":"#/components/schemas/DatasetLicense","default":"open"},"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug"},"status":{"$ref":"#/components/schemas/DatasetStatus"},"is_geo":{"type":"boolean","title":"Is Geo"},"file_format":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Format"},"file_size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"File Size Bytes"},"row_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Row Count"},"download_count":{"type":"integer","title":"Download Count"},"view_count":{"type":"integer","title":"View Count"},"owner_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Owner Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"}},"type":"object","required":["name","id","slug","status","is_geo","download_count","view_count","created_at","updated_at"],"title":"DatasetOut"},"DatasetPreview":{"properties":{"columns":{"items":{"type":"string"},"type":"array","title":"Columns"},"rows":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Rows"},"total_rows":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Rows"}},"type":"object","required":["columns","rows"],"title":"DatasetPreview"},"DatasetStats":{"properties":{"row_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Row Count"},"column_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Column Count"},"columns":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Columns"}},"type":"object","required":["row_count","column_count","columns"],"title":"DatasetStats"},"DatasetStatus":{"type":"string","enum":["draft","pending","published","archived"],"title":"DatasetStatus"},"DatasetUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"license":{"anyOf":[{"$ref":"#/components/schemas/DatasetLicense"},{"type":"null"}]},"status":{"anyOf":[{"$ref":"#/components/schemas/DatasetStatus"},{"type":"null"}]}},"type":"object","title":"DatasetUpdate"},"ExportRequest":{"properties":{"filters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Filters"}},"type":"object","title":"ExportRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ImportJobOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"dataset_id":{"type":"string","format":"uuid","title":"Dataset Id"},"status":{"type":"string","title":"Status"},"progress":{"type":"integer","title":"Progress"},"error_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Message"},"rows_imported":{"type":"integer","title":"Rows Imported"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","dataset_id","status","progress","rows_imported","created_at"],"title":"ImportJobOut"},"MetricStatus":{"type":"string","enum":["ok","warn","down"],"title":"MetricStatus"},"PriceDataCreate":{"properties":{"commodity":{"type":"string","title":"Commodity"},"region":{"type":"string","title":"Region","default":"National"},"market":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market"},"price":{"type":"number","exclusiveMinimum":0.0,"title":"Price"},"unit":{"type":"string","title":"Unit","default":"CFA/kg"},"quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quality"},"price_date":{"type":"string","format":"date","title":"Price Date"},"source":{"type":"string","title":"Source","default":"manual"},"reporter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reporter"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["commodity","price","price_date"],"title":"PriceDataCreate"},"PriceDataOut":{"properties":{"commodity":{"type":"string","title":"Commodity"},"region":{"type":"string","title":"Region","default":"National"},"market":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market"},"price":{"type":"number","exclusiveMinimum":0.0,"title":"Price"},"unit":{"type":"string","title":"Unit","default":"CFA/kg"},"quality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Quality"},"price_date":{"type":"string","format":"date","title":"Price Date"},"source":{"type":"string","title":"Source","default":"manual"},"reporter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reporter"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"id":{"type":"string","format":"uuid","title":"Id"},"n_obs":{"type":"integer","title":"N Obs"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"validation_status":{"type":"string","title":"Validation Status","default":"auto"},"validated_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validated By"},"validated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Validated At"},"anomaly_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Anomaly Score"}},"type":"object","required":["commodity","price","price_date","id","n_obs","created_at"],"title":"PriceDataOut"},"PriceSeries":{"properties":{"commodity":{"type":"string","title":"Commodity"},"region":{"type":"string","title":"Region"},"granularity":{"type":"string","enum":["monthly","yearly"],"title":"Granularity"},"unit":{"type":"string","title":"Unit","default":"CFA/kg"},"source":{"type":"string","title":"Source"},"sources":{"items":{"type":"string"},"type":"array","title":"Sources"},"points":{"items":{"$ref":"#/components/schemas/SeriesPoint"},"type":"array","title":"Points"}},"type":"object","required":["commodity","region","granularity","source","points"],"title":"PriceSeries"},"QualityCheckCreate":{"properties":{"dataset_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Dataset Id"},"dataset_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dataset Slug"},"status":{"$ref":"#/components/schemas/QualityCheckStatus","default":"completed"},"score":{"type":"integer","title":"Score","default":0},"completeness":{"type":"integer","title":"Completeness","default":0},"coherence":{"type":"integer","title":"Coherence","default":0},"duplicate_count":{"type":"integer","title":"Duplicate Count","default":0},"flagged_rows":{"type":"integer","title":"Flagged Rows","default":0},"total_rows":{"type":"integer","title":"Total Rows","default":0},"issues":{"items":{"$ref":"#/components/schemas/QualityIssueCreate"},"type":"array","title":"Issues","default":[]}},"type":"object","title":"QualityCheckCreate"},"QualityCheckOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"dataset_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Dataset Id"},"dataset_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dataset Slug"},"status":{"$ref":"#/components/schemas/QualityCheckStatus"},"score":{"type":"integer","title":"Score"},"completeness":{"type":"integer","title":"Completeness"},"coherence":{"type":"integer","title":"Coherence"},"duplicate_count":{"type":"integer","title":"Duplicate Count"},"flagged_rows":{"type":"integer","title":"Flagged Rows"},"total_rows":{"type":"integer","title":"Total Rows"},"reviewer_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Reviewer Id"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"issues":{"items":{"$ref":"#/components/schemas/QualityIssueOut"},"type":"array","title":"Issues","default":[]}},"type":"object","required":["id","status","score","completeness","coherence","duplicate_count","flagged_rows","total_rows","created_at"],"title":"QualityCheckOut"},"QualityCheckStatus":{"type":"string","enum":["pending","running","completed","failed"],"title":"QualityCheckStatus"},"QualityCheckUpdate":{"properties":{"status":{"anyOf":[{"$ref":"#/components/schemas/QualityCheckStatus"},{"type":"null"}]},"score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Score"},"completeness":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Completeness"},"coherence":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Coherence"},"duplicate_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duplicate Count"},"flagged_rows":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Flagged Rows"},"total_rows":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Rows"}},"type":"object","title":"QualityCheckUpdate"},"QualityIssueCorrection":{"properties":{"corrected_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Corrected Value"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","title":"QualityIssueCorrection"},"QualityIssueCreate":{"properties":{"line_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Line Number"},"column_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Column Name"},"raw_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Value"},"problem":{"type":"string","title":"Problem"},"suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggestion"},"severity":{"$ref":"#/components/schemas/QualityIssueSeverity","default":"medium"}},"type":"object","required":["problem"],"title":"QualityIssueCreate"},"QualityIssueOut":{"properties":{"line_number":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Line Number"},"column_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Column Name"},"raw_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw Value"},"problem":{"type":"string","title":"Problem"},"suggestion":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggestion"},"severity":{"$ref":"#/components/schemas/QualityIssueSeverity","default":"medium"},"id":{"type":"string","format":"uuid","title":"Id"},"check_id":{"type":"string","format":"uuid","title":"Check Id"},"is_resolved":{"type":"boolean","title":"Is Resolved"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["problem","id","check_id","is_resolved","created_at"],"title":"QualityIssueOut"},"QualityIssueSeverity":{"type":"string","enum":["low","medium","high","critical"],"title":"QualityIssueSeverity"},"RefreshRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"RefreshRequest"},"SendSmsRequest":{"properties":{"to":{"type":"string","title":"To"},"message":{"type":"string","title":"Message"}},"type":"object","required":["to","message"],"title":"SendSmsRequest"},"SeriesPoint":{"properties":{"period":{"type":"string","title":"Period"},"price":{"type":"number","title":"Price"},"min":{"type":"number","title":"Min"},"max":{"type":"number","title":"Max"},"n_obs":{"type":"integer","title":"N Obs"},"sources":{"additionalProperties":{"type":"integer"},"type":"object","title":"Sources"}},"type":"object","required":["period","price","min","max","n_obs"],"title":"SeriesPoint","description":"Un point de la série temporelle (mensuel ou annuel)."},"SmsIngestPayload":{"properties":{"from_number":{"type":"string","title":"From Number"},"message":{"type":"string","title":"Message"},"received_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Received At"}},"type":"object","required":["from_number","message"],"title":"SmsIngestPayload","description":"Payload reçu d'un agregateur SMS (Africa's Talking, Twilio, etc.)."},"SubscribeOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"whatsapp_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whatsapp Number"},"commodity":{"type":"string","title":"Commodity"},"region":{"type":"string","title":"Region"},"threshold_price":{"type":"number","title":"Threshold Price"},"is_confirmed":{"type":"boolean","title":"Is Confirmed"},"is_active":{"type":"boolean","title":"Is Active"},"alert_count":{"type":"integer","title":"Alert Count"},"last_alerted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Alerted At"},"last_price_alerted":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Last Price Alerted"},"confirmed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Confirmed At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","email","commodity","region","threshold_price","is_confirmed","is_active","alert_count","created_at"],"title":"SubscribeOut"},"SubscribeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"whatsapp_number":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Whatsapp Number","description":"Numero WhatsApp au format international"},"commodity":{"type":"string","title":"Commodity"},"region":{"type":"string","title":"Region","default":"National"},"threshold_price":{"type":"number","exclusiveMinimum":0.0,"title":"Threshold Price","description":"Seuil en CFA/kg"}},"type":"object","required":["email","commodity","threshold_price"],"title":"SubscribeRequest"},"SubscriptionUpdate":{"properties":{"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"whatsapp_number":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Whatsapp Number"},"commodity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commodity"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"threshold_price":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Threshold Price"},"is_confirmed":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Confirmed"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"SubscriptionUpdate"},"SystemMetricCreate":{"properties":{"service":{"type":"string","title":"Service"},"metric_key":{"type":"string","title":"Metric Key"},"label":{"type":"string","title":"Label"},"value":{"type":"number","title":"Value"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"status":{"$ref":"#/components/schemas/MetricStatus","default":"ok"},"metadata_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata Json"}},"type":"object","required":["service","metric_key","label","value"],"title":"SystemMetricCreate"},"SystemMetricOut":{"properties":{"service":{"type":"string","title":"Service"},"metric_key":{"type":"string","title":"Metric Key"},"label":{"type":"string","title":"Label"},"value":{"type":"number","title":"Value"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"status":{"$ref":"#/components/schemas/MetricStatus","default":"ok"},"metadata_json":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata Json"},"id":{"type":"string","format":"uuid","title":"Id"},"recorded_at":{"type":"string","format":"date-time","title":"Recorded At"}},"type":"object","required":["service","metric_key","label","value","id","recorded_at"],"title":"SystemMetricOut"},"TeamMemberCreate":{"properties":{"organization":{"type":"string","title":"Organization"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"role":{"type":"string","title":"Role"},"access_level":{"type":"string","title":"Access Level"},"status":{"$ref":"#/components/schemas/TeamMemberStatus","default":"invited"},"is_owner":{"type":"boolean","title":"Is Owner","default":false}},"type":"object","required":["organization","email","role","access_level"],"title":"TeamMemberCreate"},"TeamMemberOut":{"properties":{"organization":{"type":"string","title":"Organization"},"email":{"type":"string","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"role":{"type":"string","title":"Role"},"access_level":{"type":"string","title":"Access Level"},"status":{"$ref":"#/components/schemas/TeamMemberStatus","default":"invited"},"is_owner":{"type":"boolean","title":"Is Owner","default":false},"id":{"type":"string","format":"uuid","title":"Id"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"},"invited_by_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Invited By Id"},"invited_at":{"type":"string","format":"date-time","title":"Invited At"},"joined_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Joined At"}},"type":"object","required":["organization","email","role","access_level","id","invited_at"],"title":"TeamMemberOut"},"TeamMemberStatus":{"type":"string","enum":["active","invited","suspended"],"title":"TeamMemberStatus"},"TeamMemberUpdate":{"properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"access_level":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access Level"},"status":{"anyOf":[{"$ref":"#/components/schemas/TeamMemberStatus"},{"type":"null"}]},"is_owner":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Owner"}},"type":"object","title":"TeamMemberUpdate"},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"}},"type":"object","required":["access_token","refresh_token"],"title":"TokenResponse"},"UserAdminUpdate":{"properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"role":{"anyOf":[{"$ref":"#/components/schemas/UserRole"},{"type":"null"}]},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"}},"type":"object","title":"UserAdminUpdate"},"UserCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"},"password":{"type":"string","title":"Password"},"role":{"$ref":"#/components/schemas/UserRole","default":"public"}},"type":"object","required":["email","password"],"title":"UserCreate"},"UserOut":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"},"id":{"type":"string","format":"uuid","title":"Id"},"role":{"$ref":"#/components/schemas/UserRole"},"is_active":{"type":"boolean","title":"Is Active"},"is_verified":{"type":"boolean","title":"Is Verified"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["email","id","role","is_active","is_verified","created_at"],"title":"UserOut"},"UserOutList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/UserOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["items","total","page","page_size"],"title":"UserOutList"},"UserRole":{"type":"string","enum":["admin","institutional","public"],"title":"UserRole"},"UserUpdate":{"properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"organization":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization"},"bio":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bio"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"}},"type":"object","title":"UserUpdate"},"ValidationAction":{"properties":{"action":{"type":"string","title":"Action"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["action"],"title":"ValidationAction"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WhatsAppIngestPayload":{"properties":{"wa_id":{"type":"string","title":"Wa Id"},"message":{"type":"string","title":"Message"},"received_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Received At"}},"type":"object","required":["wa_id","message"],"title":"WhatsAppIngestPayload","description":"Payload WhatsApp Business API."}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/api/auth/login"}}}}}}