{"openapi":"3.1.0","info":{"title":"SAWALI SMART SYSTEMS API","description":"API officielle pour le site web de SAWALI SMART SYSTEMS. Tous les endpoints sont préfixés par /api. Documentation interactive : /api/docs (Swagger) et /api/redoc.","version":"1.0.0"},"paths":{"/api/":{"get":{"tags":["Santé"],"summary":"Root","operationId":"root_api__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/health":{"get":{"tags":["Santé"],"summary":"Health","operationId":"health_api_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/version":{"get":{"tags":["Santé"],"summary":"Version","description":"Iter43-fix24x (2026-06-16) — Version sequence auto-bumped on each deploy.\n\nThe minor number after the dot is a sequential counter incremented every\ntime the git HEAD commit changes (= a new deploy). Previously this was\ntied to `roadmap_actions` which rarely changed, so the UI always showed\n`v1.0`. The major number stays `1` (or whatever `APP_VERSION` env var\noverrides it to). The `git_sha` field is exposed for support / debug.\nAlways returns 200, contains no secrets.","operationId":"version_api_version_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/auth/login":{"post":{"tags":["Authentification"],"summary":"Auth Login","operationId":"auth_login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/verify-otp":{"post":{"tags":["Authentification"],"summary":"Auth Verify Otp","operationId":"auth_verify_otp_api_auth_verify_otp_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/resend-otp":{"post":{"tags":["Authentification"],"summary":"Auth Resend Otp","operationId":"auth_resend_otp_api_auth_resend_otp_post","parameters":[{"name":"session_token","in":"query","required":true,"schema":{"type":"string","title":"Session Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me":{"get":{"tags":["Authentification"],"summary":"Auth Me","operationId":"auth_me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserPublic"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/auth/change-password":{"post":{"tags":["Authentification"],"summary":"Auth Change Password","operationId":"auth_change_password_api_auth_change_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePasswordRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/auth/captcha-config":{"get":{"tags":["Authentification"],"summary":"Auth Captcha Config","operationId":"auth_captcha_config_api_auth_captcha_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/i18n/languages":{"get":{"tags":["i18n"],"summary":"I18N Languages","operationId":"i18n_languages_api_i18n_languages_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/i18n/translations":{"get":{"tags":["i18n"],"summary":"I18N Public Dictionary","description":"Renvoie {key: text} pour la langue demandée. Bascule sur FR\nwhen the row has an empty value for that language.","operationId":"i18n_public_dictionary_api_i18n_translations_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"fr","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/i18n/detect":{"get":{"tags":["i18n"],"summary":"I18N Detect Region","description":"Renvoie {\"suggested_lang\": \"fr|en|ar\"} basé sur les en-têtes Cloudflare / CDN\ncountry headers or `Accept-Language`. Best-effort — defaults to FR.","operationId":"i18n_detect_region_api_i18n_detect_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/i18n/translations":{"get":{"tags":["Admin — i18n"],"summary":"Admin List Translations","operationId":"admin_list_translations_api_admin_i18n_translations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin — i18n"],"summary":"Admin Upsert Translation","operationId":"admin_upsert_translation_api_admin_i18n_translations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslationUpsert"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/i18n/translator-score":{"get":{"tags":["Admin — i18n"],"summary":"Admin Translator Score","description":"Daily / monthly word counters + payable amount.\n- Self-view for a Traducteur: scoped to their email.\n- Admin/sup: pass `translator_email` to see anyone's score.","operationId":"admin_translator_score_api_admin_i18n_translator_score_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"translator_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Translator Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/i18n/translations/{key}":{"delete":{"tags":["Admin — i18n"],"summary":"Admin Delete Translation","operationId":"admin_delete_translation_api_admin_i18n_translations__key__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/i18n/translations/bulk":{"post":{"tags":["Admin — i18n"],"summary":"Admin Bulk Upsert","operationId":"admin_bulk_upsert_api_admin_i18n_translations_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranslationBulkUpsert"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/i18n/translations.csv":{"get":{"tags":["Admin — i18n"],"summary":"Admin Export Csv","operationId":"admin_export_csv_api_admin_i18n_translations_csv_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/i18n/translate-suggest":{"post":{"tags":["Admin — i18n"],"summary":"Admin Translate Suggest","operationId":"admin_translate_suggest_api_admin_i18n_translate_suggest_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/i18n/translate-models":{"get":{"tags":["Admin — i18n"],"summary":"Admin Translate Models","operationId":"admin_translate_models_api_admin_i18n_translate_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/i18n/translate-empty-bulk":{"post":{"tags":["Admin — i18n"],"summary":"Admin Translate Empty Bulk","operationId":"admin_translate_empty_bulk_api_admin_i18n_translate_empty_bulk_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/i18n/translations/import-csv":{"post":{"tags":["Admin — i18n"],"summary":"Admin Import Csv","operationId":"admin_import_csv_api_admin_i18n_translations_import_csv_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_admin_import_csv_api_admin_i18n_translations_import_csv_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/content":{"get":{"tags":["Public"],"summary":"List Content","operationId":"list_content_api_content_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/content/{slug}":{"get":{"tags":["Public"],"summary":"Get Content","operationId":"get_content_api_content__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"lang","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/catalog":{"get":{"tags":["Public"],"summary":"Public Catalog","operationId":"public_catalog_api_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/documents":{"get":{"tags":["Public"],"summary":"Public Documents","operationId":"public_documents_api_public_documents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/products":{"get":{"tags":["Public"],"summary":"Public Products","operationId":"public_products_api_public_products_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/og/product/{product_id}":{"get":{"tags":["Public"],"summary":"Public Og Product","operationId":"public_og_product_api_public_og_product__product_id__get","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/support-load":{"get":{"tags":["Public"],"summary":"Public Support Load","operationId":"public_support_load_api_public_support_load_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/support-load":{"post":{"tags":["Admin"],"summary":"Admin Set Support Load","operationId":"admin_set_support_load_api_admin_support_load_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSupportLoadUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/webhooks/support-load/{secret}":{"post":{"tags":["Webhooks"],"summary":"Webhook Support Load","description":"External webhook to push the current support load (0..7).\nGET ?level=N[&label=...]  OR  POST JSON {level, label}.\nUseful from monitoring (Zabbix/Grafana/Freshdesk/Zendesk/n8n).","operationId":"webhook_support_load_api_webhooks_support_load__secret__post","parameters":[{"name":"secret","in":"path","required":true,"schema":{"type":"string","title":"Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Webhooks"],"summary":"Webhook Support Load","description":"External webhook to push the current support load (0..7).\nGET ?level=N[&label=...]  OR  POST JSON {level, label}.\nUseful from monitoring (Zabbix/Grafana/Freshdesk/Zendesk/n8n).","operationId":"webhook_support_load_api_webhooks_support_load__secret__post","parameters":[{"name":"secret","in":"path","required":true,"schema":{"type":"string","title":"Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine/remote-link":{"post":{"tags":["Admin"],"summary":"Admin Liluvine Remote Link","description":"Génère un lien signé longue durée pour contrôler le seuil et le niveau Liluvine\nfrom a phone bookmark — without going through the login screen.","operationId":"admin_liluvine_remote_link_api_admin_liluvine_remote_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminRemoteLinkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/public/remote/support/{token}":{"get":{"tags":["Public"],"summary":"Public Remote Support State","description":"Inspecte la charge support actuelle + la config Liluvine — protégé par jeton HMAC.","operationId":"public_remote_support_state_api_public_remote_support__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Public"],"summary":"Public Remote Support Update","operationId":"public_remote_support_update_api_public_remote_support__token__post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoteSupportUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/company-info":{"get":{"tags":["Public"],"summary":"Company Info","operationId":"company_info_api_company_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/contact":{"post":{"tags":["Public"],"summary":"Submit Contact","operationId":"submit_contact_api_contact_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContactCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/availability":{"get":{"tags":["Public"],"summary":"Availability","description":"Renvoie la liste des créneaux libres/occupés pour une date donnée.","operationId":"availability_api_availability_get","parameters":[{"name":"date","in":"query","required":true,"schema":{"type":"string","description":"YYYY-MM-DD","title":"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/appointments/public":{"post":{"tags":["Public"],"summary":"Create Public Appointment","operationId":"create_public_appointment_api_appointments_public_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicAppointmentRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/idle-config":{"get":{"tags":["Portail Client"],"summary":"Me Idle Config","operationId":"me_idle_config_api_me_idle_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/account":{"get":{"tags":["Portail Client"],"summary":"Me Account","operationId":"me_account_api_me_account_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/account-detail":{"get":{"tags":["Portail Client"],"summary":"Me Account Detail","description":"Iter34k — Read-only account profile shown in the user-menu \"Mon\ncompte\" page. Returns identity + company hierarchy + phone numbers +\nlast-login (excluding the current session) + counters for Rapports,\nSuivis, Contacts (shared by the same company/client).","operationId":"me_account_detail_api_me_account_detail_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/profile-update-request":{"post":{"tags":["Portail Client"],"summary":"Me Request Profile Update","description":"Iter34k — Soumet une demande libre à l'admin pour corriger l'identité,\nsurname spelling, birth date, phone numbers, etc. Stored in\n`db.profile_update_requests` for admin review; admin sees them in\n`/admin/settings` (separate section in a follow-up iter).","operationId":"me_request_profile_update_api_me_profile_update_request_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/profile-requests":{"get":{"tags":["Admin"],"summary":"Admin Profile Requests List","description":"Iter34l — Liste les demandes de mise à jour de profil soumises par les utilisateurs.\n`status` = pending | processed | all. Newest first.","operationId":"admin_profile_requests_list_api_admin_profile_requests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"all","title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/profile-requests/{req_id}":{"patch":{"tags":["Admin"],"summary":"Admin Profile Requests Update","description":"Iter34l — Marque une demande de mise à jour de profil comme traitée (ou en attente)\nand optionally attach an admin note.","operationId":"admin_profile_requests_update_api_admin_profile_requests__req_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"req_id","in":"path","required":true,"schema":{"type":"string","title":"Req Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/appointments":{"get":{"tags":["Portail Client"],"summary":"Me Appointments","description":"All users belonging to the same client see the same set of RDV.\nOnly the SAWALI super-admin sees ALL tenants (Iter43-fix24az-l). Regular\nclient-admin/superviseur are tenant-scoped. RGPD: anonymizes customer\nfields per parent-client flags for non-privileged roles.","operationId":"me_appointments_api_me_appointments_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Portail Client"],"summary":"Me Create Appointment","operationId":"me_create_appointment_api_me_appointments_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientAppointmentRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/webhooks/agenda/{secret}":{"post":{"tags":["Webhooks"],"summary":"Webhook Agenda N8N","description":"Inbound webhook from n8n AI Agent. Allows CRUD on appointments using a\nsecret path token. The n8n workflow must scope by client_email when acting\non behalf of a specific user — admin can act globally.","operationId":"webhook_agenda_n8n_api_webhooks_agenda__secret__post","parameters":[{"name":"secret","in":"path","required":true,"schema":{"type":"string","title":"Secret"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgendaWebhookCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/payments/pawapay/deposit":{"post":{"tags":["Portail Client"],"summary":"Me Pawapay Deposit","description":"DEPRECATED (Iter38r) — Replaced by the hosted Payment Page flow because\nthe direct /deposits endpoint does NOT collect the customer's PIN/OTP from\nour merchant UI (the OTP is prompted on the customer's phone via USSD,\nwhich often fails / is not transparent to the user). The new flow uses\nPawaPay's hosted page which handles MSISDN + PIN collection natively.\n\nThis endpoint now forwards to the Payment Page endpoint, building a\nresponse shaped identically to the legacy success payload so that\npre-v38r clients (mobile apps, embedded checkouts) keep working until\nthey migrate.","operationId":"me_pawapay_deposit_api_me_payments_pawapay_deposit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PawaPayDepositCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/payments/pawapay/payment-page":{"post":{"tags":["Portail Client"],"summary":"Me Pawapay Payment Page","description":"Iter38r — Initiate a hosted PawaPay Payment Page session.\n\nThe hosted page collects the MSISDN + PIN/OTP. We persist the payment row\nBEFORE calling PawaPay so reconciliation is guaranteed even on network\nerror (per PawaPay's recommended best-practice).","operationId":"me_pawapay_payment_page_api_me_payments_pawapay_payment_page_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PawaPayPaymentPageCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/payments":{"get":{"tags":["Portail Client"],"summary":"Me List Payments","description":"Liste les paiements récents. Only SAWALI super-admin sees ALL tenants.\nClient-admin sees their tenant. Plain users see only their own.\nIter43-fix24az-l — cross-tenant leak fix.","operationId":"me_list_payments_api_me_payments_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/payments/{deposit_id}":{"get":{"tags":["Portail Client"],"summary":"Me Get Payment","description":"Polling endpoint — refreshes the payment by querying PawaPay if still pending.","operationId":"me_get_payment_api_me_payments__deposit_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"deposit_id","in":"path","required":true,"schema":{"type":"string","title":"Deposit Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/pawapay/deposits/{secret}":{"post":{"tags":["Webhooks"],"summary":"Webhook Pawapay Deposits","description":"Iter38r-fix2 — PawaPay deposit callback. URL à coller dans le tableau\nde bord PawaPay → Configuration → Callback URLs → Deposits.","operationId":"webhook_pawapay_deposits_api_webhooks_pawapay_deposits__secret__post","parameters":[{"name":"secret","in":"path","required":true,"schema":{"type":"string","title":"Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/pawapay/refunds/{secret}":{"post":{"tags":["Webhooks"],"summary":"Webhook Pawapay Refunds","description":"Iter38r-fix2 — PawaPay refund callback. URL à coller dans le tableau\nde bord PawaPay → Configuration → Callback URLs → Refunds.","operationId":"webhook_pawapay_refunds_api_webhooks_pawapay_refunds__secret__post","parameters":[{"name":"secret","in":"path","required":true,"schema":{"type":"string","title":"Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/pawapay/{secret}":{"post":{"tags":["Webhooks"],"summary":"Webhook Pawapay","description":"Legacy generic PawaPay callback (kept for pre-Iter38r-fix2 configs).\nDetects deposit vs refund from payload presence of `depositId` / `refundId`.","operationId":"webhook_pawapay_api_webhooks_pawapay__secret__post","parameters":[{"name":"secret","in":"path","required":true,"schema":{"type":"string","title":"Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/pawapay/callback-urls":{"get":{"tags":["Admin"],"summary":"Admin Pawapay Callback Urls","description":"Iter38r-fix2 — Renvoie les 2 URLs de callback à coller dans le dashboard PawaPay\ndashboard. Auto-generates `pawapay_callback_secret` if missing so the\nURLs are always usable. The base host is derived from the incoming\nrequest so admins on preview get preview URLs and admins on production\nget production URLs.","operationId":"admin_pawapay_callback_urls_api_admin_pawapay_callback_urls_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/payments-dashboard":{"get":{"tags":["Portail Client"],"summary":"Me Payments Dashboard","operationId":"me_payments_dashboard_api_me_payments_dashboard_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/payment-links":{"get":{"tags":["Portail Client"],"summary":"Me List Payment Links","description":"Iter43-fix24az-l — cross-tenant leak fix. Only SAWALI super-admin sees\nall; client-admin scoped to their tenant.","operationId":"me_list_payment_links_api_me_payment_links_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Portail Client"],"summary":"Me Create Payment Link","operationId":"me_create_payment_link_api_me_payment_links_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentLinkCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/payment-links/{link_id}":{"patch":{"tags":["Portail Client"],"summary":"Me Toggle Payment Link","operationId":"me_toggle_payment_link_api_me_payment_links__link_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Portail Client"],"summary":"Me Delete Payment Link","operationId":"me_delete_payment_link_api_me_payment_links__link_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"link_id","in":"path","required":true,"schema":{"type":"string","title":"Link Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/pay/{slug}":{"get":{"tags":["Public"],"summary":"Public Get Payment Link","operationId":"public_get_payment_link_api_public_pay__slug__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/public/pay/{slug}/deposit":{"post":{"tags":["Public"],"summary":"Public Pay Deposit","operationId":"public_pay_deposit_api_public_pay__slug__deposit_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicPayRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/pay/{slug}/status/{deposit_id}":{"get":{"tags":["Public"],"summary":"Public Pay Status","description":"Polling endpoint for the public payment landing page (no auth).","operationId":"public_pay_status_api_public_pay__slug__status__deposit_id__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"deposit_id","in":"path","required":true,"schema":{"type":"string","title":"Deposit Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/appointments/{appt_id}":{"put":{"tags":["Portail Client"],"summary":"Me Update Appointment","description":"Client may edit their own upcoming appointments (pending/confirmed).","operationId":"me_update_appointment_api_me_appointments__appt_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"appt_id","in":"path","required":true,"schema":{"type":"string","title":"Appt Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppointmentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Portail Client"],"summary":"Me Delete Appointment","operationId":"me_delete_appointment_api_me_appointments__appt_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"appt_id","in":"path","required":true,"schema":{"type":"string","title":"Appt Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/access-summary":{"get":{"tags":["Portail Client"],"summary":"Me Access Summary","description":"Ultra-light probe : counts documents/formations/forms visible to the\ncurrent user, respecting `access_client_ids` gates and tenant scope. Only\nreturns booleans (has_XXX).","operationId":"me_access_summary_api_me_access_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/documents":{"get":{"tags":["Portail Client"],"summary":"Me Documents","description":"RGPD: anonymizes uploaded_by_email/name for non-privileged roles.\nIter43-fix24az-l — cross-tenant leak fix. Only super-admin sees ALL; client\nadmin/superviseur scoped to their tenant.\n\n2026-02 fork (P5) — Filtre supplémentaire `access_client_ids` : quand\nnon-vide, restreint aux tenants explicitement autorisés.","operationId":"me_documents_api_me_documents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Portail Client"],"summary":"Me Create Document","operationId":"me_create_document_api_me_documents_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/interventions":{"get":{"tags":["Portail Client"],"summary":"Me Interventions","description":"RGPD: anonymizes the technician name for non-privileged roles.\nIter43-fix24az-l — cross-tenant leak fix. Only super-admin sees ALL; client\nadmin/elevated_creator scoped to their tenant.","operationId":"me_interventions_api_me_interventions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Portail Client"],"summary":"Me Create Intervention","operationId":"me_create_intervention_api_me_interventions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterventionCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/interventions/hourly-rate":{"get":{"tags":["Portail Client"],"summary":"Me Interventions Hourly Rate","description":"Retourne le taux horaire en XOF résolu pour l'utilisateur courant.","operationId":"me_interventions_hourly_rate_api_me_interventions_hourly_rate_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/interventions/pdf":{"get":{"tags":["Portail Client"],"summary":"Me Interventions Pdf","description":"PDF de l'historique des interventions selon les filtres (date + client + statut).\n\nColonnes : Référence, Date, Client, Titre, Statut, Technicien, Durée (h), Coût (XOF).\nFooter : total durée + total coût (durée × taux horaire résolu).\n\nIter43-fix — Réservé Admin/Superviseur (la colonne Coût est confidentielle).","operationId":"me_interventions_pdf_api_me_interventions_pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/invoices/from-interventions":{"post":{"tags":["Portail Client"],"summary":"Me Create Invoices From Interventions","description":"Génère 1 facture par tenant à partir d'interventions sélectionnées.\n\n- Filtre : interventions existantes ET non encore facturées\n- Groupe par `client_id` (tenant)\n- Pour chaque groupe : facture auto-numérotée, motif « Intervention(s) n°<liste> »\n- Lignes : date, n°, technicien, durée, sous-total = durée × taux horaire résolu\n- Marque chaque intervention `invoiced=True` + `invoice_id` + `invoice_number`\n- Réservé Admin/Superviseur","operationId":"me_create_invoices_from_interventions_api_me_invoices_from_interventions_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterventionInvoicePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Portail Client"],"summary":"Me List Intervention Invoices","description":"Liste des factures interventions (admin/sup voient tout, client voit\nuniquement les siennes via tenant_id résolu).","operationId":"me_list_intervention_invoices_api_me_invoices_from_interventions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/invoices/from-interventions/{inv_id}":{"put":{"tags":["Admin"],"summary":"Admin Update Intervention Invoice Payment","description":"Iter43-fix6 — Renseigne la date/heure de dépôt OU de paiement d'une\nfacture. Permet de calculer le retard de règlement.\n\nRègles :\n- `deposited_at` accepte une string ISO (validée) ; passer `clear_deposited_at=True` pour reset.\n- `paid_at` accepte une string ISO ; passer `clear_paid_at=True` pour reset.\n- `due_days` permet de surcharger le délai (par défaut 30).","operationId":"admin_update_intervention_invoice_payment_api_admin_invoices_from_interventions__inv_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"inv_id","in":"path","required":true,"schema":{"type":"string","title":"Inv Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoicePaymentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/invoices/from-interventions/{inv_id}/pdf":{"get":{"tags":["Portail Client"],"summary":"Me Intervention Invoice Pdf","description":"PDF de la facture (admin/sup OU le tenant propriétaire).","operationId":"me_intervention_invoice_pdf_api_me_invoices_from_interventions__inv_id__pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"inv_id","in":"path","required":true,"schema":{"type":"string","title":"Inv Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/users":{"get":{"tags":["Portail Client"],"summary":"Me Users","operationId":"me_users_api_me_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/clients":{"get":{"tags":["Portail Client"],"summary":"Me Clients Light","description":"Liste client minimale pour utilisateurs élevés (utilisée dans les formulaires suivis/intervention).\nNon-elevated users only see their own client record.","operationId":"me_clients_light_api_me_clients_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/admin-clients":{"get":{"tags":["Portail Client"],"summary":"Supervisor List Admin Clients","description":"Le client Primaire (Superviseur) voit tous les autres clients ayant le rôle 'admin'.\nNote : les comptes 'admin' ici désignent des clients promus admin, pas l'admin SAWALI.","operationId":"supervisor_list_admin_clients_api_me_admin_clients_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/admin-clients/{target_id}":{"put":{"tags":["Portail Client"],"summary":"Supervisor Update Admin Client","operationId":"supervisor_update_admin_client_api_me_admin_clients__target_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"target_id","in":"path","required":true,"schema":{"type":"string","title":"Target Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateAdmin"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/access-clients-list":{"get":{"tags":["Portail Client"],"summary":"Me Access Clients List","description":"2026-02 fork (bug fix) — Liste minimale de clients/tenants pour peupler\nle multi-select `access_client_ids` (Documents / Formations / Formulaires).\n\nAutorisé à :\n  - `role in (admin, superviseur, moderateur)`\n  - OU `tracked_role in ELEVATED_TRACKED_ROLES` (Administrateur / Superviseur / Moderation)\n\nCela évite le 403 silencieux subi par le compte `support@` en production\n(tracked-Administrateur → sidebar admin OK mais `/admin/clients` refusait).","operationId":"me_access_clients_list_api_me_access_clients_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/clients":{"get":{"tags":["Admin"],"summary":"Admin List Clients","description":"List all users that should be visible in the Admin → Clients module.\n\nIter34p — Default scope widened to include `admin` (client roots) and\n`moderateur` so the admin can see and manage every account. The\nSAWALI super-admin (admin@sawalismartsystems.com) is always excluded\nbecause the platform itself owns this row.\n\nOptional query params:\n  - ``include_roles`` (csv) — override the default scope\n  - ``source`` (str)         — filter by users.source (e.g. ``wa_otp_login``)\n  - ``sort_by`` (str)        — ``created_at`` | ``last_login_at`` | ``full_name``\n  - ``sort_order`` (str)     — ``asc`` (default) | ``desc``","operationId":"admin_list_clients_api_admin_clients_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"include_roles","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Include Roles"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort By"}},{"name":"sort_order","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin"],"summary":"Admin Create Client","operationId":"admin_create_client_api_admin_clients_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserCreateAdmin"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/clients/{client_id}":{"get":{"tags":["Admin"],"summary":"Admin Get Client","operationId":"admin_get_client_api_admin_clients__client_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Admin"],"summary":"Admin Update Client","operationId":"admin_update_client_api_admin_clients__client_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateAdmin"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Client","operationId":"admin_delete_client_api_admin_clients__client_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/clients/{client_id}/features":{"get":{"tags":["Admin"],"summary":"Admin Get Client Features","operationId":"admin_get_client_features_api_admin_clients__client_id__features_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Admin"],"summary":"Admin Update Client Features","operationId":"admin_update_client_features_api_admin_clients__client_id__features_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientFeaturesUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/rgpd-preview/{client_id}":{"get":{"tags":["Admin"],"summary":"Admin Rgpd Preview","description":"Prévisualise ce qu'un utilisateur non-privilégié de `client_id` verrait dans son\nportal — applies the parent client's anon flags to a sample of records\nfrom each anonymized collection (contacts, appointments, interventions,\ndocuments). Admins use this to audit the RGPD setup without having to\ncreate a test user account.\n\nReturns up to 5 records per collection with both the original and the\nmasked version side-by-side so the admin can verify the mapping.","operationId":"admin_rgpd_preview_api_admin_rgpd_preview__client_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/features":{"get":{"tags":["Portail Client"],"summary":"Me Get Features","description":"Résout les feature flags SMART Communications pour l'utilisateur appelant.\nAdmin & superviseur always have everything enabled. Tracked users inherit\nfrom their parent client. Plain client users read from their own doc.","operationId":"me_get_features_api_me_features_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/usage/summary":{"get":{"tags":["Admin"],"summary":"Admin Usage Summary","description":"Aggregate usage metrics per client over the last N days.\nReturns: {period_days, totals, per_client[], daily_series[]}.","operationId":"admin_usage_summary_api_admin_usage_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/usage/sms-providers":{"get":{"tags":["Admin"],"summary":"Admin Usage Sms Providers","operationId":"admin_usage_sms_providers_api_admin_usage_sms_providers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/clients/{client_id}/whatsapp-stats":{"get":{"tags":["Admin"],"summary":"Admin Client Whatsapp Stats","description":"WhatsApp consumption summary for a client: messages sent OK/KO,\ninbound, last activity, configured unit cost & total cost.","operationId":"admin_client_whatsapp_stats_api_admin_clients__client_id__whatsapp_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/user-activity":{"get":{"tags":["Admin"],"summary":"Admin User Activity","description":"Renvoie :\n- last_logins[]: { user_email, user_name, role, company, last_seen_at, hits, last_page }\n- top_pages[]:   { module, page, hits, unique_users }\n- totals: { hits, unique_users, unique_companies }","operationId":"admin_user_activity_api_admin_user_activity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"week","title":"Period"}},{"name":"company","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/user-activity/heatmap":{"get":{"tags":["Admin"],"summary":"Admin User Activity Heatmap","description":"Renvoie une grille 7×24 des compteurs de hits (lignes = jours de semaine 0..6 Lun→Dim,\ncols = hours 0..23 UTC). Useful for identifying peak activity windows.\nPeriod accepts: today | week | month | quarter | year | days=N (1..365).","operationId":"admin_user_activity_heatmap_api_admin_user_activity_heatmap_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","default":"month","title":"Period"}},{"name":"company","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/migrate-orphan-data":{"get":{"tags":["Admin"],"summary":"Admin Inspect Orphan Data","description":"Inspecte ce que la migration iter28 des données orphelines FERAIT (sans écritures).\nReturns per-user and per-collection counts. Use the POST variant below to\nactually apply the migration.","operationId":"admin_inspect_orphan_data_api_admin_migrate_orphan_data_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Admin Run Orphan Data Migration","description":"Applique la migration iter28 des données orphelines. Idempotent — relancer ne\nre-migrate already-migrated rows (guarded by `client_id_legacy` presence).","operationId":"admin_run_orphan_data_migration_api_admin_migrate_orphan_data_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/snapshots":{"get":{"tags":["Admin"],"summary":"Admin List Snapshots","description":"Liste tous les instantanés triés par created_at décroissant.","operationId":"admin_list_snapshots_api_admin_snapshots_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Admin Create Snapshot","description":"Crée un nouvel instantané de toutes les collections métier.\nBody: {comment?: str, mask_secrets?: bool=True}","operationId":"admin_create_snapshot_api_admin_snapshots_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/snapshots/{snap_id}/download":{"get":{"tags":["Admin"],"summary":"Admin Download Snapshot","operationId":"admin_download_snapshot_api_admin_snapshots__snap_id__download_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"snap_id","in":"path","required":true,"schema":{"type":"string","title":"Snap Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/snapshots/{snap_id}":{"patch":{"tags":["Admin"],"summary":"Admin Update Snapshot","operationId":"admin_update_snapshot_api_admin_snapshots__snap_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"snap_id","in":"path","required":true,"schema":{"type":"string","title":"Snap Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Snapshot","operationId":"admin_delete_snapshot_api_admin_snapshots__snap_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"snap_id","in":"path","required":true,"schema":{"type":"string","title":"Snap Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/snapshots/auto-run":{"post":{"tags":["Admin"],"summary":"Admin Run Auto Snapshot","description":"Trigger the weekly auto-snapshot logic immediately (manual).","operationId":"admin_run_auto_snapshot_api_admin_snapshots_auto_run_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/snapshots/weekly-report-preview":{"get":{"tags":["Admin"],"summary":"Admin Preview Weekly Report","description":"Render the weekly health-report PDF on-demand. Useful for the admin\nto verify what gets attached to the snapshot email.","operationId":"admin_preview_weekly_report_api_admin_snapshots_weekly_report_preview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/roadmap-actions":{"get":{"tags":["Admin"],"summary":"Admin List Roadmap Actions","description":"Liste toutes les actions de la roadmap triées par code croissant. Initialisée au 1er appel.\nIter34j: One-shot backfill of `status` for rows that pre-date the field.\nIter38f: Auto-syncs CHANGELOG.md entries on every call (idempotent).","operationId":"admin_list_roadmap_actions_api_admin_roadmap_actions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Admin Create Roadmap Action","description":"Admin-driven creation of a pending action. Auto-numbered. Default\n`done=False`; can be flipped via the existing PATCH endpoint when\ndelivered.","operationId":"admin_create_roadmap_action_api_admin_roadmap_actions_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/roadmap-actions/{code}":{"patch":{"tags":["Admin"],"summary":"Admin Patch Roadmap Action","description":"Admins can edit `observations`, `done`/`status`, and (for their own\npending actions) `title`, `backlog_ref`, `details`, `duration_h`.\n\nIter34j: `status` field supports the Kanban view: \"todo\" | \"in_progress\"\n| \"done\". `done` boolean is kept in sync for backward compat. Setting\n`status=done` flips `done=true` and stamps `done_at`.","operationId":"admin_patch_roadmap_action_api_admin_roadmap_actions__code__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Roadmap Action","description":"Only admin-created (non-seed) entries can be deleted to keep the\nhistorical log intact. Seed entries start with ACT-0001..ACT-0016 and are\nprotected — admins can edit them but not delete.","operationId":"admin_delete_roadmap_action_api_admin_roadmap_actions__code__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/snapshots/import":{"post":{"tags":["Admin"],"summary":"Admin Import Snapshot","description":"Importe un fichier instantané. mode = 'replace' | 'merge'. dry_run='true' pour\npreview what would happen. Always logs into db.db_snapshots with\nkind='import'.\n\nIter35c — on a non-dry-run import, also dispatches a recap notification\nby email and (best-effort) WhatsApp to the admin, with the per-collection\nsummary table and a global success/error headline.","operationId":"admin_import_snapshot_api_admin_snapshots_import_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_admin_import_snapshot_api_admin_snapshots_import_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/snapshots/imports":{"get":{"tags":["Admin"],"summary":"Admin List Snapshot Imports","operationId":"admin_list_snapshot_imports_api_admin_snapshots_imports_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/secrets/keys":{"get":{"tags":["Admin"],"summary":"Admin List Vault Keys","description":"Liste les clés de paramètres sauvegardées par le coffre, et lesquelles sont\ncurrently populated (without revealing values).","operationId":"admin_list_vault_keys_api_admin_secrets_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/secrets/export":{"post":{"tags":["Admin"],"summary":"Admin Vault Export","description":"Export an AES-256-GCM encrypted bundle of every vaultable setting.\nBody: {\"password\": str, \"comment\": str?}. Returns a JSON envelope the\nadmin must download and store offline. Never persisted on the server.","operationId":"admin_vault_export_api_admin_secrets_export_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/secrets/import":{"post":{"tags":["Admin"],"summary":"Admin Vault Import","description":"Restore a previously-exported vault.\n- dry_run=true : decrypt + return the list of keys that would be\n  restored (without applying them).\n- dry_run=false : apply.\n- overwrite_filled=false : only restore keys that are EMPTY in the\n  current settings doc (safe default — never clobber a freshly typed\n  value with an older one).\n- overwrite_filled=true : restore every key from the bundle.","operationId":"admin_vault_import_api_admin_secrets_import_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_admin_vault_import_api_admin_secrets_import_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/secrets/audit":{"get":{"tags":["Admin"],"summary":"Admin Vault Audit","description":"Audit trail of every vault export/import action.","operationId":"admin_vault_audit_api_admin_secrets_audit_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/client-data-diagnostic":{"get":{"tags":["Admin"],"summary":"Admin Client Data Diagnostic","operationId":"admin_client_data_diagnostic_api_admin_client_data_diagnostic_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/realign-user-to-client":{"post":{"tags":["Admin"],"summary":"Admin Realign User To Client","description":"Applique le realign_plan renvoyé par /admin/client-data-diagnostic.\n\nBody: ``{\"email\": \"user@example.com\", \"dry_run\": false}``.\nThe endpoint re-runs the diagnostic, then applies the proposed actions\natomically per collection: stamps `client_id` to the canonical value and\nkeeps the previous one in `client_id_legacy` (for traceability).\nIdempotent.","operationId":"admin_realign_user_to_client_api_admin_realign_user_to_client_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/contacts/revert-retag":{"post":{"tags":["Admin"],"summary":"Admin Revert Retag","description":"Restore `client_id ← client_id_legacy` on every row where the legacy\nfield is set across all retag-affected collections.\n\nBody (all optional):\n  • ``dry_run`` (bool, default true) — preview the counts without writing.\n  • ``collections`` (list[str]) — limit to a specific subset (e.g. only\n    ``directory_contacts``). Default: all five.\n  • ``from_client_id`` (str) — restrict to rows previously tagged with this\n    ``client_id_legacy`` value (case: only revert one client's data).\n  • ``to_client_id`` (str) — restrict to rows currently tagged with this\n    ``client_id`` (case: only revert what was moved into this canonical).\n\nIdempotent: once a row is reverted, the legacy field is deleted so a\nsecond run is a no-op.","operationId":"admin_revert_retag_api_admin_contacts_revert_retag_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/clients-consistency":{"get":{"tags":["Admin"],"summary":"Admin Clients Consistency","description":"Vue panoramique de chaque entreprise multi-utilisateur et indique si tous ses membres\nshare the same canonical client_id. Read-only; pair with\n/admin/realign-user-to-client to fix outliers.","operationId":"admin_clients_consistency_api_admin_clients_consistency_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/clients-consistency/realign-all":{"post":{"tags":["Admin"],"summary":"Admin Realign All","description":"Iter38r-fix9h — Réaligne d'un seul clic tous les utilisateurs détectés\ncomme désalignés par `_scan_clients_consistency`. Nécessite `confirm=true`.","operationId":"admin_realign_all_api_admin_clients_consistency_realign_all_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_RealignAllPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/resolve-company":{"get":{"tags":["Admin"],"summary":"Admin Resolve Company","description":"Résout le client canonique pour un nom d'entreprise donné.\n\nReturns ``{found: bool, canonical_user, member_count}``. The frontend uses\nthis to offer auto-link when creating a new user with a known company.\nMatch is case-insensitive and trim-tolerant.","operationId":"admin_resolve_company_api_admin_resolve_company_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"company","in":"query","required":true,"schema":{"type":"string","title":"Company"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/campaign-efficiency":{"get":{"tags":["Admin"],"summary":"Admin Campaign Efficiency","operationId":"admin_campaign_efficiency_api_admin_campaign_efficiency_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/clients/{client_id}/whatsapp-cost":{"put":{"tags":["Admin"],"summary":"Admin Set Client Wa Cost","description":"Met à jour le coût WhatsApp unitaire (par message sortant) pour un client.\nAccepts {wa_unit_cost: number, wa_currency: str}.","operationId":"admin_set_client_wa_cost_api_admin_clients__client_id__whatsapp_cost_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/clients/{client_id}/timeline":{"get":{"tags":["Admin"],"summary":"Admin Client Timeline","description":"Unified CRM timeline for a client — aggregates events from 7 collections.\n\nEach event has shape: {id, type, ts, title, summary, status?, link?, payload}\nSorted by ts DESC. Optional `types` filter (CSV).","operationId":"admin_client_timeline_api_admin_clients__client_id__timeline_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"types","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Types"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/clients/{client_id}/payments":{"get":{"tags":["Admin"],"summary":"Admin List Client Payments","operationId":"admin_list_client_payments_api_admin_clients__client_id__payments_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin"],"summary":"Admin Create Client Payment","description":"Register a payment received from a client and (optionally) fire the WA\nreceipt confirmation template.\n\nSide effects on success:\n  1. Inserts a row in `db.tenant_payments`.\n  2. Updates `users.last_payment_at` (so the Retard column recomputes).\n  3. Sends the WA `payment_confirmation_template` (default\n     `confirmation_paiement_avecrecu`) to the client's phone.","operationId":"admin_create_client_payment_api_admin_clients__client_id__payments_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantPaymentCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/clients/{client_id}/payments/{payment_id}":{"delete":{"tags":["Admin"],"summary":"Admin Delete Client Payment","operationId":"admin_delete_client_payment_api_admin_clients__client_id__payments__payment_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"payment_id","in":"path","required":true,"schema":{"type":"string","title":"Payment Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/clients/{client_id}/notes":{"get":{"tags":["Admin"],"summary":"Admin List Notes","operationId":"admin_list_notes_api_admin_clients__client_id__notes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin"],"summary":"Admin Create Note","operationId":"admin_create_note_api_admin_clients__client_id__notes_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientNoteCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/clients/{client_id}/notes/{nid}":{"delete":{"tags":["Admin"],"summary":"Admin Delete Note","operationId":"admin_delete_note_api_admin_clients__client_id__notes__nid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"nid","in":"path","required":true,"schema":{"type":"string","title":"Nid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/clients/{client_id}/tasks":{"get":{"tags":["Admin"],"summary":"Admin List Tasks","operationId":"admin_list_tasks_api_admin_clients__client_id__tasks_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin"],"summary":"Admin Create Task","operationId":"admin_create_task_api_admin_clients__client_id__tasks_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientTaskCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/clients/{client_id}/tasks/{tid}":{"put":{"tags":["Admin"],"summary":"Admin Update Task","operationId":"admin_update_task_api_admin_clients__client_id__tasks__tid__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"tid","in":"path","required":true,"schema":{"type":"string","title":"Tid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientTaskUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Task","operationId":"admin_delete_task_api_admin_clients__client_id__tasks__tid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"tid","in":"path","required":true,"schema":{"type":"string","title":"Tid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/clients/{client_id}/set-primary":{"post":{"tags":["Admin"],"summary":"Admin Set Primary Client","description":"Designate ONE client as the primary site owner.\nThe primary client is automatically promoted to role=superviseur.\nAny previous primary is unmarked and demoted back to role=client (unless admin).","operationId":"admin_set_primary_client_api_admin_clients__client_id__set_primary_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/clients/{client_id}/unset-primary":{"post":{"tags":["Admin"],"summary":"Admin Unset Primary Client","operationId":"admin_unset_primary_client_api_admin_clients__client_id__unset_primary_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/appointments":{"get":{"tags":["Admin"],"summary":"Admin Appointments","description":"Iter43-fix24az-l retest — Cross-tenant leak fix. Only SAWALI super-admin\nsees ALL appointments across tenants ; client-admin/superviseur roles are\nscoped to their own tenant via `_resolve_visible_client_ids`.","operationId":"admin_appointments_api_admin_appointments_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/appointments/{appt_id}":{"put":{"tags":["Admin"],"summary":"Admin Update Appt","operationId":"admin_update_appt_api_admin_appointments__appt_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"appt_id","in":"path","required":true,"schema":{"type":"string","title":"Appt Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppointmentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Appt","operationId":"admin_delete_appt_api_admin_appointments__appt_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"appt_id","in":"path","required":true,"schema":{"type":"string","title":"Appt Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/interventions":{"get":{"tags":["Admin"],"summary":"Admin Interventions","description":"Iter43-fix24az-l retest — Cross-tenant leak fix. Only SAWALI super-admin\nsees ALL interventions ; client-admin/superviseur scoped to their tenant.","operationId":"admin_interventions_api_admin_interventions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Admin Create Intervention","operationId":"admin_create_intervention_api_admin_interventions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterventionCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/interventions/{int_id}":{"put":{"tags":["Admin"],"summary":"Admin Update Intervention","operationId":"admin_update_intervention_api_admin_interventions__int_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"int_id","in":"path","required":true,"schema":{"type":"string","title":"Int Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterventionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Intervention","operationId":"admin_delete_intervention_api_admin_interventions__int_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"int_id","in":"path","required":true,"schema":{"type":"string","title":"Int Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/interventions/{int_id}/unlock-invoice":{"post":{"tags":["Admin"],"summary":"Admin Unlock Intervention","description":"Iter43-fix4 — Force unlock d'une intervention facturée (admin OU superviseur).\nNB : la facture associée n'est pas modifiée. Si elle doit être annulée,\nvoir /admin/invoices/{invoice_id}/cancel.","operationId":"admin_unlock_intervention_api_admin_interventions__int_id__unlock_invoice_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"int_id","in":"path","required":true,"schema":{"type":"string","title":"Int Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/documents":{"get":{"tags":["Admin"],"summary":"Admin Documents","description":"Iter43-fix24az-l retest — Cross-tenant leak fix. Super-admin sees ALL\ndocuments (including per-tenant private ones) ; client-admin sees only the\ndocuments owned by their tenant PLUS public/shared documents\n(client_id is None or empty, or is_public=True).","operationId":"admin_documents_api_admin_documents_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Admin Create Document","operationId":"admin_create_document_api_admin_documents_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/documents/{doc_id}":{"put":{"tags":["Admin"],"summary":"Admin Update Document","operationId":"admin_update_document_api_admin_documents__doc_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Document","operationId":"admin_delete_document_api_admin_documents__doc_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/document-categories":{"get":{"tags":["Admin"],"summary":"Admin List Doc Categories","operationId":"admin_list_doc_categories_api_admin_document_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Admin Create Doc Category","operationId":"admin_create_doc_category_api_admin_document_categories_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCategoryCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/document-categories/{cat_id}":{"put":{"tags":["Admin"],"summary":"Admin Update Doc Category","operationId":"admin_update_doc_category_api_admin_document_categories__cat_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cat_id","in":"path","required":true,"schema":{"type":"string","title":"Cat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentCategoryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Doc Category","operationId":"admin_delete_doc_category_api_admin_document_categories__cat_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cat_id","in":"path","required":true,"schema":{"type":"string","title":"Cat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/document-categories":{"get":{"tags":["Public"],"summary":"Public Doc Categories","operationId":"public_doc_categories_api_document_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/client-categories":{"get":{"tags":["Admin"],"summary":"Admin List Client Categories","operationId":"admin_list_client_categories_api_admin_client_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Admin Create Client Category","operationId":"admin_create_client_category_api_admin_client_categories_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientCategoryCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/client-categories/{cat_id}":{"put":{"tags":["Admin"],"summary":"Admin Update Client Category","operationId":"admin_update_client_category_api_admin_client_categories__cat_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cat_id","in":"path","required":true,"schema":{"type":"string","title":"Cat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClientCategoryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Client Category","operationId":"admin_delete_client_category_api_admin_client_categories__cat_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cat_id","in":"path","required":true,"schema":{"type":"string","title":"Cat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/client-categories":{"get":{"tags":["Public"],"summary":"Public Client Categories","operationId":"public_client_categories_api_client_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/deployments":{"get":{"tags":["Admin"],"summary":"Admin List Deployments","operationId":"admin_list_deployments_api_admin_deployments_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Admin Create Deployment","operationId":"admin_create_deployment_api_admin_deployments_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/deployments/{dep_id}":{"put":{"tags":["Admin"],"summary":"Admin Update Deployment","operationId":"admin_update_deployment_api_admin_deployments__dep_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dep_id","in":"path","required":true,"schema":{"type":"string","title":"Dep Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Deployment","operationId":"admin_delete_deployment_api_admin_deployments__dep_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dep_id","in":"path","required":true,"schema":{"type":"string","title":"Dep Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/deployments":{"get":{"tags":["Public"],"summary":"Public Deployments","description":"Liste publique, groupée par pays, avec toutes les solutions et le total d'installations.\nReturns: [{country, total_installations, solutions: [{name, installations, city, created_at, updated_at}]}]","operationId":"public_deployments_api_deployments_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/upload":{"post":{"tags":["Admin"],"summary":"Admin Upload","operationId":"admin_upload_api_admin_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_admin_upload_api_admin_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/files/orphans":{"get":{"tags":["Admin"],"summary":"Admin Files Orphans","description":"List file rows that are unrecoverable (disk gone + no remote copy).","operationId":"admin_files_orphans_api_admin_files_orphans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/files/backfill":{"post":{"tags":["Admin"],"summary":"Admin Files Backfill","description":"For every file row that has its binary on disk but no `storage_path`,\npush it to Emergent storage and update the DB row. Best-effort.","operationId":"admin_files_backfill_api_admin_files_backfill_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/policies":{"get":{"tags":["Admin"],"summary":"Admin List Policies","description":"Renvoie les 3 slots de politique fixes avec leurs métadonnées + URL de partage public.","operationId":"admin_list_policies_api_admin_policies_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/policies/{slot}/upload":{"post":{"tags":["Admin"],"summary":"Admin Upload Policy","operationId":"admin_upload_policy_api_admin_policies__slot__upload_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slot","in":"path","required":true,"schema":{"type":"string","title":"Slot"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_admin_upload_policy_api_admin_policies__slot__upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/policies/{slot}":{"delete":{"tags":["Admin"],"summary":"Admin Delete Policy","operationId":"admin_delete_policy_api_admin_policies__slot__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slot","in":"path","required":true,"schema":{"type":"string","title":"Slot"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/policies/{slot}":{"head":{"tags":["Public"],"summary":"Public Policy","description":"Serve a policy PDF inline so 3rd parties (Google, Facebook…) can verify it.\nBoth GET (renders the PDF) and HEAD (existence check used by the public\n/politiques/{slug} page to decide whether to show the iframe) are supported.","operationId":"public_policy_api_public_policies__slot__head","parameters":[{"name":"slot","in":"path","required":true,"schema":{"type":"string","title":"Slot"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Public"],"summary":"Public Policy","description":"Serve a policy PDF inline so 3rd parties (Google, Facebook…) can verify it.\nBoth GET (renders the PDF) and HEAD (existence check used by the public\n/politiques/{slug} page to decide whether to show the iframe) are supported.","operationId":"public_policy_api_public_policies__slot__head","parameters":[{"name":"slot","in":"path","required":true,"schema":{"type":"string","title":"Slot"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/files/{file_id}":{"head":{"tags":["Public"],"summary":"Serve File","operationId":"serve_file_api_files__file_id__head","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Public"],"summary":"Serve File","operationId":"serve_file_api_files__file_id__head","parameters":[{"name":"file_id","in":"path","required":true,"schema":{"type":"string","title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/document-logs":{"get":{"tags":["Admin"],"summary":"Admin Document Logs","description":"Renvoie l'historique combiné upload + download. Admin uniquement.","operationId":"admin_document_logs_api_admin_document_logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"file_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/media-library":{"get":{"tags":["Portail Client"],"summary":"Me Media Library","description":"Tous les médias téléversés par les utilisateurs du même client. Banque partagée.\n\nIter35n — `source` query filter narrows the listing (typically\n`?source=whatsapp_inbound` to isolate WhatsApp re-saved media).\n\nIter37g — Rebuild `public_url` from the CURRENT request host so that links\nstored at upload time on preview keep working from production (and vice\nversa). Falls back to the stored absolute URL if no relative `url` is\navailable.","operationId":"me_media_library_api_me_media_library_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Portail Client"],"summary":"Me Media Library Create","description":"Upload + register a media in the shared client library, returns a stable public URL\n(with the file extension, accepted by Meta WhatsApp Cloud API as a header media).","operationId":"me_media_library_create_api_me_media_library_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_me_media_library_create_api_me_media_library_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/media-library/{media_id}":{"delete":{"tags":["Portail Client"],"summary":"Me Media Library Delete","operationId":"me_media_library_delete_api_me_media_library__media_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"media_id","in":"path","required":true,"schema":{"type":"string","title":"Media Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/media-library/wa-cleanup":{"post":{"tags":["Portail Client"],"summary":"Me Media Library Wa Cleanup","description":"Delete WhatsApp-sourced media library entries whose underlying file is\nno longer referenced anywhere else. Admin/superviseur/admin-tracked only.","operationId":"me_media_library_wa_cleanup_api_me_media_library_wa_cleanup_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/transcribe":{"post":{"tags":["Portail Client"],"summary":"Transcribe Audio","description":"Accepts a short audio file (webm/mp3/m4a/wav/ogg, ≤25 Mo) and returns\nthe transcribed text using OpenAI Whisper.","operationId":"transcribe_audio_api_transcribe_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_transcribe_audio_api_transcribe_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/ai/summarize":{"post":{"tags":["Portail Client"],"summary":"Me Ai Summarize","operationId":"me_ai_summarize_api_me_ai_summarize_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiSummaryRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/ai/summaries":{"get":{"tags":["Portail Client"],"summary":"Me List Ai Summaries","description":"Liste les résumés IA sauvegardés de l'utilisateur appelant (les admins voient tout,\nsorted by created_at desc). Capped at 200 per request to keep UI snappy.","operationId":"me_list_ai_summaries_api_me_ai_summaries_get","security":[{"HTTPBearer":[]}],"parameters":[{"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"}}}}}}},"/api/me/ai/summaries/{sid}":{"delete":{"tags":["Portail Client"],"summary":"Me Delete Ai Summary","operationId":"me_delete_ai_summary_api_me_ai_summaries__sid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/ai/summaries/{sid}/to-report":{"post":{"tags":["Portail Client"],"summary":"Me Summary To Report","description":"Convertit un résumé IA sauvegardé en Rapport (ou en Suivi si un client_id est\nprovided alongside an event_date built from the summary date). The body of\nthe report contains the rendered summary plus a tiny attribution footer.","operationId":"me_summary_to_report_api_me_ai_summaries__sid__to_report_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiSummaryToReport"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/clients-roster":{"get":{"tags":["Portail Client"],"summary":"Me Clients Roster","description":"Renvoie une liste publique-sûre de clients servant à peupler le dropdown entreprise\nwhen editing a contact. Includes id, full_name, company, and client_code (ACME).","operationId":"me_clients_roster_api_me_clients_roster_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/version-detail":{"get":{"tags":["Public"],"summary":"Get Version Detail","description":"Iter43-fix24x → fix24az-t (2026-07-22) — wrapper public détaillé pour\nle numéro de déploiement.\n\nRenvoie :\n  - `version` : \"{APP_VERSION}.{seq}\" (ex: \"1.21\")\n  - `started_at` : ISO timestamp du dernier bump\n  - `deploy_seq` : compteur monotone (+1 à chaque déploiement détecté)\n  - `git_head` : short hash (7 chars) — vide en prod sans .git\n  - `files_hash` : hash SHA-256 court (16 chars) des fichiers critiques\n    (server.py + routes/*.py + models.py + requirements.txt). Change dès\n    qu'un fichier backend est modifié — le vrai signal de fraîcheur.\n  - `deploy_id` : valeur brute de `DEPLOY_ID` env var (si injectée par le CI)","operationId":"get_version_detail_api_version_detail_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/content/{slug}":{"put":{"tags":["Admin"],"summary":"Admin Upsert Content","operationId":"admin_upsert_content_api_admin_content__slug__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ContentUpsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Content","operationId":"admin_delete_content_api_admin_content__slug__delete","security":[{"HTTPBearer":[]}],"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/admin/content/{slug}/translate":{"post":{"tags":["Admin"],"summary":"Admin Translate Content","operationId":"admin_translate_content_api_admin_content__slug__translate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/tracked-users":{"get":{"tags":["Admin"],"summary":"Admin Tracked","operationId":"admin_tracked_api_admin_tracked_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin"],"summary":"Admin Create Tracked","operationId":"admin_create_tracked_api_admin_tracked_users_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackedUserCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/tenant-users":{"get":{"tags":["Portail Client"],"summary":"Me Tenant Users","operationId":"me_tenant_users_api_me_tenant_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/tracked-users/{tu_id}":{"put":{"tags":["Admin"],"summary":"Admin Update Tracked","operationId":"admin_update_tracked_api_admin_tracked_users__tu_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tu_id","in":"path","required":true,"schema":{"type":"string","title":"Tu Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackedUserUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Tracked","operationId":"admin_delete_tracked_api_admin_tracked_users__tu_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tu_id","in":"path","required":true,"schema":{"type":"string","title":"Tu Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/tracked-users/bulk-transfer":{"post":{"tags":["Admin"],"summary":"Admin Bulk Transfer Tracked","operationId":"admin_bulk_transfer_tracked_api_admin_tracked_users_bulk_transfer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkTransferTrackedRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/tracked-users/{tu_id}/set-password":{"post":{"tags":["Admin"],"summary":"Admin Set Tracked Password","description":"Provisionne (ou réinitialise) un identifiant pour un utilisateur suivi.\n\nCreates/updates a row in `users` (role=client, account_status=active) bridged via\n`tracked_user_id`. The tracked user can then log in with their email + this password\nthrough the standard /auth/login → OTP flow.","operationId":"admin_set_tracked_password_api_admin_tracked_users__tu_id__set_password_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tu_id","in":"path","required":true,"schema":{"type":"string","title":"Tu Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrackedUserSetPassword"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/tracked-users/{tu_id}/revoke-password":{"post":{"tags":["Admin"],"summary":"Admin Revoke Tracked Password","operationId":"admin_revoke_tracked_password_api_admin_tracked_users__tu_id__revoke_password_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tu_id","in":"path","required":true,"schema":{"type":"string","title":"Tu Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/contacts":{"get":{"tags":["Admin"],"summary":"Admin Contacts","operationId":"admin_contacts_api_admin_contacts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/contacts/{contact_id}/save-as-tracked-user":{"post":{"tags":["Admin"],"summary":"Admin Save Contact As Tracked","operationId":"admin_save_contact_as_tracked_api_admin_contacts__contact_id__save_as_tracked_user_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","title":"Contact Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveContactAsTrackedUser"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/meta/tracked-roles":{"get":{"tags":["Admin"],"summary":"Admin Tracked Roles","operationId":"admin_tracked_roles_api_admin_meta_tracked_roles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/blacklisted-ips":{"get":{"tags":["Admin"],"summary":"Admin List Blacklist","operationId":"admin_list_blacklist_api_admin_blacklisted_ips_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Admin Add Blacklist","operationId":"admin_add_blacklist_api_admin_blacklisted_ips_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlacklistedIPCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/blacklisted-ips/{ip_id}":{"delete":{"tags":["Admin"],"summary":"Admin Delete Blacklist","operationId":"admin_delete_blacklist_api_admin_blacklisted_ips__ip_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ip_id","in":"path","required":true,"schema":{"type":"string","title":"Ip Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/branding":{"get":{"tags":["Portail Client"],"summary":"Me Branding","description":"Renvoie le branding à afficher dans la sidebar du portail connecté.\nTracked-users inherit from their client_id; clients/superviseurs use their own logo.","operationId":"me_branding_api_me_branding_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/notes/{kind}":{"get":{"tags":["Portail Client"],"summary":"Me List Notes","operationId":"me_list_notes_api_me_notes__kind__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}},{"name":"author","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"scope","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Portail Client"],"summary":"Me Create Note","operationId":"me_create_note_api_me_notes__kind__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserNoteCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/notes/{kind}/authors":{"get":{"tags":["Portail Client"],"summary":"Me List Note Authors","description":"Distinct authors for the kind — used to populate the filter dropdown.","operationId":"me_list_note_authors_api_me_notes__kind__authors_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/notes/{kind}/{note_id}":{"put":{"tags":["Portail Client"],"summary":"Me Update Note","operationId":"me_update_note_api_me_notes__kind___note_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserNoteUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Portail Client"],"summary":"Me Delete Note","operationId":"me_delete_note_api_me_notes__kind___note_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/notes/{kind}/{note_id}/note-de-service":{"post":{"tags":["Portail Client"],"summary":"Me Send Note De Service","operationId":"me_send_note_de_service_api_me_notes__kind___note_id__note_de_service_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}},{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/note-service/history":{"get":{"tags":["Admin"],"summary":"Admin Note Service History","description":"Aggregate the last N Note de Service broadcasts, grouped by source note.\nEach row exposes: note_id, note_numero, last_sent_at, sent_count,\nfailed_count, recipient_count, sender (owner_email), recipients list.","operationId":"admin_note_service_history_api_admin_note_service_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/note-service/{note_id}/retry-failed":{"post":{"tags":["Admin"],"summary":"Admin Retry Failed Note Service","description":"Resend a Note de Service ONLY to recipients whose previous attempt\nfailed. Useful when a Meta template was paused and has been re-enabled,\nor when a phone number is fixed. Idempotent for KO recipients only:\nsuccessful recipients are NOT touched (no duplicate notifications).","operationId":"admin_retry_failed_note_service_api_admin_note_service__note_id__retry_failed_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"note_id","in":"path","required":true,"schema":{"type":"string","title":"Note Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/notes-targets":{"get":{"tags":["Portail Client"],"summary":"Me Notes Targets","description":"Iter35m — Renvoie la liste des utilisateurs auxquels une note/tâche peut être adressée\nwhen `is_private=True`. The list always starts with \"Moi-même\" (the caller),\nfollowed by every other user that shares the same effective client_id —\ni.e. the linked client + every tracked user / admin / superviseur attached\nto that client. Used to populate the targeting dropdown in the UI.\n\nSchema returned: { items: [{ id, full_name, email, role, is_self }] }","operationId":"me_notes_targets_api_me_notes_targets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/notes-summary":{"get":{"tags":["Portail Client"],"summary":"Me Notes Summary","description":"Renvoie les compteurs et timestamps de dernière mise à jour pour afficher les boutons du dashboard.\nElevated users see global counts (all notes); others see only their own.\n\nIter35g — extended with \"notes\" and \"tasks\" kinds (personal user notes/tasks,\nsame model as reports/suivis with voice + transcription baked in).","operationId":"me_notes_summary_api_me_notes_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/demo/status":{"get":{"tags":["Portail Client"],"summary":"Me Demo Status","description":"Iter35h — Frontend uses this endpoint to render the persistent\ndemo-account banner (countdown + quota gauges). Returns 200 with\n`is_demo: false` for every non-demo account so the front can call it\nunconditionally without 4xx handling.","operationId":"me_demo_status_api_me_demo_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/demo/expiry-events":{"get":{"tags":["Admin"],"summary":"Admin List Demo Expiry Events","description":"Demo accounts that have expired — admin reviews and decides:\nkeep disabled, extend the expiry, or delete entirely.","operationId":"admin_list_demo_expiry_events_api_admin_demo_expiry_events_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"only_unresolved","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Only Unresolved"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/demo/expiry-events/{ev_id}/resolve":{"post":{"tags":["Admin"],"summary":"Admin Resolve Demo Expiry","operationId":"admin_resolve_demo_expiry_api_admin_demo_expiry_events__ev_id__resolve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ev_id","in":"path","required":true,"schema":{"type":"string","title":"Ev Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/interventions/{int_id}":{"delete":{"tags":["Portail Client"],"summary":"Me Delete Intervention","operationId":"me_delete_intervention_api_me_interventions__int_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"int_id","in":"path","required":true,"schema":{"type":"string","title":"Int Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/documents/{doc_id}":{"delete":{"tags":["Portail Client"],"summary":"Me Delete Document","operationId":"me_delete_document_api_me_documents__doc_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/upload":{"post":{"tags":["Portail Client"],"summary":"Me Upload","operationId":"me_upload_api_me_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_me_upload_api_me_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/contact-inbox":{"get":{"tags":["Portail Client"],"summary":"Me Contact Inbox","description":"Inbox of messages submitted via the public contact form.\nNOTE: renamed from /me/contacts to avoid collision with the contacts directory.","operationId":"me_contact_inbox_api_me_contact_inbox_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/contacts/{contact_id}/save-as-tracked-user":{"post":{"tags":["Portail Client"],"summary":"Me Save Contact As Tracked","description":"Identique à /admin/contacts/{id}/save-as-tracked-user mais auto-génère aussi un mot de passe,\ncreates a bridged users row, optionally emails the credentials, and returns the password.","operationId":"me_save_contact_as_tracked_api_me_contacts__contact_id__save_as_tracked_user_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","title":"Contact Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveContactAsTrackedUser"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/ratings/{kind}/{target_id}":{"post":{"tags":["Portail Client"],"summary":"Me Rate","operationId":"me_rate_api_me_ratings__kind___target_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}},{"name":"target_id","in":"path","required":true,"schema":{"type":"string","title":"Target Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RatingCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Portail Client"],"summary":"Me Unrate","operationId":"me_unrate_api_me_ratings__kind___target_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kind","in":"path","required":true,"schema":{"type":"string","title":"Kind"}},{"name":"target_id","in":"path","required":true,"schema":{"type":"string","title":"Target Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/access-log":{"post":{"tags":["Portail Client"],"summary":"Me Log Access","description":"Enregistre un accès à une page du portail. Appelé par la SPA à chaque changement de route.","operationId":"me_log_access_api_me_access_log_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccessLogCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/access-logs":{"get":{"tags":["Admin"],"summary":"Admin Access Logs","operationId":"admin_access_logs_api_admin_access_logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}},{"name":"module","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Module"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","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/admin/access-logs/export.csv":{"get":{"tags":["Admin"],"summary":"Admin Access Logs Csv","operationId":"admin_access_logs_csv_api_admin_access_logs_export_csv_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}},{"name":"module","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Module"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/api-trace":{"post":{"tags":["Portail Client"],"summary":"Me Api Trace","description":"Records one API call from the frontend (mutations only, set up by the axios interceptor).","operationId":"me_api_trace_api_me_api_trace_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiTraceCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/api-traces":{"get":{"tags":["Admin"],"summary":"Admin Api Traces","operationId":"admin_api_traces_api_admin_api_traces_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}},{"name":"method","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Method"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"only_errors","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Only Errors"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","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"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Clear Api Traces","operationId":"admin_clear_api_traces_api_admin_api_traces_delete","security":[{"HTTPBearer":[]}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/api-traces/export.csv":{"get":{"tags":["Admin"],"summary":"Admin Api Traces Csv","operationId":"admin_api_traces_csv_api_admin_api_traces_export_csv_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email"}},{"name":"method","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Method"}},{"name":"only_errors","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Only Errors"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/health-stats":{"get":{"tags":["Admin"],"summary":"Admin Health Stats","operationId":"admin_health_stats_api_admin_health_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"window_hours","in":"query","required":false,"schema":{"type":"integer","default":24,"title":"Window Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/health/test-email":{"post":{"tags":["Admin"],"summary":"Admin Health Test Email","operationId":"admin_health_test_email_api_admin_health_test_email_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/health/run-weekly-now":{"post":{"tags":["Admin"],"summary":"Admin Health Run Weekly Now","operationId":"admin_health_run_weekly_now_api_admin_health_run_weekly_now_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/health/auth-check":{"post":{"tags":["Admin"],"summary":"Admin Health Auth Check Now","operationId":"admin_health_auth_check_now_api_admin_health_auth_check_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/health/auth-check/history":{"get":{"tags":["Admin"],"summary":"Admin Health Auth Check History","operationId":"admin_health_auth_check_history_api_admin_health_auth_check_history_get","security":[{"HTTPBearer":[]}],"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"}}}}}}},"/api/admin/health/auth-check/latest":{"get":{"tags":["Admin"],"summary":"Admin Health Auth Check Latest","operationId":"admin_health_auth_check_latest_api_admin_health_auth_check_latest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/health/uptime/run-now":{"post":{"tags":["Admin"],"summary":"Admin Health Uptime Run Now","operationId":"admin_health_uptime_run_now_api_admin_health_uptime_run_now_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/health/uptime/stats":{"get":{"tags":["Admin"],"summary":"Admin Health Uptime Stats","operationId":"admin_health_uptime_stats_api_admin_health_uptime_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"window_hours","in":"query","required":false,"schema":{"type":"integer","default":168,"title":"Window Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/status":{"get":{"tags":["Public"],"summary":"Public Status","description":"Données de la page de statut publique (accessible à tous). Uniquement les sondes flag public.","operationId":"public_status_api_public_status_get","parameters":[{"name":"window_hours","in":"query","required":false,"schema":{"type":"integer","default":168,"title":"Window Hours"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/db":{"get":{"tags":["Admin"],"summary":"Admin List Collections","operationId":"admin_list_collections_api_admin_db_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/db/{collection}":{"get":{"tags":["Admin"],"summary":"Admin Query Collection","description":"Generic JSON query over any whitelisted collection.\n\nSupports special suffixes on filter keys:\n  - `key__regex=pattern` (case-insensitive)\n  - `key__gte=...` `key__lte=...` `key__gt=...` `key__lt=...` `key__ne=...`\n  - `key=value` (exact match; booleans and integers auto-coerced)\nReserved query params: `limit`, `sort_by`, `sort_dir`.","operationId":"admin_query_collection_api_admin_db__collection__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"collection","in":"path","required":true,"schema":{"type":"string","title":"Collection"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sort By"}},{"name":"sort_dir","in":"query","required":false,"schema":{"type":"integer","default":-1,"title":"Sort Dir"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/ui-flags":{"get":{"tags":["Public"],"summary":"Public Ui Flags","description":"Iter40-route-loader (S051) + Iter40-ui-flags — Tiny anonymous endpoint\nexposing only the UI display toggles and public branding fields needed by\nfrontend components that mount BEFORE auth (e.g. GlobalRouteLoader, brand\ncolor CSS variable, public logo). NEVER expose secrets here.","operationId":"public_ui_flags_api_public_ui_flags_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/settings":{"get":{"tags":["Admin"],"summary":"Admin Get Settings","operationId":"admin_get_settings_api_admin_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin"],"summary":"Admin Update Settings","operationId":"admin_update_settings_api_admin_settings_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/public/incidents":{"get":{"tags":["Public"],"summary":"Public List Incidents","description":"Timeline publique des incidents (résolus + en cours). Utilisé par la page /uptime.","operationId":"public_list_incidents_api_public_incidents_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Public — Incidents Webhook"],"summary":"Public Incidents Webhook","description":"Reçoit un incident depuis un serveur tiers (Watchdog, Uptime-Bot,\nAizenta…).\n\nAuth : mot de passe simple. Le header `X-Webhook-Password` est\nprioritaire sur le champ `password` du body.\n\nFormats acceptés :\n  1. Générique : `{title, description?, severity?, source?, metadata?}`\n  2. **Aizenta** : `{TicketDemnde: {TypeTicket, Motif, CompteClient, ...}}`\n     (mappé automatiquement vers le format générique).","operationId":"public_incidents_webhook_api_public_incidents_post","parameters":[{"name":"X-Webhook-Password","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Webhook-Password"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/incidents/subscribe":{"post":{"tags":["Public"],"summary":"Public Subscribe To Incidents","operationId":"public_subscribe_to_incidents_api_public_incidents_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentSubscribeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/incidents/confirm":{"get":{"tags":["Public"],"summary":"Public Confirm Subscription","operationId":"public_confirm_subscription_api_public_incidents_confirm_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/incidents/unsubscribe":{"get":{"tags":["Public"],"summary":"Public Unsubscribe","operationId":"public_unsubscribe_api_public_incidents_unsubscribe_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/incident-subscribers":{"get":{"tags":["Admin"],"summary":"Admin List Subscribers","operationId":"admin_list_subscribers_api_admin_incident_subscribers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/incident-subscribers/{sub_id}":{"delete":{"tags":["Admin"],"summary":"Admin Delete Subscriber","operationId":"admin_delete_subscriber_api_admin_incident_subscribers__sub_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/google/auth-url":{"get":{"tags":["Admin"],"summary":"Admin Google Auth Url","operationId":"admin_google_auth_url_api_admin_google_auth_url_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/google/callback":{"get":{"tags":["Admin"],"summary":"Admin Google Callback","operationId":"admin_google_callback_api_admin_google_callback_get","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/google/disconnect":{"post":{"tags":["Admin"],"summary":"Admin Google Disconnect","operationId":"admin_google_disconnect_api_admin_google_disconnect_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/google/test-connection":{"get":{"tags":["Admin"],"summary":"Admin Google Test Connection","operationId":"admin_google_test_connection_api_admin_google_test_connection_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/api-routes":{"get":{"tags":["Documentation"],"summary":"List Api Routes","description":"Liste tous les endpoints disponibles (pour la page /api-docs).","operationId":"list_api_routes_api_api_routes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/testimonials":{"get":{"tags":["Public"],"summary":"List Published Testimonials","description":"Liste les témoignages clients publiés (pour le site public).","operationId":"list_published_testimonials_api_testimonials_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/testimonials/stats":{"get":{"tags":["Public"],"summary":"Testimonials Stats","description":"Statistiques NPS publiques (basées uniquement sur les témoignages publiés).","operationId":"testimonials_stats_api_testimonials_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/feedback/{token}":{"get":{"tags":["Public"],"summary":"Get Feedback Form","description":"Récupère les infos d'un RDV via son feedback_token (formulaire NPS public).","operationId":"get_feedback_form_api_feedback__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Public"],"summary":"Submit Feedback","description":"Soumet un témoignage NPS via le feedback_token. payload: {score:int, comment:str, allow_publish:bool}","operationId":"submit_feedback_api_feedback__token__post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/testimonials":{"get":{"tags":["Admin"],"summary":"Admin List Testimonials","operationId":"admin_list_testimonials_api_admin_testimonials_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Admin Create Testimonial","description":"Création manuelle d'un témoignage par l'admin.\n\nChamps : client_name (req), comment, score (0-10), rating_5 (1-5),\nclient_company, city, country, photo_url, subject, status (default published),\nallow_publish (default True).","operationId":"admin_create_testimonial_api_admin_testimonials_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/testimonials/{tid}":{"put":{"tags":["Admin"],"summary":"Admin Update Testimonial","description":"Modère ou modifie un témoignage. Champs supportés : status, comment, client_name,\nclient_company, city, country, photo_url, score, rating_5, subject, allow_publish.","operationId":"admin_update_testimonial_api_admin_testimonials__tid__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","title":"Tid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Testimonial","operationId":"admin_delete_testimonial_api_admin_testimonials__tid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","title":"Tid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/testimonials/request/{appt_id}":{"post":{"tags":["Admin"],"summary":"Admin Request Feedback","description":"Génère/regénère un feedback_token pour un RDV (le admin peut ensuite copier le lien et l'envoyer).","operationId":"admin_request_feedback_api_admin_testimonials_request__appt_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"appt_id","in":"path","required":true,"schema":{"type":"string","title":"Appt Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/sitemap.xml":{"get":{"tags":["Public"],"summary":"Public Sitemap","description":"Génère un sitemap XML dynamique conforme au protocole sitemaps.org.\n\nInclut :\n  - Pages publiques statiques (accueil, missions, spécialisations,\n    catalogue, contact, RDV, témoignages, blog, études de cas,\n    abonnements, documentation, politiques, privacy).\n  - Articles de blog publiés (`/blog/:slug`).\n  - Études de cas publiées (`/etudes-de-cas/:slug`).\n  - Pages politiques (`/politiques/:slug`).\n\nL'URL de base est résolue dans cet ordre :\n  1. Header `Origin`/`Host` de la requête (≈ domaine d'accès actuel).\n  2. Settings DB `public_base_url`.\n  3. Variable d'env `PUBLIC_BASE_URL`.","operationId":"public_sitemap_api_sitemap_xml_head","responses":{"200":{"description":"Successful Response"}}},"head":{"tags":["Public"],"summary":"Public Sitemap","description":"Génère un sitemap XML dynamique conforme au protocole sitemaps.org.\n\nInclut :\n  - Pages publiques statiques (accueil, missions, spécialisations,\n    catalogue, contact, RDV, témoignages, blog, études de cas,\n    abonnements, documentation, politiques, privacy).\n  - Articles de blog publiés (`/blog/:slug`).\n  - Études de cas publiées (`/etudes-de-cas/:slug`).\n  - Pages politiques (`/politiques/:slug`).\n\nL'URL de base est résolue dans cet ordre :\n  1. Header `Origin`/`Host` de la requête (≈ domaine d'accès actuel).\n  2. Settings DB `public_base_url`.\n  3. Variable d'env `PUBLIC_BASE_URL`.","operationId":"public_sitemap_api_sitemap_xml_head","responses":{"200":{"description":"Successful Response"}}}},"/api/robots.txt":{"get":{"tags":["Public"],"summary":"Public Robots","description":"Robots.txt dynamique pointant vers le sitemap.xml généré côté backend.\nNote : un fichier statique `/app/frontend/public/robots.txt` est également\nservi par le frontend (utile car Google va le chercher à la racine du\ndomaine, hors préfixe `/api`). Les deux ont le même contenu pour cohérence.","operationId":"public_robots_api_robots_txt_head","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}},"head":{"tags":["Public"],"summary":"Public Robots","description":"Robots.txt dynamique pointant vers le sitemap.xml généré côté backend.\nNote : un fichier statique `/app/frontend/public/robots.txt` est également\nservi par le frontend (utile car Google va le chercher à la racine du\ndomaine, hors préfixe `/api`). Les deux ont le même contenu pour cohérence.","operationId":"public_robots_api_robots_txt_head","responses":{"200":{"description":"Successful Response","content":{"text/plain":{"schema":{"type":"string"}}}}}}},"/api/case-studies":{"get":{"tags":["Public"],"summary":"List Case Studies","operationId":"list_case_studies_api_case_studies_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/case-studies":{"get":{"tags":["Admin"],"summary":"Admin List Case Studies","operationId":"admin_list_case_studies_api_admin_case_studies_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Admin Create Case Study","operationId":"admin_create_case_study_api_admin_case_studies_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/case-studies/{cs_id}":{"put":{"tags":["Admin"],"summary":"Admin Update Case Study","operationId":"admin_update_case_study_api_admin_case_studies__cs_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cs_id","in":"path","required":true,"schema":{"type":"string","title":"Cs Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Case Study","operationId":"admin_delete_case_study_api_admin_case_studies__cs_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cs_id","in":"path","required":true,"schema":{"type":"string","title":"Cs Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/blog":{"get":{"tags":["Public"],"summary":"List Blog Posts","operationId":"list_blog_posts_api_blog_get","parameters":[{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/blog/tags":{"get":{"tags":["Public"],"summary":"List Blog Tags","operationId":"list_blog_tags_api_blog_tags_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/blog/{slug}":{"get":{"tags":["Public"],"summary":"Get Blog Post","operationId":"get_blog_post_api_blog__slug__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/admin/blog":{"get":{"tags":["Admin"],"summary":"Admin List Blog","operationId":"admin_list_blog_api_admin_blog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Admin Create Blog","operationId":"admin_create_blog_api_admin_blog_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/blog/{post_id}":{"get":{"tags":["Admin"],"summary":"Admin Get Blog","operationId":"admin_get_blog_api_admin_blog__post_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Admin"],"summary":"Admin Update Blog","operationId":"admin_update_blog_api_admin_blog__post_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Blog","operationId":"admin_delete_blog_api_admin_blog__post_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newsletter/subscribe":{"post":{"tags":["Public"],"summary":"Newsletter Subscribe","operationId":"newsletter_subscribe_api_newsletter_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newsletter/unsubscribe":{"post":{"tags":["Public"],"summary":"Newsletter Unsubscribe","operationId":"newsletter_unsubscribe_api_newsletter_unsubscribe_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/newsletter":{"get":{"tags":["Admin"],"summary":"Admin List Newsletter","operationId":"admin_list_newsletter_api_admin_newsletter_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/newsletter/{sub_id}":{"delete":{"tags":["Admin"],"summary":"Admin Delete Newsletter","operationId":"admin_delete_newsletter_api_admin_newsletter__sub_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/newsletter/export":{"get":{"tags":["Admin"],"summary":"Admin Export Newsletter","description":"Export CSV de tous les abonnés (séparateur virgule).","operationId":"admin_export_newsletter_api_admin_newsletter_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/recent-activity":{"get":{"tags":["Portail Client"],"summary":"Me Recent Activity","description":"Return new activity events for the user's visible scope since the\n`since` ISO timestamp. The frontend uses this to display floating\ntoasts in near real-time. Events triggered by the requester are\nreturned so the client can decide to suppress them locally.","operationId":"me_recent_activity_api_me_recent_activity_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/notifications/counts":{"get":{"tags":["Portail Client"],"summary":"Me Notifications Counts","description":"Return the count of new items per module since the user last visited that module.","operationId":"me_notifications_counts_api_me_notifications_counts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/contacts/export.csv":{"get":{"tags":["Portail Client"],"summary":"Me Export Contacts Csv","description":"Iter34w — Export the directory as CSV (Excel-compatible, UTF-8 BOM).","operationId":"me_export_contacts_csv_api_me_contacts_export_csv_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/contacts/export.json":{"get":{"tags":["Portail Client"],"summary":"Me Export Contacts Json","operationId":"me_export_contacts_json_api_me_contacts_export_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/contacts/export.pdf":{"get":{"tags":["Portail Client"],"summary":"Me Export Contacts Pdf","description":"Iter34w — Generate a PDF listing of the visible directory (ReportLab).","operationId":"me_export_contacts_pdf_api_me_contacts_export_pdf_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/contacts":{"get":{"tags":["Portail Client"],"summary":"Me List Contacts","description":"Liste TOUS les contacts dans le scope du client de l'utilisateur.\n\nSharing model (iter29 onward, refined iter34): every contact created by\nANY user of a client is visible to every other user of the same client\n(mirrors the shared-bank model already used by the Media Library). The\nlegacy `shared` boolean is preserved on existing rows for traceability but\nno longer gates visibility. Iter34 widens the scope by also including any\nother client_id belonging to a peer user with the SAME company name —\nthis bridges historical client_id misalignments without forcing a manual\nrealign. RGPD: per-client anonymization flags still apply for non-\nprivileged roles, regardless of who owns the contact.\n\nIter43-fix5 — Enrichit chaque contact d'un champ `last_interaction_at`\n(max des timestamps WA + SMS pour les digits-10 du numéro WA/téléphone).\nPermet au frontend de trier par date d'interaction décroissante par défaut.","operationId":"me_list_contacts_api_me_contacts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Portail Client"],"summary":"Me Create Contact","operationId":"me_create_contact_api_me_contacts_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DirectoryContactCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/contacts/{cid}":{"put":{"tags":["Portail Client"],"summary":"Me Update Contact","operationId":"me_update_contact_api_me_contacts__cid__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DirectoryContactUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Portail Client"],"summary":"Me Delete Contact","operationId":"me_delete_contact_api_me_contacts__cid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/contacts/{cid}/photo":{"post":{"tags":["Portail Client"],"summary":"Me Upload Contact Photo","description":"Upload a profile picture for a contact (à la WhatsApp avatar). Stored in\n/api/files/ and the contact's `photo_url` field is set to the public URL.\nOwner, admin, superviseur, or any user in the same client_scope. Max 5 MiB.\nPNG/JPEG/WEBP only.\nIter37f — Same collaborative ACL as PUT /me/contacts/{cid}.","operationId":"me_upload_contact_photo_api_me_contacts__cid__photo_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_me_upload_contact_photo_api_me_contacts__cid__photo_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Portail Client"],"summary":"Me Delete Contact Photo","description":"Remove a contact's profile picture (sets photo_url to null).\nIter37f — Same collaborative ACL as PUT /me/contacts/{cid}.","operationId":"me_delete_contact_photo_api_me_contacts__cid__photo_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/contacts/{cid}/wa-sync":{"post":{"tags":["Portail Client"],"summary":"Me Contact Wa Sync","description":"Read the latest WhatsApp profile name we observed for this contact's\nphone in inbound messages and store it on the contact. Returns the\nsuggested name so the UI can prompt the user before overwriting.","operationId":"me_contact_wa_sync_api_me_contacts__cid__wa_sync_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/wa-pending-imports":{"get":{"tags":["Portail Client"],"summary":"Me List Wa Pending Imports","description":"Liste les numéros de téléphone inconnus ayant écrit à notre WhatsApp Business\nline but aren't yet in the directory. Sorted by last_seen_at desc.","operationId":"me_list_wa_pending_imports_api_me_wa_pending_imports_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/wa-import-by-phone":{"post":{"tags":["Portail Client"],"summary":"Me Wa Import By Phone","description":"Crée un contact d'annuaire directement depuis un numéro de téléphone (utilisé par\nDashboard's \"Top expéditeurs\" card when the user clicks Import on a sender\nthat's not yet in the directory).","operationId":"me_wa_import_by_phone_api_me_wa_import_by_phone_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaImportByPhoneRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/wa-pending-imports/{pending_id}/import":{"post":{"tags":["Portail Client"],"summary":"Me Import Wa Pending","description":"Promote a pending WA inbound to a full directory contact. Optionally\noverrides the suggested name.","operationId":"me_import_wa_pending_api_me_wa_pending_imports__pending_id__import_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pending_id","in":"path","required":true,"schema":{"type":"string","title":"Pending Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaPendingImportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/wa-pending-imports/{pending_id}":{"delete":{"tags":["Portail Client"],"summary":"Me Dismiss Wa Pending","description":"Permanently dismiss a pending WA inbound (won't reappear unless they\nwrite to us again).","operationId":"me_dismiss_wa_pending_api_me_wa_pending_imports__pending_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pending_id","in":"path","required":true,"schema":{"type":"string","title":"Pending Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/whatsapp/send":{"post":{"tags":["Portail Client"],"summary":"Me Whatsapp Send","operationId":"me_whatsapp_send_api_me_whatsapp_send_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhatsAppSendRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/whatsapp/history":{"get":{"tags":["Portail Client"],"summary":"Me Whatsapp History","operationId":"me_whatsapp_history_api_me_whatsapp_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/wa-silent-drops":{"get":{"tags":["WhatsApp"],"summary":"List Drops","operationId":"list_drops_api_admin_wa_silent_drops_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"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"}}}}}},"delete":{"tags":["WhatsApp"],"summary":"Clear Drops","description":"Purge all recorded drops (audit/reset).","operationId":"clear_drops_api_admin_wa_silent_drops_delete","security":[{"HTTPBearer":[]}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/wa-silent-drops/stats":{"get":{"tags":["WhatsApp"],"summary":"Drops Stats","operationId":"drops_stats_api_admin_wa_silent_drops_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/wa-silent-drops/config":{"put":{"tags":["WhatsApp"],"summary":"Update Config","operationId":"update_config_api_admin_wa_silent_drops_config_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaAlertConfigUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/wa-silent-drops/test-alert":{"post":{"tags":["WhatsApp"],"summary":"Test Alert","description":"Send a test alert to every configured recipient (bypasses threshold\n+ cooldown). Returns per-recipient delivery status.","operationId":"test_alert_api_admin_wa_silent_drops_test_alert_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/whatsapp/send-text":{"post":{"tags":["Portail Client"],"summary":"Me Whatsapp Send Text","description":"Envoie un message texte WhatsApp libre — autorisé uniquement dans la fenêtre Meta de 24h\ncustomer service window (i.e. the contact has written to us in the last 24h).","operationId":"me_whatsapp_send_text_api_me_whatsapp_send_text_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhatsAppSendTextRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/whatsapp/send-media":{"post":{"tags":["Portail Client"],"summary":"Me Whatsapp Send Media","description":"Envoie un message média WhatsApp libre dans la fenêtre Meta de 24h.","operationId":"me_whatsapp_send_media_api_me_whatsapp_send_media_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_me_whatsapp_send_media_api_me_whatsapp_send_media_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/whatsapp/messages/{msg_id}/save-to-library":{"post":{"tags":["Portail Client"],"summary":"Me Whatsapp Save To Library","description":"Register an inbound WhatsApp media in the shared client media library.","operationId":"me_whatsapp_save_to_library_api_me_whatsapp_messages__msg_id__save_to_library_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"msg_id","in":"path","required":true,"schema":{"type":"string","title":"Msg Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveToLibraryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/dashboard/wa-media-summary":{"get":{"tags":["Portail Client"],"summary":"Me Wa Media Summary","description":"Renvoie une synthèse des médias WhatsApp entrants reçus durant les `days` derniers jours.\n\nShape:\n  {\n    days, counts: {image, audio, video, document, total},\n    top_contacts: [ {phone_digits, contact_name, count} … ],\n    last_items: [ {id, kind, media_url, media_filename, from, contact_name, received_at, voice_note_transcript?} … ],\n  }","operationId":"me_wa_media_summary_api_me_dashboard_wa_media_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/dashboard/wa-reply-stats":{"get":{"tags":["Portail Client"],"summary":"Me Wa Reply Stats","description":"Renvoie les agrégats de temps de réponse WhatsApp par utilisateur sur la fenêtre courante.\n\nShape:\n  {\n    days,\n    me: {avg_seconds, median_seconds, replies, fastest_seconds},\n    team: [{user_id, label, avg_seconds, replies, fastest_seconds} …]  // elevated only\n  }","operationId":"me_wa_reply_stats_api_me_dashboard_wa_reply_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/whatsapp/messages/{message_id}/recall":{"patch":{"tags":["Portail Client"],"summary":"Me Whatsapp Recall Message","description":"Soft-recall an outbound WA message.\n\nBusiness rules:\n  - Must be outbound (only the sender can recall).\n  - Must be in caller's visible scope.\n  - Refuses if `wa_status == 'read'` (destinataire l'a déjà lu).\n  - Refuses if message is older than 15 minutes (fenêtre éditeur).\n  - Marks doc with `is_recalled=True`, `recalled_at=now`, `recalled_by_id`.","operationId":"me_whatsapp_recall_message_api_me_whatsapp_messages__message_id__recall_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/whatsapp/unread":{"get":{"tags":["Portail Client"],"summary":"Me Whatsapp Unread","description":"Renvoie les compteurs de non-lus par contact + un total global des messages WA entrants\nwhere `read_by_us_at` is null. Used by the sidebar badge and per-contact pastille.\n\nIter34p — Uses _resolve_visible_client_ids so pastilles stay accurate\nafter a realignment (the contact_ids reported here match the ones the\nuser sees through /me/contacts).","operationId":"me_whatsapp_unread_api_me_whatsapp_unread_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/contacts/{cid}/messages/mark-read":{"post":{"tags":["Portail Client"],"summary":"Me Contact Messages Mark Read","description":"Marque tous les messages WA entrants d'un contact donné comme lus (fixe read_by_us_at).","operationId":"me_contact_messages_mark_read_api_me_contacts__cid__messages_mark_read_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/sms/providers":{"get":{"tags":["Portail Client"],"summary":"Me Sms Providers","description":"Tell the portal which SMS providers are configured + the default one.","operationId":"me_sms_providers_api_me_sms_providers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/sms/send":{"post":{"tags":["Portail Client"],"summary":"Me Sms Send","operationId":"me_sms_send_api_me_sms_send_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeSmsSendRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/sms/messages":{"get":{"tags":["Portail Client"],"summary":"Me Sms Messages","operationId":"me_sms_messages_api_me_sms_messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"contact_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sms/test":{"post":{"tags":["Admin"],"summary":"Admin Sms Test","description":"Send a test SMS using a chosen provider — surfaces the full HTTP response\nso the admin can debug the credentials / payload template quickly.","operationId":"admin_sms_test_api_admin_sms_test_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSmsTestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/sms/bulk":{"post":{"tags":["Portail Client"],"summary":"Me Sms Bulk","operationId":"me_sms_bulk_api_me_sms_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeSmsBulkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/sms/schedules":{"get":{"tags":["Portail Client"],"summary":"Me Sms Schedules","operationId":"me_sms_schedules_api_me_sms_schedules_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/sms/schedules/{sid}":{"delete":{"tags":["Portail Client"],"summary":"Me Sms Schedule Cancel","operationId":"me_sms_schedule_cancel_api_me_sms_schedules__sid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/messaging/schedules":{"get":{"tags":["Portail Client"],"summary":"Me List Schedules","description":"Liste les envois WhatsApp programmés de l'utilisateur. Les admins voient tout ; les utilisateurs portail\nsee schedules they created (created_by_id=user.id).","operationId":"me_list_schedules_api_me_messaging_schedules_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Portail Client"],"summary":"Me Create Schedule","operationId":"me_create_schedule_api_me_messaging_schedules_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeScheduleCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/whatsapp/bulk":{"post":{"tags":["Portail Client"],"summary":"Me Whatsapp Bulk","description":"Envoie un modèle WhatsApp approuvé par Meta à plusieurs contacts CRM en une fois,\nwith per-contact variable personalization (`{{name}}`, `{{company}}`,\n`{{phone}}`, `{{email}}`, `{{client_code}}` = contact's unique_code, etc).\nOptional `scheduled_at` defers execution to the cron runner.\nCaps at 500 recipients per call (same as SMS bulk).","operationId":"me_whatsapp_bulk_api_me_whatsapp_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeWaBulkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/messaging/schedules/{sid}":{"delete":{"tags":["Portail Client"],"summary":"Me Delete Schedule","operationId":"me_delete_schedule_api_me_messaging_schedules__sid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/whatsapp/templates":{"get":{"tags":["Portail Client"],"summary":"Me List Wa Templates","description":"Utilisateurs portail : liste les modèles APPROUVÉS + uniquement ceux marqués disponibles.\nAttaches the admin-maintained description note.","operationId":"me_list_wa_templates_api_me_whatsapp_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/contacts/{cid}/messages":{"get":{"tags":["Portail Client"],"summary":"Me Contact Messages","description":"Renvoie la conversation WhatsApp complète pour un contact de l'annuaire.\nIncludes outbound messages (sent via /me/whatsapp/send), inbound messages\ncaptured by the Meta webhook, and the status-update timeline\n(sent/delivered/read/failed) with timestamps.\n\nIter34p — Uses _resolve_visible_client_ids so the contact stays\naccessible after a realignment/migration even if its client_id matches\na peer/legacy value rather than the viewer's own client_id.","operationId":"me_contact_messages_api_me_contacts__cid__messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/whatsapp/webhook":{"get":{"tags":["Webhook"],"summary":"Whatsapp Webhook Verify","description":"Meta verifies the webhook via GET with hub.mode=subscribe, hub.verify_token, hub.challenge.\nWe must echo hub.challenge as plain text when the verify token matches.","operationId":"whatsapp_webhook_verify_api_whatsapp_webhook_get","parameters":[{"name":"hub.mode","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hub.Mode"}},{"name":"hub.verify_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hub.Verify Token"}},{"name":"hub.challenge","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hub.Challenge"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Webhook"],"summary":"Whatsapp Webhook Incoming","description":"Receive Meta Cloud API events: new inbound messages + outbound status updates.\nShape: {object:'whatsapp_business_account', entry:[{changes:[{value:{...}}]}]}\n\nHardened (iter35a): every webhook hit is persisted to\n`db.wa_webhook_logs` (capped to ~200 entries) with the raw payload + an\nextraction summary so production issues can be diagnosed without server\naccess. Lookup via GET /api/admin/whatsapp/webhook-logs.","operationId":"whatsapp_webhook_incoming_api_whatsapp_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/whatsapp/webhook-logs":{"get":{"tags":["Admin"],"summary":"Admin List Wa Webhook Logs","description":"Iter35a — Read the last `limit` raw webhook payloads received from\nMeta. Useful when inbound messages stop appearing in the UI: lets the\nadmin verify Meta is actually hitting the endpoint and inspect the\nexact payload shape (button vs interactive vs text).","operationId":"admin_list_wa_webhook_logs_api_admin_whatsapp_webhook_logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Clear Wa Webhook Logs","description":"Purge all stored webhook payloads.","operationId":"admin_clear_wa_webhook_logs_api_admin_whatsapp_webhook_logs_delete","security":[{"HTTPBearer":[]}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/whatsapp/silence-check":{"post":{"tags":["Admin"],"summary":"Admin Run Wa Silence Check","description":"Manually run the WhatsApp silence detector (also runs every 4h via cron).\nReturns the counts and whether an alert was fired. Useful for testing\nyour email/Discord webhook configuration.","operationId":"admin_run_wa_silence_check_api_admin_whatsapp_silence_check_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/whatsapp/silence-alerts":{"get":{"tags":["Admin"],"summary":"Admin List Wa Silence Alerts","description":"Liste les alertes de silence passées (piste d'audit).","operationId":"admin_list_wa_silence_alerts_api_admin_whatsapp_silence_alerts_get","security":[{"HTTPBearer":[]}],"parameters":[{"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/integrations/health-check":{"get":{"tags":["Admin"],"summary":"Admin Integration Health Check","description":"Run the integration health check manually (also runs every 4h via cron).\nReturns the live status of Google Calendar + Meta Webhook + whether an\nalert was fired/throttled.","operationId":"admin_integration_health_check_api_admin_integrations_health_check_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/integrations/health-history":{"get":{"tags":["Admin"],"summary":"Admin Integration Health History","description":"Historique des contrôles de santé (audit / monitoring).","operationId":"admin_integration_health_history_api_admin_integrations_health_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/whatsapp/templates":{"get":{"tags":["Admin"],"summary":"Admin List Wa Templates","description":"Liste tous les modèles du WABA configuré + fusionne les notes admin (description + disponibilité).","operationId":"admin_list_wa_templates_api_admin_whatsapp_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Admin Create Wa Template","description":"Submit a new template to Meta for approval.\nPer Meta: name must be lowercase letters/digits/underscores, body is mandatory,\n{{1}}…{{N}} placeholders need example values.","operationId":"admin_create_wa_template_api_admin_whatsapp_templates_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaTemplateCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/whatsapp/token-health":{"get":{"tags":["Admin"],"summary":"Admin Wa Token Health","description":"Iter43-fix3 (2026-03) — Diagnostic du token WhatsApp Cloud API.\n\nLe pattern « marche 2 jours puis brusquement plus rien » est typique des\ntokens **utilisateur courts** (24 h) générés depuis le dashboard Meta.\nCet endpoint appelle `/debug_token` pour révéler :\n  - validité actuelle (`is_valid`)\n  - date d'expiration (`expires_at`, `data_access_expires_at`)\n  - type (USER vs SYSTEM_USER → seul SYSTEM_USER ne peut pas expirer)\n  - scopes accordés\n  - app id propriétaire\nPlus un test fonctionnel sur le `phone_number_id` configuré.\n\nRéponse :\n  {\n    \"ok\": bool, \"token_type\": \"USER\"|\"SYSTEM_USER\", \"is_valid\": bool,\n    \"expires_at\": \"2026-03-31T...Z\" | null,\n    \"days_to_expiry\": float | null,\n    \"scopes\": [...], \"app_id\": str | null,\n    \"phone_check\": {\"ok\": bool, \"display_phone_number\": \"...\", \"verified_name\": \"...\"}\n  }","operationId":"admin_wa_token_health_api_admin_whatsapp_token_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/whatsapp/webhook-subscription":{"get":{"tags":["Admin"],"summary":"Admin Wa Webhook Subscription","description":"Iter43-fix16 (2026-06) — Diagnostic de la souscription du webhook Meta.\n\nSymptôme couvert : « les messages sortants partent bien mais plus aucun\nmessage entrant n'arrive depuis X jours ». Cause type : Meta a retiré\nl'application du WABA (révision en cours, app paused, expiration de la\npermission, etc.) → la souscription `messages` est perdue côté Meta.\n\nAppelle GET /{waba_id}/subscribed_apps pour lister les apps actuellement\nabonnées + leurs `subscribed_fields`. Vérifie qu'au moins une app contient\nle champ `messages`. Retourne aussi le `messaging_product` et le statut\ndu numéro.","operationId":"admin_wa_webhook_subscription_api_admin_whatsapp_webhook_subscription_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/whatsapp/webhook-subscribe":{"post":{"tags":["Admin"],"summary":"Admin Wa Webhook Subscribe","description":"Iter43-fix16 — Re-souscrire l'app Meta au WABA pour rétablir le\nflux des webhooks entrants. Equivalent à POST /{waba_id}/subscribed_apps.\n\nÀ utiliser quand le diagnostic `webhook-subscription` renvoie\n`subscribed_apps: []`. Requiert que le token actuel ait au moins\n`whatsapp_business_management` (ce qui est le cas pour un token capable\nd'envoyer des messages).","operationId":"admin_wa_webhook_subscribe_api_admin_whatsapp_webhook_subscribe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/whatsapp/simulate-inbound":{"post":{"tags":["Admin"],"summary":"Admin Wa Simulate Inbound","description":"Synthétise un payload Meta WhatsApp inbound et le route à travers\nle vrai handler. Permet de valider le pipeline message_center +\nnotifications + Liluvine SANS dépendre de Meta. Renvoie un résumé\n(msg id inséré, AI reply, etc.).","operationId":"admin_wa_simulate_inbound_api_admin_whatsapp_simulate_inbound_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_SimulateInboundPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/whatsapp/template-notes":{"get":{"tags":["Admin"],"summary":"Admin List Template Notes","operationId":"admin_list_template_notes_api_admin_whatsapp_template_notes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/whatsapp/template-notes/{name}":{"put":{"tags":["Admin"],"summary":"Admin Upsert Template Note","operationId":"admin_upsert_template_note_api_admin_whatsapp_template_notes__name__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WaTemplateNoteUpsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Template Note","operationId":"admin_delete_template_note_api_admin_whatsapp_template_notes__name__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/whatsapp/templates/{name}":{"delete":{"tags":["Admin"],"summary":"Admin Delete Wa Template","description":"Supprime un modèle par nom (supprime TOUTES les langues de ce nom sur le WABA).","operationId":"admin_delete_wa_template_api_admin_whatsapp_templates__name__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/whatsapp/test-config":{"post":{"tags":["Admin"],"summary":"Admin Test Wa Config","description":"Validate Meta credentials by probing Graph API for WABA + phone number.\nReturns {ok, checks:[{key,label,ok,detail}], summary}.","operationId":"admin_test_wa_config_api_admin_whatsapp_test_config_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/messaging/audience":{"get":{"tags":["Admin"],"summary":"Admin Messaging Audience","description":"Return all contactable recipients (clients with phone/whatsapp + tracked users with phone).\n\nS-iter39d (fix #5) — Each row is enriched with `last_message_at`, the\ntimestamp of the most recent inbound or outbound WhatsApp/SMS message\nassociated with the row's phone digits. The Messaging Center frontend\nsorts on this field so that recently-touched contacts surface first.","operationId":"admin_messaging_audience_api_admin_messaging_audience_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/messaging/bulk-send":{"post":{"tags":["Admin"],"summary":"Admin Messaging Bulk Send","description":"Envoie le même modèle WhatsApp à une liste de destinataires. Renvoie un résultat par destinataire.","operationId":"admin_messaging_bulk_send_api_admin_messaging_bulk_send_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminBulkSendRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/messaging/history":{"get":{"tags":["Admin"],"summary":"Admin Messaging History","operationId":"admin_messaging_history_api_admin_messaging_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/messaging/variable-tokens":{"get":{"tags":["Admin"],"summary":"Admin Messaging Variable Tokens","description":"Liste des tokens de substitution que l'admin peut insérer dans les variables de modèle.\nResolved per-recipient at send time from the client or tracked-user profile.","operationId":"admin_messaging_variable_tokens_api_admin_messaging_variable_tokens_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/messaging/variable-tokens":{"get":{"tags":["Portail Client"],"summary":"Me Messaging Variable Tokens","description":"Portal mirror of variable tokens. Same resolution at send time.","operationId":"me_messaging_variable_tokens_api_me_messaging_variable_tokens_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/automations":{"get":{"tags":["Admin"],"summary":"Admin List Automations","operationId":"admin_list_automations_api_admin_automations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Admin Create Automation","operationId":"admin_create_automation_api_admin_automations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/automations/events":{"get":{"tags":["Admin"],"summary":"Admin Automation Events","operationId":"admin_automation_events_api_admin_automations_events_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/automations/{aid}":{"put":{"tags":["Admin"],"summary":"Admin Update Automation","operationId":"admin_update_automation_api_admin_automations__aid__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"string","title":"Aid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Automation","operationId":"admin_delete_automation_api_admin_automations__aid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"string","title":"Aid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/messaging/schedules":{"get":{"tags":["Admin"],"summary":"Admin List Schedules","operationId":"admin_list_schedules_api_admin_messaging_schedules_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Admin Create Schedule","operationId":"admin_create_schedule_api_admin_messaging_schedules_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminScheduleCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/messaging/schedules/{sid}":{"delete":{"tags":["Admin"],"summary":"Admin Delete Schedule","operationId":"admin_delete_schedule_api_admin_messaging_schedules__sid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/forms":{"get":{"tags":["Formulaires"],"summary":"Me List Forms","description":"Liste les formulaires : tous ceux du client de l'utilisateur + tous les formulaires publics d'autres clients.\n\n2026-02 fork (P5) — filtre supplémentaire `access_client_ids` : quand\nnon-vide, restreint aux tenants explicitement autorisés (admin bypass).","operationId":"me_list_forms_api_me_forms_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Formulaires"],"summary":"Me Create Form","operationId":"me_create_form_api_me_forms_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/forms/title-suggestions":{"get":{"tags":["Formulaires"],"summary":"Me Forms Title Suggestions","operationId":"me_forms_title_suggestions_api_me_forms_title_suggestions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/forms/{form_id}":{"get":{"tags":["Formulaires"],"summary":"Me Get Form","operationId":"me_get_form_api_me_forms__form_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Formulaires"],"summary":"Me Update Form","operationId":"me_update_form_api_me_forms__form_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Formulaires"],"summary":"Me Delete Form","operationId":"me_delete_form_api_me_forms__form_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/forms/{form_id}/import":{"post":{"tags":["Formulaires"],"summary":"Me Import Form","description":"Duplicate a public form into the current client's scope (numbered & owned by them).","operationId":"me_import_form_api_me_forms__form_id__import_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/forms/{form_id}/submission":{"get":{"tags":["Formulaires"],"summary":"Me Get My Submission","description":"Renvoie la soumission de l'utilisateur courant pour le formulaire (ou un stub vide).","operationId":"me_get_my_submission_api_me_forms__form_id__submission_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Formulaires"],"summary":"Me Save Submission","operationId":"me_save_submission_api_me_forms__form_id__submission_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionSave"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/forms/{form_id}/upload":{"post":{"tags":["Formulaires"],"summary":"Me Form Upload File","description":"Per-form file attachment uploader (max 1 Mo). Used by the new \"file\" field\ntype. Returns a stable public URL stored on the submission's data dict.","operationId":"me_form_upload_file_api_me_forms__form_id__upload_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_me_form_upload_file_api_me_forms__form_id__upload_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/forms/{form_id}/submissions":{"get":{"tags":["Formulaires"],"summary":"Me List Form Submissions","description":"Liste toutes les soumissions d'un formulaire — propriétaire/admin uniquement.","operationId":"me_list_form_submissions_api_me_forms__form_id__submissions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/forms/{form_id}":{"get":{"tags":["Public"],"summary":"Public Get Form","description":"Récupère un formulaire public en anonyme — fonctionne uniquement si `is_public=True`.","operationId":"public_get_form_api_public_forms__form_id__get","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/forms/{form_id}/submission":{"post":{"tags":["Public"],"summary":"Public Submit Form","operationId":"public_submit_form_api_public_forms__form_id__submission_post","parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicSubmissionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/forms-analytics":{"get":{"tags":["Formulaires"],"summary":"Me Forms Analytics Global","description":"Analyses globales sur tous les formulaires visibles par l'utilisateur.\n- Admin : tous les formulaires.\n- Client : tous ses formulaires.","operationId":"me_forms_analytics_global_api_me_forms_analytics_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/forms/{form_id}/analytics":{"get":{"tags":["Formulaires"],"summary":"Me Form Analytics Detail","operationId":"me_form_analytics_detail_api_me_forms__form_id__analytics_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/forms/{form_id}/submissions-table":{"get":{"tags":["Formulaires"],"summary":"Me Form Submissions Table","operationId":"me_form_submissions_table_api_me_forms__form_id__submissions_table_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":5000,"minimum":1,"default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/forms/{form_id}/analytics/export.csv":{"get":{"tags":["Formulaires"],"summary":"Me Form Analytics Csv","description":"CSV export of all submissions for a form (flat answers + metadata).","operationId":"me_form_analytics_csv_api_me_forms__form_id__analytics_export_csv_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"form_id","in":"path","required":true,"schema":{"type":"string","title":"Form Id"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/notifications/mark-seen":{"post":{"tags":["Portail Client"],"summary":"Me Notifications Mark Seen","description":"Mark a module as visited (resets its badge counter to 0).","operationId":"me_notifications_mark_seen_api_me_notifications_mark_seen_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkSeenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/integrations/link-actions":{"get":{"tags":["Admin"],"summary":"Integrations Link Actions","description":"Liste les actions deep-link supportées pour le dropdown admin UI.","operationId":"integrations_link_actions_api_integrations_link_actions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/integrations/build-link":{"post":{"tags":["Admin"],"summary":"Integrations Build Link","operationId":"integrations_build_link_api_integrations_build_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuildLinkRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/integrations/resolve-link":{"get":{"tags":["Public"],"summary":"Integrations Resolve Link","description":"Endpoint public — décode un jeton de lien, renvoie ses claims pour que la SPA\ncan redirect the user to the right route. Never raises on bad tokens;\nreturns {valid: false, reason}.","operationId":"integrations_resolve_link_api_integrations_resolve_link_get","parameters":[{"name":"t","in":"query","required":true,"schema":{"type":"string","title":"T"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/track":{"post":{"tags":["Public"],"summary":"Track Visit","description":"Enregistre une visite et la transmet (si configuré) à l'API REST externe.\nGeo enrichment is performed in the background so /track always returns instantly.","operationId":"track_visit_api_track_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/visits":{"get":{"tags":["Admin"],"summary":"Admin List Visits","operationId":"admin_list_visits_api_admin_visits_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/visits/stats":{"get":{"tags":["Admin"],"summary":"Admin Visits Stats","operationId":"admin_visits_stats_api_admin_visits_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/visits/count":{"get":{"tags":["Public"],"summary":"Public Visit Count","description":"Total visit counter for the public homepage. Includes admin-tunable offset.","operationId":"public_visit_count_api_visits_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/visits/trend":{"get":{"tags":["Public"],"summary":"Public Visit Trend","description":"Daily visit counts for the last N days (default 7), oldest first.\nUsed by the homepage ticker sparkline.","operationId":"public_visit_trend_api_visits_trend_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":7,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/visits/reset":{"post":{"tags":["Admin"],"summary":"Admin Reset Visit Counter","description":"Resets the publicly displayed visits counter to zero (real visits\nremain in DB by default — only the offset moves).\n\nIter34i: When `purge_access_logs=true`, also wipes `db.access_logs` and\n`db.visits` so the platform restarts from a clean analytics slate. The\nsetting `usage_reset_at` is recorded so the UI can show \"Compteur réinitialisé\nle …\" rather than confusing the admin with stale histograms.","operationId":"admin_reset_visit_counter_api_admin_visits_reset_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/formations":{"get":{"tags":["Admin"],"summary":"Admin List Formations","operationId":"admin_list_formations_api_admin_formations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Admin Create Formation","operationId":"admin_create_formation_api_admin_formations_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormationCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/formations/{fid}":{"put":{"tags":["Admin"],"summary":"Admin Update Formation","operationId":"admin_update_formation_api_admin_formations__fid__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"string","title":"Fid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormationUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Formation","operationId":"admin_delete_formation_api_admin_formations__fid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"string","title":"Fid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/formations/{fid}/modules":{"get":{"tags":["Admin"],"summary":"Admin List Modules","operationId":"admin_list_modules_api_admin_formations__fid__modules_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"string","title":"Fid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin"],"summary":"Admin Create Module","operationId":"admin_create_module_api_admin_formations__fid__modules_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"string","title":"Fid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormationModuleCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/formations/{fid}/modules/{mid}":{"put":{"tags":["Admin"],"summary":"Admin Update Module","operationId":"admin_update_module_api_admin_formations__fid__modules__mid__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"string","title":"Fid"}},{"name":"mid","in":"path","required":true,"schema":{"type":"string","title":"Mid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormationModuleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Module","operationId":"admin_delete_module_api_admin_formations__fid__modules__mid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"string","title":"Fid"}},{"name":"mid","in":"path","required":true,"schema":{"type":"string","title":"Mid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/formations/{fid}/enrollments":{"get":{"tags":["Admin"],"summary":"Admin List Enrollments","operationId":"admin_list_enrollments_api_admin_formations__fid__enrollments_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"string","title":"Fid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/formations/{fid}/enrollments/{user_id}/credits":{"post":{"tags":["Admin"],"summary":"Admin Adjust Credits","operationId":"admin_adjust_credits_api_admin_formations__fid__enrollments__user_id__credits_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"string","title":"Fid"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormationCreditsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/formations/{fid}/enrollments/{user_id}/state":{"post":{"tags":["Admin"],"summary":"Admin Set Enrollment State","operationId":"admin_set_enrollment_state_api_admin_formations__fid__enrollments__user_id__state_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"string","title":"Fid"}},{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormationStateUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/formations":{"get":{"tags":["Portail Client"],"summary":"Me List Formations","operationId":"me_list_formations_api_me_formations_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/formations/{fid}/enroll":{"post":{"tags":["Portail Client"],"summary":"Me Enroll Formation","operationId":"me_enroll_formation_api_me_formations__fid__enroll_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"string","title":"Fid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/formations/{fid}":{"get":{"tags":["Portail Client"],"summary":"Me Get Formation","operationId":"me_get_formation_api_me_formations__fid__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"string","title":"Fid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/formations/{fid}/modules/{mid}/visit":{"post":{"tags":["Portail Client"],"summary":"Me Visit Module","description":"Mark a module as visited (call when the page is OPENED).","operationId":"me_visit_module_api_me_formations__fid__modules__mid__visit_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"string","title":"Fid"}},{"name":"mid","in":"path","required":true,"schema":{"type":"string","title":"Mid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/formations/{fid}/modules/{mid}/visit/{visit_id}/close":{"post":{"tags":["Portail Client"],"summary":"Me Close Visit","description":"Enregistre la durée une fois que l'utilisateur quitte le module.","operationId":"me_close_visit_api_me_formations__fid__modules__mid__visit__visit_id__close_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"string","title":"Fid"}},{"name":"mid","in":"path","required":true,"schema":{"type":"string","title":"Mid"}},{"name":"visit_id","in":"path","required":true,"schema":{"type":"string","title":"Visit Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/formations/{fid}/modules/{mid}/ask":{"post":{"tags":["Portail Client"],"summary":"Me Module Ask","description":"Transmet la question de l'utilisateur à l'API REST externe du module configurée par l'admin.","operationId":"me_module_ask_api_me_formations__fid__modules__mid__ask_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"string","title":"Fid"}},{"name":"mid","in":"path","required":true,"schema":{"type":"string","title":"Mid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormationModuleQuestion"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/contract-overdue/run":{"post":{"tags":["Admin"],"summary":"Admin Run Contract Overdue Now","description":"2026-02 fork iter104 — Manually trigger the contract overdue scan (for\ndebugging / on-demand run). The daily cron runs at 08:15 Africa/Abidjan.","operationId":"admin_run_contract_overdue_now_api_admin_contract_overdue_run_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/subscriptions/categories":{"get":{"tags":["Admin"],"summary":"Admin List Subscription Categories","operationId":"admin_list_subscription_categories_api_admin_subscriptions_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Admin Create Subscription Category","operationId":"admin_create_subscription_category_api_admin_subscriptions_categories_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionCategoryCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/subscriptions/categories/{cat_id}":{"put":{"tags":["Admin"],"summary":"Admin Update Subscription Category","operationId":"admin_update_subscription_category_api_admin_subscriptions_categories__cat_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cat_id","in":"path","required":true,"schema":{"type":"string","title":"Cat Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionCategoryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Subscription Category","operationId":"admin_delete_subscription_category_api_admin_subscriptions_categories__cat_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cat_id","in":"path","required":true,"schema":{"type":"string","title":"Cat Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/subscriptions/plans":{"get":{"tags":["Admin"],"summary":"Admin List Subscription Plans","operationId":"admin_list_subscription_plans_api_admin_subscriptions_plans_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Admin Create Subscription Plan","operationId":"admin_create_subscription_plan_api_admin_subscriptions_plans_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionPlanCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/subscriptions/plans/{plan_id}":{"put":{"tags":["Admin"],"summary":"Admin Update Subscription Plan","operationId":"admin_update_subscription_plan_api_admin_subscriptions_plans__plan_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","title":"Plan Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionPlanUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Delete Subscription Plan","operationId":"admin_delete_subscription_plan_api_admin_subscriptions_plans__plan_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"plan_id","in":"path","required":true,"schema":{"type":"string","title":"Plan Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/subscriptions/orders":{"get":{"tags":["Admin"],"summary":"Admin List Subscription Orders","operationId":"admin_list_subscription_orders_api_admin_subscriptions_orders_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/public/subscriptions":{"get":{"tags":["Public"],"summary":"Public List Subscriptions","description":"Public : renvoie les plans actifs groupés par catégorie (max 4 catégories).","operationId":"public_list_subscriptions_api_public_subscriptions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/subscriptions/order":{"post":{"tags":["Public"],"summary":"Public Create Subscription Order","operationId":"public_create_subscription_order_api_public_subscriptions_order_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionOrderCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/contacts/{cid}/ticket":{"post":{"tags":["Portail Client"],"summary":"Me Open Ticket","description":"Open a new support ticket from the WhatsApp chat window. Blocks if\nthe contact already has a non-closed ticket (open|in_progress|suspended).","operationId":"me_open_ticket_api_me_contacts__cid__ticket_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketOpenPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/intervention-reasons":{"get":{"tags":["Portail Client"],"summary":"Me Intervention Reasons","description":"Return the (admin-configurable) list of preset reasons used by the\nfloating TicketsBubble. Stored at `settings.global.intervention_reasons`.\nFalls back to `DEFAULT_INTERVENTION_REASONS` when none configured.","operationId":"me_intervention_reasons_api_me_intervention_reasons_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/tickets":{"post":{"tags":["Portail Client"],"summary":"Me Create Ticket Quick","description":"Iter38r-fix9o — Quick-create a ticket from the floating bubble.\nBehavior:\n  - Validates `client_id` is reachable by the caller.\n  - Generates a sequential ticket number for that tenant.\n  - Resolves or creates a lightweight contact (directory_contacts) from\n    `contact_phone` (or `contact_name`) when provided. No contact row\n    is created if neither is given.\n  - Sends the configured WA template (notify_on_ticket_open) when a\n    phone is present.\n  - Persists `software`, `incident_at` and `attach_wa_sms_history` flag\n    directly on the ticket doc (free-form fields).","operationId":"me_create_ticket_quick_api_me_tickets_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuickTicketPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Portail Client"],"summary":"Me List Tickets","operationId":"me_list_tickets_api_me_tickets_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"contact_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/tickets/pending-count":{"get":{"tags":["Portail Client"],"summary":"Me Tickets Pending Count","description":"Renvoie le nombre de tickets non-clos dans le scope de l'utilisateur.\nUsed by the sidebar/dashboard badges.","operationId":"me_tickets_pending_count_api_me_tickets_pending_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/tickets/{tid}":{"patch":{"tags":["Portail Client"],"summary":"Me Update Ticket","operationId":"me_update_ticket_api_me_tickets__tid__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","title":"Tid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketUpdatePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/tickets/cost-summary":{"get":{"tags":["Portail Client"],"summary":"Me Tickets Cost Summary","description":"Iter37d — Monthly cost aggregate for closed tickets.\nReturns total + per-client breakdown for the requested month (0 = current).\nRestricted to elevated viewers (admin/superviseur/moderateur).","operationId":"me_tickets_cost_summary_api_me_tickets_cost_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"months_back","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":0,"default":0,"title":"Months Back"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/tickets/cost-summary.csv":{"get":{"tags":["Portail Client"],"summary":"Me Tickets Cost Summary Csv","description":"Iter37e — CSV export du coût mensuel des interventions clôturées.\nFormat Excel-friendly : UTF-8 BOM, séparateur `;`.","operationId":"me_tickets_cost_summary_csv_api_me_tickets_cost_summary_csv_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"months_back","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":0,"default":0,"title":"Months Back"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/tickets/cost-summary.pdf":{"get":{"tags":["Portail Client"],"summary":"Me Tickets Cost Summary Pdf","description":"Iter37e — PDF export du coût mensuel des interventions clôturées (A4 paysage).","operationId":"me_tickets_cost_summary_pdf_api_me_tickets_cost_summary_pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"months_back","in":"query","required":false,"schema":{"type":"integer","maximum":24,"minimum":0,"default":0,"title":"Months Back"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/tickets/{tid}/close":{"post":{"tags":["Portail Client"],"summary":"Me Close Ticket","operationId":"me_close_ticket_api_me_tickets__tid__close_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","title":"Tid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketClosePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/contacts/{cid}/active-ticket":{"get":{"tags":["Portail Client"],"summary":"Me Contact Active Ticket","description":"Convenience: returns the non-closed ticket for a contact (if any).\nUsed by the chat UI to swap \"Generate ticket\" → \"View open ticket\".\n\nIter38p — If the open ticket actually points to a contact that no longer\nexists, auto-close it as orphan and return active=false so the UI lets the\nuser create a fresh ticket.\nIter38q — Archived tickets (corbeille) are NEVER returned as active.","operationId":"me_contact_active_ticket_api_me_contacts__cid__active_ticket_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/tickets/{tid}/archive":{"post":{"tags":["Portail Client"],"summary":"Me Archive Ticket","operationId":"me_archive_ticket_api_me_tickets__tid__archive_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","title":"Tid"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TicketArchivePayload"},{"type":"null"}],"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/tickets/trash":{"get":{"tags":["Portail Client"],"summary":"Me List Trashed Tickets","operationId":"me_list_trashed_tickets_api_me_tickets_trash_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/tickets/bulk-delete":{"post":{"tags":["Portail Client"],"summary":"Me Bulk Delete Tickets","description":"Hard-delete les tickets sélectionnés par leurs ids. Admin/Sup uniquement.","operationId":"me_bulk_delete_tickets_api_me_tickets_bulk_delete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketBulkIdsPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/tickets/reset":{"post":{"tags":["Portail Client"],"summary":"Me Reset All Tickets","description":"Hard-delete TOUS les tickets (remise à zéro complète). Réservé Admin/Superviseur.","operationId":"me_reset_all_tickets_api_me_tickets_reset_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/tickets/{tid}/assign":{"post":{"tags":["Portail Client"],"summary":"Me Assign Ticket","description":"Assign a ticket to a user (or unassign when user_id is empty).","operationId":"me_assign_ticket_api_me_tickets__tid__assign_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","title":"Tid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketAssignPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/tickets/{tid}/reopen":{"post":{"tags":["Portail Client"],"summary":"Me Reopen Ticket","description":"Re-open a closed ticket as a *new* sibling whose number ends with -R{k}.\n\nExample chain : TKT-2026-0014 (done) → /reopen → TKT-2026-0014-R1 (open) →\nif closed and reopened again → TKT-2026-0014-R2.\n\nThe parent must already be closed. The new ticket carries:\n  - parent_ticket_id (the very first ticket of the chain)\n  - root_number (the original number, for grouping)\n  - the same contact / client_id","operationId":"me_reopen_ticket_api_me_tickets__tid__reopen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","title":"Tid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketReopenPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/ticket-motif-templates":{"get":{"tags":["Portail Client"],"summary":"Me List Ticket Motif Templates","operationId":"me_list_ticket_motif_templates_api_me_ticket_motif_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Portail Client"],"summary":"Me Create Ticket Motif Template","operationId":"me_create_ticket_motif_template_api_me_ticket_motif_templates_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketMotifTemplatePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/ticket-motif-templates/{tpl_id}":{"delete":{"tags":["Portail Client"],"summary":"Me Delete Ticket Motif Template","operationId":"me_delete_ticket_motif_template_api_me_ticket_motif_templates__tpl_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tpl_id","in":"path","required":true,"schema":{"type":"string","title":"Tpl Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/dashboard/ticket-stats":{"get":{"tags":["Portail Client"],"summary":"Me Dashboard Ticket Stats","description":"Per-user ticket resolution score (only `done` tickets count) over the\ntrailing `days` window. Surfaced on the dashboard so teams can compare\nwho resolves the fastest. Elevated viewers (admin/superviseur) also get\na leaderboard of the top 10 fastest closers.","operationId":"me_dashboard_ticket_stats_api_me_dashboard_ticket_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/welcome-briefing":{"get":{"tags":["Portail Client"],"summary":"Me Welcome Briefing","operationId":"me_welcome_briefing_api_me_welcome_briefing_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"last_seen_at","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen At"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/sms/dashboard":{"get":{"tags":["Admin"],"summary":"Admin Sms Dashboard","operationId":"admin_sms_dashboard_api_admin_sms_dashboard_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/chat/clients":{"get":{"tags":["Chat interne"],"summary":"Me Chat Clients","operationId":"me_chat_clients_api_me_chat_clients_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/chat/{client_id}/members":{"get":{"tags":["Chat interne"],"summary":"Me Chat Members","operationId":"me_chat_members_api_me_chat__client_id__members_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/chat/{client_id}/threads":{"get":{"tags":["Chat interne"],"summary":"Me Chat Threads","operationId":"me_chat_threads_api_me_chat__client_id__threads_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/chat/{client_id}/messages":{"get":{"tags":["Chat interne"],"summary":"Me Chat Messages","operationId":"me_chat_messages_api_me_chat__client_id__messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"with_user","in":"query","required":true,"schema":{"type":"string","description":"'general' or a user_id","title":"With User"},"description":"'general' or a user_id"},{"name":"before","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Before"}},{"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Chat interne"],"summary":"Me Chat Send","operationId":"me_chat_send_api_me_chat__client_id__messages_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMessagePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/chat/{client_id}/messages/photo":{"post":{"tags":["Chat interne"],"summary":"Me Chat Send Photo","operationId":"me_chat_send_photo_api_me_chat__client_id__messages_photo_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_me_chat_send_photo_api_me_chat__client_id__messages_photo_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/chat/media/{msg_id}":{"get":{"tags":["Chat interne"],"summary":"Me Chat Get Media","operationId":"me_chat_get_media_api_me_chat_media__msg_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"msg_id","in":"path","required":true,"schema":{"type":"string","title":"Msg Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/chat/messages/{msg_id}/read":{"post":{"tags":["Chat interne"],"summary":"Me Chat Mark Read","operationId":"me_chat_mark_read_api_me_chat_messages__msg_id__read_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"msg_id","in":"path","required":true,"schema":{"type":"string","title":"Msg Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/chat/{client_id}/threads/{thread_key}/mark-all-read":{"post":{"tags":["Chat interne"],"summary":"Me Chat Mark Thread Read","description":"Marque en masse tous les messages d'un thread comme lus pour l'utilisateur courant.","operationId":"me_chat_mark_thread_read_api_me_chat__client_id__threads__thread_key__mark_all_read_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"thread_key","in":"path","required":true,"schema":{"type":"string","title":"Thread Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/chat/unread-count":{"get":{"tags":["Chat interne"],"summary":"Me Chat Unread Count","operationId":"me_chat_unread_count_api_me_chat_unread_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/chat/search":{"get":{"tags":["Chat interne"],"summary":"Me Chat Search","operationId":"me_chat_search_api_me_chat_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":120,"title":"Q"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/chat/transcribe":{"post":{"tags":["Chat interne"],"summary":"Me Chat Transcribe","operationId":"me_chat_transcribe_api_me_chat_transcribe_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"language","in":"query","required":false,"schema":{"type":"string","default":"fr","title":"Language"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_me_chat_transcribe_api_me_chat_transcribe_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/team-presence":{"get":{"tags":["Chat interne"],"summary":"Public Team Presence","operationId":"public_team_presence_api_public_team_presence_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/cashier/qr/rewrite-base-url":{"post":{"tags":["Caisse & Facturation"],"summary":"Rewrite Qr Base Url","operationId":"rewrite_qr_base_url_api_admin_cashier_qr_rewrite_base_url_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/business-clients":{"get":{"tags":["Caisse & Facturation"],"summary":"List Business Clients","operationId":"list_business_clients_api_admin_business_clients_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Caisse & Facturation"],"summary":"Create Business Client","operationId":"create_business_client_api_admin_business_clients_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessClientPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/business-clients/{cid}":{"patch":{"tags":["Caisse & Facturation"],"summary":"Update Business Client","operationId":"update_business_client_api_admin_business_clients__cid__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BusinessClientPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Caisse & Facturation"],"summary":"Delete Business Client","operationId":"delete_business_client_api_admin_business_clients__cid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/products":{"get":{"tags":["Caisse & Facturation"],"summary":"List Products","operationId":"list_products_api_admin_products_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Caisse & Facturation"],"summary":"Create Product","operationId":"create_product_api_admin_products_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/products/{pid}":{"patch":{"tags":["Caisse & Facturation"],"summary":"Update Product","operationId":"update_product_api_admin_products__pid__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Caisse & Facturation"],"summary":"Delete Product","operationId":"delete_product_api_admin_products__pid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payment-methods":{"get":{"tags":["Caisse & Facturation"],"summary":"List Payment Methods","operationId":"list_payment_methods_api_payment_methods_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/payment-methods":{"post":{"tags":["Caisse & Facturation"],"summary":"Create Payment Method","operationId":"create_payment_method_api_admin_payment_methods_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentMethodPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/payment-methods/{pid}":{"patch":{"tags":["Caisse & Facturation"],"summary":"Update Payment Method","operationId":"update_payment_method_api_admin_payment_methods__pid__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentMethodPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Caisse & Facturation"],"summary":"Delete Payment Method","operationId":"delete_payment_method_api_admin_payment_methods__pid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/import/business-clients/fields":{"get":{"tags":["Caisse & Facturation"],"summary":"Get Business Csv Fields","operationId":"get_business_csv_fields_api_cashier_import_business_clients_fields_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/cashier/import/products/fields":{"get":{"tags":["Caisse & Facturation"],"summary":"Get Product Csv Fields","operationId":"get_product_csv_fields_api_cashier_import_products_fields_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/cashier/import/business-clients":{"post":{"tags":["Caisse & Facturation"],"summary":"Import Business Clients","operationId":"import_business_clients_api_cashier_import_business_clients_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/cashier/import/products":{"post":{"tags":["Caisse & Facturation"],"summary":"Import Products","operationId":"import_products_api_cashier_import_products_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/users/{uid}/can-cash":{"patch":{"tags":["Caisse & Facturation"],"summary":"Set User Can Cash","operationId":"set_user_can_cash_api_admin_users__uid__can_cash_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"string","title":"Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/legal-forms":{"get":{"tags":["Caisse & Facturation"],"summary":"List Legal Forms","operationId":"list_legal_forms_api_cashier_legal_forms_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/legal-forms":{"post":{"tags":["Caisse & Facturation"],"summary":"Create Legal Form","operationId":"create_legal_form_api_admin_legal_forms_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegalFormPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/legal-forms/{lid}":{"delete":{"tags":["Caisse & Facturation"],"summary":"Delete Legal Form","operationId":"delete_legal_form_api_admin_legal_forms__lid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"lid","in":"path","required":true,"schema":{"type":"string","title":"Lid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/product-categories":{"get":{"tags":["Caisse & Facturation"],"summary":"List Product Categories","operationId":"list_product_categories_api_cashier_product_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/product-categories":{"post":{"tags":["Caisse & Facturation"],"summary":"Create Product Category","operationId":"create_product_category_api_admin_product_categories_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductCategoryPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/product-categories/{cid}":{"delete":{"tags":["Caisse & Facturation"],"summary":"Delete Product Category","operationId":"delete_product_category_api_admin_product_categories__cid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/auto-relance/settings":{"get":{"tags":["Caisse & Facturation"],"summary":"Get Auto Relance Settings","operationId":"get_auto_relance_settings_api_cashier_auto_relance_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Caisse & Facturation"],"summary":"Update Auto Relance Settings","operationId":"update_auto_relance_settings_api_cashier_auto_relance_settings_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/users/can-cash":{"get":{"tags":["Caisse & Facturation"],"summary":"List Cashier Users","operationId":"list_cashier_users_api_admin_users_can_cash_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/cashier/tenant-info":{"get":{"tags":["Caisse & Facturation"],"summary":"Cashier Tenant Info","operationId":"cashier_tenant_info_api_cashier_tenant_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/cashier/receipts":{"post":{"tags":["Caisse & Facturation"],"summary":"Create Receipt","operationId":"create_receipt_api_cashier_receipts_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReceiptPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Caisse & Facturation"],"summary":"List Receipts","operationId":"list_receipts_api_cashier_receipts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"business_client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Client Id"}},{"name":"include_deleted","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Deleted"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/receipts/{rid}":{"get":{"tags":["Caisse & Facturation"],"summary":"Get Receipt","operationId":"get_receipt_api_cashier_receipts__rid__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Caisse & Facturation"],"summary":"Delete Receipt","operationId":"delete_receipt_api_cashier_receipts__rid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}},{"name":"purge","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Purge"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/receipts/{rid}/qr.png":{"get":{"tags":["Caisse & Facturation"],"summary":"Receipt Qr Png","operationId":"receipt_qr_png_api_cashier_receipts__rid__qr_png_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/receipts/{rid}/send-whatsapp":{"post":{"tags":["Caisse & Facturation"],"summary":"Receipt Send Whatsapp","operationId":"receipt_send_whatsapp_api_cashier_receipts__rid__send_whatsapp_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/invoices":{"post":{"tags":["Caisse & Facturation"],"summary":"Create Invoice","operationId":"create_invoice_api_cashier_invoices_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoicePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Caisse & Facturation"],"summary":"List Invoices","operationId":"list_invoices_api_cashier_invoices_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"business_client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Client Id"}},{"name":"include_deleted","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Deleted"}},{"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/invoices/{iid}":{"get":{"tags":["Caisse & Facturation"],"summary":"Get Invoice","operationId":"get_invoice_api_cashier_invoices__iid__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"string","title":"Iid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Caisse & Facturation"],"summary":"Patch Invoice","operationId":"patch_invoice_api_cashier_invoices__iid__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"string","title":"Iid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoicePatchPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Caisse & Facturation"],"summary":"Delete Invoice","operationId":"delete_invoice_api_cashier_invoices__iid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"string","title":"Iid"}},{"name":"purge","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Purge"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/invoices/{iid}/qr.png":{"get":{"tags":["Caisse & Facturation"],"summary":"Invoice Qr Png","operationId":"invoice_qr_png_api_cashier_invoices__iid__qr_png_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"string","title":"Iid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/invoices/{iid}/send-whatsapp":{"post":{"tags":["Caisse & Facturation"],"summary":"Invoice Send Whatsapp","operationId":"invoice_send_whatsapp_api_cashier_invoices__iid__send_whatsapp_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"string","title":"Iid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/overdue/count":{"get":{"tags":["Caisse & Facturation"],"summary":"Invoices Overdue Count","operationId":"invoices_overdue_count_api_cashier_overdue_count_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"grace_days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":0,"default":30,"title":"Grace Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/overdue/relance":{"post":{"tags":["Caisse & Facturation"],"summary":"Invoices Relance Overdue","operationId":"invoices_relance_overdue_api_cashier_overdue_relance_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/cashier/invoices/{iid}/receipt":{"post":{"tags":["Caisse & Facturation"],"summary":"Generate Receipt From Invoice","description":"Explicit receipt generation for an ALREADY-paid invoice (reprint).","operationId":"generate_receipt_from_invoice_api_cashier_invoices__iid__receipt_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"string","title":"Iid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReceiptPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/receipts/{rid}/restore":{"post":{"tags":["Caisse & Facturation"],"summary":"Restore Receipt","operationId":"restore_receipt_api_cashier_receipts__rid__restore_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/invoices/{iid}/restore":{"post":{"tags":["Caisse & Facturation"],"summary":"Restore Invoice","operationId":"restore_invoice_api_cashier_invoices__iid__restore_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"string","title":"Iid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/invoices/{iid}/duplicate":{"post":{"tags":["Caisse & Facturation"],"summary":"Duplicate Invoice","operationId":"duplicate_invoice_api_cashier_invoices__iid__duplicate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"string","title":"Iid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/verify/{token}":{"get":{"tags":["Caisse & Facturation"],"summary":"Public Verify","operationId":"public_verify_api_public_verify__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/receipt-pdf/{token}":{"get":{"tags":["Caisse & Facturation"],"summary":"Public Receipt Pdf","operationId":"public_receipt_pdf_api_public_receipt_pdf__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/invoice-pdf/{token}":{"get":{"tags":["Caisse & Facturation"],"summary":"Public Invoice Pdf","operationId":"public_invoice_pdf_api_public_invoice_pdf__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/receipts/{rid}/pdf":{"get":{"tags":["Caisse & Facturation"],"summary":"Receipt Pdf","operationId":"receipt_pdf_api_cashier_receipts__rid__pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/invoices/{iid}/pdf":{"get":{"tags":["Caisse & Facturation"],"summary":"Invoice Pdf","operationId":"invoice_pdf_api_cashier_invoices__iid__pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"string","title":"Iid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/exports/receipts.csv":{"get":{"tags":["Caisse & Facturation"],"summary":"Export Receipts Csv","operationId":"export_receipts_csv_api_cashier_exports_receipts_csv_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"business_client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/exports/receipts.pdf":{"get":{"tags":["Caisse & Facturation"],"summary":"Export Receipts Pdf","operationId":"export_receipts_pdf_api_cashier_exports_receipts_pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"business_client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/exports/invoices.csv":{"get":{"tags":["Caisse & Facturation"],"summary":"Export Invoices Csv","operationId":"export_invoices_csv_api_cashier_exports_invoices_csv_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"business_client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/exports/invoices.pdf":{"get":{"tags":["Caisse & Facturation"],"summary":"Export Invoices Pdf","operationId":"export_invoices_pdf_api_cashier_exports_invoices_pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"business_client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/overdue/relance-auto-run":{"post":{"tags":["Caisse & Facturation"],"summary":"Relance Auto Run","description":"Iter36y — Trigger the auto-relance flow manually (admin/superviseur).\nIter37f — Tagged with triggering user's tenant for per-tenant history filter.","operationId":"relance_auto_run_api_cashier_overdue_relance_auto_run_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/cashier/overdue/relance-history":{"get":{"tags":["Caisse & Facturation"],"summary":"Relance History","operationId":"relance_history_api_cashier_overdue_relance_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/kpis":{"get":{"tags":["Caisse & Facturation"],"summary":"Invoices Kpis","operationId":"invoices_kpis_api_cashier_kpis_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/cashier/backfill-tenants":{"post":{"tags":["Caisse & Facturation"],"summary":"Admin Backfill Tenants","description":"Recompute tenant_id on all Caisse docs using the latest resolution logic.\nBody: `{\"rewrite\": true}` to overwrite existing tenant_id (default true here,\nbecause the typical use case is to consolidate split tenants).","operationId":"admin_backfill_tenants_api_admin_cashier_backfill_tenants_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/hr/eligible-users":{"get":{"tags":["GRH"],"summary":"List Eligible","operationId":"list_eligible_api_hr_eligible_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/hr/employees":{"get":{"tags":["GRH"],"summary":"List Employees","operationId":"list_employees_api_hr_employees_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"include_deleted","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Deleted"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["GRH"],"summary":"Create Employee","operationId":"create_employee_api_hr_employees_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/employees/{eid}":{"patch":{"tags":["GRH"],"summary":"Update Employee","operationId":"update_employee_api_hr_employees__eid__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmployeeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["GRH"],"summary":"Delete Employee","operationId":"delete_employee_api_hr_employees__eid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/employees/{eid}/restore":{"post":{"tags":["GRH"],"summary":"Restore Employee","operationId":"restore_employee_api_hr_employees__eid__restore_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/employees/{eid}/timesheet":{"get":{"tags":["GRH"],"summary":"Employee Timesheet","operationId":"employee_timesheet_api_hr_employees__eid__timesheet_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}},{"name":"month","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}$","title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/employees/backfill-matricules":{"post":{"tags":["GRH"],"summary":"Backfill Matricules","description":"Iter38c — Assign auto-generated matricule to employees missing one (tenant-scoped).","operationId":"backfill_matricules_api_hr_employees_backfill_matricules_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/hr/settings":{"get":{"tags":["GRH"],"summary":"Get Hr Settings","operationId":"get_hr_settings_api_hr_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["GRH"],"summary":"Update Hr Settings","operationId":"update_hr_settings_api_hr_settings_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HrSettingsPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/hr/absences":{"get":{"tags":["GRH"],"summary":"List Absences","operationId":"list_absences_api_hr_absences_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"employee_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Employee Id"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}$"},{"type":"null"}],"title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["GRH"],"summary":"Create Absence","operationId":"create_absence_api_hr_absences_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AbsencePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/absences/{aid}":{"patch":{"tags":["GRH"],"summary":"Update Absence","operationId":"update_absence_api_hr_absences__aid__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"string","title":"Aid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AbsenceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["GRH"],"summary":"Delete Absence","operationId":"delete_absence_api_hr_absences__aid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"string","title":"Aid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/absences/{aid}/approve":{"post":{"tags":["GRH"],"summary":"Approve Absence","description":"Iter40 — Approuve une absence (typiquement une requête !absence WA).\nSets status='approved' and re-activates the requesting user.","operationId":"approve_absence_api_hr_absences__aid__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"string","title":"Aid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/absences/{aid}/reject":{"post":{"tags":["GRH"],"summary":"Reject Absence","description":"Iter40 — Refuse une absence en attente : suppression + réactivation de l'utilisateur.","operationId":"reject_absence_api_hr_absences__aid__reject_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"string","title":"Aid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/advances/{aid}/approve":{"post":{"tags":["GRH"],"summary":"Approve Advance","description":"Iter40 — Approve a pending advance (typically WA-issued).","operationId":"approve_advance_api_hr_advances__aid__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"string","title":"Aid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/advances/{aid}/reject":{"post":{"tags":["GRH"],"summary":"Reject Advance","description":"Iter40 — Reject (delete) a pending advance.","operationId":"reject_advance_api_hr_advances__aid__reject_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"string","title":"Aid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/absences/scan":{"post":{"tags":["GRH"],"summary":"Scan Auto Absences","description":"Auto-detect business days in month with no access_logs entry.\nReturns suggested absences (not persisted). Caller can POST them with\nis_justified=false to persist.","operationId":"scan_auto_absences_api_hr_absences_scan_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"employee_id","in":"query","required":true,"schema":{"type":"string","title":"Employee Id"}},{"name":"month","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}$","title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/taxes":{"get":{"tags":["GRH"],"summary":"List Taxes","operationId":"list_taxes_api_hr_taxes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["GRH"],"summary":"Replace Taxes","description":"Replace the tenant's taxes (max 5).","operationId":"replace_taxes_api_hr_taxes_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaxesReplacePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/hr/advances":{"get":{"tags":["GRH"],"summary":"List Advances","operationId":"list_advances_api_hr_advances_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"employee_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Employee Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["GRH"],"summary":"Create Advance","operationId":"create_advance_api_hr_advances_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdvancePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/advances/{aid}/repay":{"post":{"tags":["GRH"],"summary":"Repay Advance","operationId":"repay_advance_api_hr_advances__aid__repay_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"string","title":"Aid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdvanceRepayPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/advances/{aid}":{"delete":{"tags":["GRH"],"summary":"Delete Advance","operationId":"delete_advance_api_hr_advances__aid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"string","title":"Aid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/employees/{eid}/payslip":{"get":{"tags":["GRH"],"summary":"Employee Payslip","operationId":"employee_payslip_api_hr_employees__eid__payslip_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}},{"name":"month","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}$","title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/employees/{eid}/payslip.pdf":{"get":{"tags":["GRH"],"summary":"Employee Payslip Pdf","operationId":"employee_payslip_pdf_api_hr_employees__eid__payslip_pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}},{"name":"month","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}$","title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/dashboard/weekly-presence":{"get":{"tags":["GRH"],"summary":"Weekly Presence","description":"Top 5 active employees this calendar week (Mon-Sun, UTC).","operationId":"weekly_presence_api_hr_dashboard_weekly_presence_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/hr/dashboard/monthly-presence":{"get":{"tags":["GRH"],"summary":"Monthly Presence","description":"Top 10 employees by accumulated hours for the given month.\n`month` format = YYYY-MM. If absent, defaults to the current month.","operationId":"monthly_presence_api_hr_dashboard_monthly_presence_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}$"},{"type":"null"}],"title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/holidays":{"get":{"tags":["GRH"],"summary":"List Holidays","operationId":"list_holidays_api_hr_holidays_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"year","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":3000,"minimum":1970},{"type":"null"}],"title":"Year"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["GRH"],"summary":"Create Holiday","operationId":"create_holiday_api_hr_holidays_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolidayPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/holidays/{hid}":{"patch":{"tags":["GRH"],"summary":"Update Holiday","operationId":"update_holiday_api_hr_holidays__hid__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hid","in":"path","required":true,"schema":{"type":"string","title":"Hid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HolidayUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["GRH"],"summary":"Delete Holiday","operationId":"delete_holiday_api_hr_holidays__hid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"hid","in":"path","required":true,"schema":{"type":"string","title":"Hid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/holidays/import":{"post":{"tags":["GRH"],"summary":"Import Holidays","description":"Importe les jours fériés à date fixe connus pour l'année/pays donnés.\nCountry code defaults to the tenant's configured default (BF if none).\nReturns {created, skipped, items: [...]}.\nMobile religious holidays (Aïd, Mawlid) must be added manually.","operationId":"import_holidays_api_hr_holidays_import_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"year","in":"query","required":true,"schema":{"type":"integer","maximum":3000,"minimum":1970,"title":"Year"}},{"name":"country","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":2,"maxLength":4},{"type":"null"}],"title":"Country"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/employees/{eid}/allowances":{"get":{"tags":["GRH"],"summary":"List Allowances","operationId":"list_allowances_api_hr_employees__eid__allowances_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["GRH"],"summary":"Create Allowance","operationId":"create_allowance_api_hr_employees__eid__allowances_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllowancePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/allowances/{aid}":{"patch":{"tags":["GRH"],"summary":"Update Allowance","operationId":"update_allowance_api_hr_allowances__aid__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"string","title":"Aid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AllowanceUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["GRH"],"summary":"Delete Allowance","operationId":"delete_allowance_api_hr_allowances__aid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"string","title":"Aid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/employees/{eid}/bonuses":{"get":{"tags":["GRH"],"summary":"List Bonuses","operationId":"list_bonuses_api_hr_employees__eid__bonuses_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}$"},{"type":"null"}],"title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["GRH"],"summary":"Create Bonus","operationId":"create_bonus_api_hr_employees__eid__bonuses_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BonusPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/bonuses/{bid}":{"patch":{"tags":["GRH"],"summary":"Update Bonus","operationId":"update_bonus_api_hr_bonuses__bid__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bid","in":"path","required":true,"schema":{"type":"string","title":"Bid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BonusUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["GRH"],"summary":"Delete Bonus","operationId":"delete_bonus_api_hr_bonuses__bid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"bid","in":"path","required":true,"schema":{"type":"string","title":"Bid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/pay-catalog":{"get":{"tags":["GRH"],"summary":"List Catalog","operationId":"list_catalog_api_hr_pay_catalog_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(allowance|bonus)$"},{"type":"null"}],"title":"Kind"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["GRH"],"summary":"Create Catalog Item","operationId":"create_catalog_item_api_hr_pay_catalog_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayCatalogItemPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/pay-catalog/{cid}":{"patch":{"tags":["GRH"],"summary":"Update Catalog Item","operationId":"update_catalog_item_api_hr_pay_catalog__cid__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayCatalogItemUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["GRH"],"summary":"Delete Catalog Item","operationId":"delete_catalog_item_api_hr_pay_catalog__cid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/employees/{eid}/apply-catalog/{cid}":{"post":{"tags":["GRH"],"summary":"Apply Catalog To Employee","description":"0-3 — Applique un modèle de catalogue à un employé. Pour les indemnités,\ncreates a hr_allowances row; for bonuses, creates a hr_bonuses row\n(bonus_month required). The amount can be overridden via the\n`amount` form field, otherwise uses default_amount from catalog.","operationId":"apply_catalog_to_employee_api_hr_employees__eid__apply_catalog__cid__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}},{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_apply_catalog_to_employee_api_hr_employees__eid__apply_catalog__cid__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/hr/employees/{src_eid}/copy-pay-items":{"post":{"tags":["GRH"],"summary":"Copy Pay Items","operationId":"copy_pay_items_api_hr_employees__src_eid__copy_pay_items_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"src_eid","in":"path","required":true,"schema":{"type":"string","title":"Src Eid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CopyPayItemsPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/tenant-meta":{"get":{"tags":["Tenant Meta"],"summary":"Me Tenant Meta","operationId":"me_tenant_meta_api_me_tenant_meta_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/countries":{"get":{"tags":["Tenant Meta"],"summary":"List Countries","operationId":"list_countries_api_admin_countries_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Tenant Meta"],"summary":"Add Country","operationId":"add_country_api_admin_countries_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/countries/{code}":{"patch":{"tags":["Tenant Meta"],"summary":"Update Country","operationId":"update_country_api_admin_countries__code__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CountryPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Tenant Meta"],"summary":"Delete Country","operationId":"delete_country_api_admin_countries__code__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/tenant-country":{"get":{"tags":["Tenant Meta"],"summary":"Get Tenant Country","operationId":"get_tenant_country_api_admin_tenant_country_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["Tenant Meta"],"summary":"Set Tenant Country","operationId":"set_tenant_country_api_admin_tenant_country_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCountrySelect"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/cashier/expenses":{"get":{"tags":["Caisse — Dépenses"],"summary":"List Expenses","operationId":"list_expenses_api_cashier_expenses_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}$"},{"type":"null"}],"title":"Month"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(justified|unjustified|late_unjustified|all)$"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Caisse — Dépenses"],"summary":"Create Expense","operationId":"create_expense_api_cashier_expenses_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpensePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/expenses/monthly-summary":{"get":{"tags":["Caisse — Dépenses"],"summary":"Monthly Summary","operationId":"monthly_summary_api_cashier_expenses_monthly_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"month","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}$","title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/expenses/{eid}":{"patch":{"tags":["Caisse — Dépenses"],"summary":"Update Expense","description":"Iter38o — Edit allowed if NOT justified (clôturée):\n- admin/sup can always edit\n- creator (created_by == me) can edit while not justified\n- employee on whom the expense is attributed (employee_user_id == me)\n  can edit while not justified\nOnce justified ('clôturée'), only admin can edit (force).","operationId":"update_expense_api_cashier_expenses__eid__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpenseUpdatePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Caisse — Dépenses"],"summary":"Delete Expense","operationId":"delete_expense_api_cashier_expenses__eid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/expenses/{eid}/justify":{"post":{"tags":["Caisse — Dépenses"],"summary":"Justify Expense","description":"Justifies an expense. Refused if past the deadline (unless admin uses force=true).","operationId":"justify_expense_api_cashier_expenses__eid__justify_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExpenseJustifyPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/expenses/{eid}/unjustify":{"post":{"tags":["Caisse — Dépenses"],"summary":"Unjustify Expense","description":"Admin only — revert justification (e.g. mistake).","operationId":"unjustify_expense_api_cashier_expenses__eid__unjustify_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cashier/expenses/employees-list":{"get":{"tags":["Caisse — Dépenses"],"summary":"List Employees For Expenses","description":"Iter38m — Lightweight list of employees of the current tenant for the\nexpense attribution dropdown. Accessible to all roles that can create\nan expense (admin/sup/can_cash/Comptable) without requiring full HR access.\nReturns [{id, name, matricule, user_id}].","operationId":"list_employees_for_expenses_api_cashier_expenses_employees_list_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/cashier/expenses/me/dashboard-card":{"get":{"tags":["Caisse — Dépenses"],"summary":"My Dashboard Card","description":"Sum of MY unjustified expenses + those late-unjustified.\n\nIter38m — Includes:\n  - expenses I created (created_by == me)\n  - expenses attributed to me as employee (employee_user_id == me)","operationId":"my_dashboard_card_api_cashier_expenses_me_dashboard_card_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/payroll-webhooks/config":{"get":{"tags":["Webhooks Paie"],"summary":"Get Config","operationId":"get_config_api_admin_payroll_webhooks_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["Webhooks Paie"],"summary":"Update Config","operationId":"update_config_api_admin_payroll_webhooks_config_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookConfigPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/payroll-webhooks/outbound/test":{"post":{"tags":["Webhooks Paie"],"summary":"Trigger Outbound","operationId":"trigger_outbound_api_admin_payroll_webhooks_outbound_test_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"month","in":"query","required":true,"schema":{"type":"string","title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/payroll-webhooks/outbound/preview":{"get":{"tags":["Webhooks Paie"],"summary":"Preview Outbound","description":"Renvoie le JSON qui serait envoyé — utile pour revue avant expédition.","operationId":"preview_outbound_api_admin_payroll_webhooks_outbound_preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"month","in":"query","required":true,"schema":{"type":"string","title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/n8n/payroll/{tenant_id}":{"post":{"tags":["Webhooks Paie"],"summary":"Receive Inbound","operationId":"receive_inbound_api_webhooks_n8n_payroll__tenant_id__post","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/payroll-webhooks/log":{"get":{"tags":["Webhooks Paie"],"summary":"List Log","operationId":"list_log_api_admin_payroll_webhooks_log_get","security":[{"HTTPBearer":[]}],"parameters":[{"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"}}}}}}},"/api/admin/meta/config":{"get":{"tags":["Admin"],"summary":"Admin Get Meta Config","operationId":"admin_get_meta_config_api_admin_meta_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin"],"summary":"Admin Set Meta Config","operationId":"admin_set_meta_config_api_admin_meta_config_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaConfigUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/meta/oauth/url":{"get":{"tags":["Portail Client — Meta"],"summary":"Meta Oauth Url","operationId":"meta_oauth_url_api_me_meta_oauth_url_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/meta/oauth/callback":{"get":{"tags":["Portail Client — Meta"],"summary":"Meta Oauth Callback","operationId":"meta_oauth_callback_api_me_meta_oauth_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/meta/status":{"get":{"tags":["Portail Client — Meta"],"summary":"Meta Status","operationId":"meta_status_api_me_meta_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/meta/disconnect":{"post":{"tags":["Portail Client — Meta"],"summary":"Meta Disconnect","operationId":"meta_disconnect_api_me_meta_disconnect_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/meta/pages":{"get":{"tags":["Portail Client — Meta"],"summary":"List Pages","operationId":"list_pages_api_me_meta_pages_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/meta/pages/{page_id}/posts":{"get":{"tags":["Portail Client — Meta"],"summary":"Page Posts","operationId":"page_posts_api_me_meta_pages__page_id__posts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","title":"Page Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Portail Client — Meta"],"summary":"Create Post","operationId":"create_post_api_me_meta_pages__page_id__posts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","title":"Page Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routes__meta__CreatePostPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/meta/pages/{page_id}/photos":{"post":{"tags":["Portail Client — Meta"],"summary":"Upload Photo","operationId":"upload_photo_api_me_meta_pages__page_id__photos_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","title":"Page Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadPhotoPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/meta/pages/{page_id}/posts/{post_id}/comments":{"get":{"tags":["Portail Client — Meta"],"summary":"Post Comments","operationId":"post_comments_api_me_meta_pages__page_id__posts__post_id__comments_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","title":"Page Id"}},{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":25,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/meta/pages/{page_id}/comments/{comment_id}/reply":{"post":{"tags":["Portail Client — Meta"],"summary":"Reply Comment","operationId":"reply_comment_api_me_meta_pages__page_id__comments__comment_id__reply_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"path","required":true,"schema":{"type":"string","title":"Page Id"}},{"name":"comment_id","in":"path","required":true,"schema":{"type":"string","title":"Comment Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentReplyPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/meta/messenger/conversations":{"get":{"tags":["Portail Client — Meta"],"summary":"Messenger Conversations","operationId":"messenger_conversations_api_me_meta_messenger_conversations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page_id","in":"query","required":true,"schema":{"type":"string","title":"Page Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/meta/messenger/send":{"post":{"tags":["Portail Client — Meta"],"summary":"Messenger Send","operationId":"messenger_send_api_me_meta_messenger_send_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessengerSendPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/meta/ads/accounts":{"get":{"tags":["Portail Client — Meta"],"summary":"Ads Accounts","operationId":"ads_accounts_api_me_meta_ads_accounts_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/meta/ads/accounts/{ad_account_id}/insights":{"get":{"tags":["Portail Client — Meta"],"summary":"Ads Insights","operationId":"ads_insights_api_me_meta_ads_accounts__ad_account_id__insights_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"ad_account_id","in":"path","required":true,"schema":{"type":"string","title":"Ad Account Id"}},{"name":"date_preset","in":"query","required":false,"schema":{"type":"string","default":"last_7d","title":"Date Preset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/meta/ads/campaigns":{"post":{"tags":["Portail Client — Meta"],"summary":"Ads Create Campaign","operationId":"ads_create_campaign_api_me_meta_ads_campaigns_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignCreatePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/meta/ads/campaigns/{campaign_id}/status":{"post":{"tags":["Portail Client — Meta"],"summary":"Ads Set Status","operationId":"ads_set_status_api_me_meta_ads_campaigns__campaign_id__status_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"campaign_id","in":"path","required":true,"schema":{"type":"string","title":"Campaign Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CampaignStatusPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/meta/webhook":{"get":{"tags":["Meta Webhook"],"summary":"Meta Webhook Verify","description":"Iter38r-fix3 — Accepts either `meta_webhook_verify_token`\n(Messenger/Pages/Ads) OR `wa_verify_token` (WhatsApp Cloud) so the\nsame URL can be used for both subscriptions in a single Meta App.","operationId":"meta_webhook_verify_api_meta_webhook_get","parameters":[{"name":"hub.mode","in":"query","required":false,"schema":{"type":"string","title":"Hub.Mode"}},{"name":"hub.challenge","in":"query","required":false,"schema":{"type":"string","title":"Hub.Challenge"}},{"name":"hub.verify_token","in":"query","required":false,"schema":{"type":"string","title":"Hub.Verify Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Meta Webhook"],"summary":"Meta Webhook Receive","description":"Iter38r-fix3 — Detects WhatsApp Cloud payloads\n(`object='whatsapp_business_account'`) and forwards them to the\nexisting WhatsApp webhook handler. Pure Messenger/Pages payloads\nkeep the HMAC-verified flow.","operationId":"meta_webhook_receive_api_meta_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/me/inbox/bird-cost-today":{"get":{"tags":["Portail — Inbox"],"summary":"Me Bird Cost Today","description":"Iter43-fix24d — Coût Bird du jour pour l'utilisateur courant.\n\nAdmin = tous les SMS Bird outbound du jour ; tenant = ses propres SMS.\nLe coût unitaire est lu depuis `settings.bird_cost_per_sms_xof` (défaut 25 XOF).","operationId":"me_bird_cost_today_api_me_inbox_bird_cost_today_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/inbox/unified":{"get":{"tags":["Portail Client — Inbox"],"summary":"Unified Inbox","description":"Renvoie jusqu'à `limit` threads depuis WhatsApp + Messenger, triés par récence.\n\nEach thread groups messages by:\n  - WhatsApp: phone number (`to_number` for outbound, `from` for inbound)\n  - Messenger: `(page_id, peer_psid)` where peer_psid is the non-page participant\n\nFor each thread we include: channel, peer_id, peer_name, preview, last_at,\nunread_count, and the underlying counts.","operationId":"unified_inbox_api_me_inbox_unified_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":40,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/inbox/unified/{channel}/{thread_id}":{"get":{"tags":["Portail Client — Inbox"],"summary":"Thread Messages","description":"Return ordered messages of a single thread.","operationId":"thread_messages_api_me_inbox_unified__channel___thread_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel","in":"path","required":true,"schema":{"type":"string","title":"Channel"}},{"name":"thread_id","in":"path","required":true,"schema":{"type":"string","title":"Thread Id"}},{"name":"page_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Id"}},{"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/inbox/send":{"post":{"tags":["Portail Client — Inbox"],"summary":"Inbox Send","operationId":"inbox_send_api_me_inbox_send_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InboxSendPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/inbox/mark-read/{channel}/{thread_id}":{"post":{"tags":["Portail Client — Inbox"],"summary":"Inbox Mark Read","operationId":"inbox_mark_read_api_me_inbox_mark_read__channel___thread_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel","in":"path","required":true,"schema":{"type":"string","title":"Channel"}},{"name":"thread_id","in":"path","required":true,"schema":{"type":"string","title":"Thread Id"}},{"name":"page_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/inbox/import-contact":{"post":{"tags":["Portail Client — Inbox"],"summary":"Inbox Import Contact","description":"Crée un contact à partir d'un thread inbox qui n'a aucun contact correspondant\nyet. For WhatsApp channels, also try to pull the public profile (name,\nprofile picture URL) via Meta Graph API as a best-effort sync.","operationId":"inbox_import_contact_api_me_inbox_import_contact_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/ai/generate-image":{"post":{"tags":["Portail Client — IA"],"summary":"Generate Image","operationId":"generate_image_api_me_ai_generate_image_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateImagePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/ai/edit-image":{"post":{"tags":["Portail Client — IA"],"summary":"Edit Image","operationId":"edit_image_api_me_ai_edit_image_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_edit_image_api_me_ai_edit_image_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/ai/generate-profile-photo":{"post":{"tags":["Portail Client — IA"],"summary":"Generate Profile Photo","operationId":"generate_profile_photo_api_me_ai_generate_profile_photo_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfilePhotoPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/ai/generate-video":{"post":{"tags":["Portail Client — IA"],"summary":"Generate Video","operationId":"generate_video_api_me_ai_generate_video_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateVideoPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/ai/history":{"get":{"tags":["Portail Client — IA"],"summary":"Ai History","operationId":"ai_history_api_me_ai_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/files/ai/{tenant_id}/{filename}":{"get":{"tags":["Portail Client — IA"],"summary":"Serve Ai Image","operationId":"serve_ai_image_api_files_ai__tenant_id___filename__get","parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"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/cashier/products/generate-icon":{"post":{"summary":"Generate Product Icon","operationId":"generate_product_icon_api_cashier_products_generate_icon_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/public/catalog/track":{"post":{"tags":["Public"],"summary":"Track Catalog Event","operationId":"track_catalog_event_api_public_catalog_track_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogTrackPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/catalog/stats":{"get":{"tags":["Portail Client"],"summary":"Catalog Stats","operationId":"catalog_stats_api_me_catalog_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/catalog/history":{"get":{"tags":["Portail Client"],"summary":"Catalog History","operationId":"catalog_history_api_me_catalog_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/catalog/export.csv":{"get":{"tags":["Portail Client"],"summary":"Catalog Export Csv","operationId":"catalog_export_csv_api_me_catalog_export_csv_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}},{"name":"event_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/catalog/quotes/mark-treated":{"post":{"tags":["Portail Client"],"summary":"Mark Quotes Treated","operationId":"mark_quotes_treated_api_me_catalog_quotes_mark_treated_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkQuoteTreatedPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/formations/{fid}/stripe/checkout":{"post":{"tags":["Portail Client"],"summary":"Create Formation Checkout","description":"Crée une session Stripe Checkout pour une formation payante.","operationId":"create_formation_checkout_api_me_formations__fid__stripe_checkout_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"fid","in":"path","required":true,"schema":{"type":"string","title":"Fid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StripeCheckoutPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/payments/stripe/status/{session_id}":{"get":{"tags":["Portail Client"],"summary":"Get Stripe Status","description":"Poll the checkout status. Idempotent — enrollment only created\nonce even if polled in parallel.","operationId":"get_stripe_status_api_payments_stripe_status__session_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhook/stripe":{"post":{"tags":["Payments"],"summary":"Stripe Webhook","description":"Stripe webhook. Verifies signature, then finalises either a paid\nformation enrollment OR a public catalogue order (idempotent).","operationId":"stripe_webhook_api_webhook_stripe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/weather/settings":{"get":{"tags":["Public — Météo"],"summary":"Get Weather Settings","description":"Lit la config météo publique depuis db.settings. Retourne au moins\n`enabled=False` si rien n'est configuré.","operationId":"get_weather_settings_api_public_weather_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/weather/ip-locate":{"get":{"tags":["Public — Météo"],"summary":"Ip Locate","description":"Tente de résoudre l'IP de la requête en ville/lat/lon.\n\nStratégie :\n  1. Si Cloudflare nous renvoie `cf-iplatitude`/`cf-iplongitude` →\n     on utilise directement (ultra-rapide, gratuit, RGPD-friendly).\n  2. Sinon, on appelle ipwho.is (gratuit, sans clé).\n  3. En dernier recours, on renvoie un fallback configurable.","operationId":"ip_locate_api_public_weather_ip_locate_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/weather/geocode":{"get":{"tags":["Public — Météo"],"summary":"Geocode","description":"Recherche une ville par nom et renvoie lat/lon + variantes.\nSource : Open-Meteo Geocoding API (gratuit, multilingue).","operationId":"geocode_api_public_weather_geocode_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"maxLength":120,"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/weather/current":{"get":{"tags":["Public — Météo"],"summary":"Current","description":"Renvoie la météo actuelle (temp, ressenti, humidité, vent, condition)\n+ prochaines 24 h en données horaires basiques.","operationId":"current_api_public_weather_current_get","parameters":[{"name":"lat","in":"query","required":true,"schema":{"type":"number","maximum":90,"minimum":-90,"title":"Lat"}},{"name":"lon","in":"query","required":true,"schema":{"type":"number","maximum":180,"minimum":-180,"title":"Lon"}},{"name":"units","in":"query","required":false,"schema":{"type":"string","pattern":"^(celsius|fahrenheit)$","default":"celsius","title":"Units"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/officines-registry/garde-planning":{"get":{"tags":["Admin — Officines Registry"],"summary":"List Garde Planning","description":"Retourne le planning complet pour une année + la liste des groupes\nexistants (officines comptés par groupe).","operationId":"list_garde_planning_api_admin_officines_registry_garde_planning_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"year","in":"query","required":true,"schema":{"type":"integer","maximum":2100,"minimum":2024,"title":"Year"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/officines-registry/garde-planning/generate":{"post":{"tags":["Admin — Officines Registry"],"summary":"Generate Garde Planning","description":"Génère un planning séquentiel complet pour une année.\n\nBody :\n  - year : entier (ex. 2026)\n  - start_group : groupe en garde semaine 1\n  - groups (optionnel) : liste explicite de l'ordre de rotation,\n    sinon utilise les groupes existants triés.\n  - overwrite_manual (optionnel, défaut False) : si True, écrase aussi\n    les semaines marquées en override manuel.","operationId":"generate_garde_planning_api_admin_officines_registry_garde_planning_generate_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/officines-registry/garde-planning/{year}/{week}":{"put":{"tags":["Admin — Officines Registry"],"summary":"Override Garde Week","description":"Override manuel d'une semaine spécifique.\n\nBody accepte :\n  - `groupe_garde` (int) : groupe standard (obligatoire si assist_group absent)\n  - `assist_group` (int|null) : Iter43-fix24az-r — groupe d'assistance\n    qui vient en appui au groupe standard cette semaine. `null` ou\n    `0` désactive l'appui.","operationId":"override_garde_week_api_admin_officines_registry_garde_planning__year___week__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"year","in":"path","required":true,"schema":{"type":"integer","title":"Year"}},{"name":"week","in":"path","required":true,"schema":{"type":"integer","title":"Week"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin — Officines Registry"],"summary":"Reset Garde Week","description":"Supprime l'override d'une semaine (retombe sur la rotation auto).","operationId":"reset_garde_week_api_admin_officines_registry_garde_planning__year___week__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"year","in":"path","required":true,"schema":{"type":"integer","title":"Year"}},{"name":"week","in":"path","required":true,"schema":{"type":"integer","title":"Week"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/officines-registry/garde-planning/year/{year}":{"delete":{"tags":["Admin — Officines Registry"],"summary":"Reset Garde Year","description":"Iter43-fix24az-e (2026-02-26) — Réinitialise TOUTES les semaines\nd'une année (= supprime tous les documents `garde_planning` de cette\nannée). Le planning retombera sur la rotation séquentielle calculée.\n\nIMPORTANT — cette route DOIT être déclarée AVANT la route plus\ngénérique `/garde-planning/{year}/{week}` car FastAPI matche les\nroutes dans l'ordre de déclaration. Si on inverse, l'URL\n`/garde-planning/year/2026` est matchée comme `{year}='year'` →\nHTTP 422 int_parsing.","operationId":"reset_garde_year_api_admin_officines_registry_garde_planning_year__year__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"year","in":"path","required":true,"schema":{"type":"integer","title":"Year"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/officines-registry/garde-groups/{group_number}":{"delete":{"tags":["Admin — Officines Registry"],"summary":"Delete Empty Garde Group","description":"Iter43-fix24az-e — Supprime un groupe de garde S'IL EST VIDE\n(aucune officine assignée). Refus si au moins 1 officine porte\nencore `groupe_garde == group_number`.","operationId":"delete_empty_garde_group_api_admin_officines_registry_garde_groups__group_number__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_number","in":"path","required":true,"schema":{"type":"integer","title":"Group Number"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/officines/garde/current":{"get":{"tags":["Public — Officines"],"summary":"Current Garde","description":"Endpoint public : groupe en garde cette semaine + liste des officines.\n\nUtilisé par la commande `!Garde` de Liluvine sur WhatsApp et peut être\nappelé depuis la page publique pour afficher les pharmacies de garde.\n\nIter43-fix24ak (2026-06-17) — Le filtre `status=\"active\"` est retiré\n(alignement avec `_build_garde_reply`) : seules les officines\n`suspended` sont exclues. Inclut aussi `cms_header`, `cms_footer`,\n`cms_image_url` configurés via Admin Settings pour personnaliser\nla page publique sans redéployer.","operationId":"current_garde_api_public_officines_garde_current_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/liluvine-pro/wa-requests":{"get":{"tags":["Admin — Liluvine PRO"],"summary":"List Wa Requests","description":"Iter43-fix24d — Liste les **exclamations** (`!commandes`) reçues.\n\nCette table ne contient QUE les messages WhatsApp/SMS entrants\ncommençant par `!` (ex. `!Garde`, `!Meteo`, `!Aizenta`). Les conversations\nLiluvine classiques (sans `!`) vont dans `liluvine_pro_messages` et ne\nsont PAS listées ici.\n\nSi `group_by_phone=True` (défaut), agrège par numéro avec stats.","operationId":"list_wa_requests_api_admin_liluvine_pro_wa_requests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"group_by_phone","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Group By Phone"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}},{"name":"only_unknown","in":"query","required":false,"schema":{"type":"boolean","description":"Si True, ne renvoie que les commandes non-supportées (audit roadmap)","default":false,"title":"Only Unknown"},"description":"Si True, ne renvoie que les commandes non-supportées (audit roadmap)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine-pro/exclamations/{command}/auto-handler":{"post":{"tags":["Admin — Liluvine PRO"],"summary":"Generate Handler Stub","description":"Appelle Claude Sonnet pour proposer un handler Python complet pour la commande `!<command>`.\n\nL'IA reçoit en contexte :\n  - Le nom de la commande\n  - Les 3 derniers exemples reçus (body + args) extraits de `liluvine_exclamations`\n  - Le pattern existant (`_build_garde_reply` / `_build_meteo_reply`) pour cohérence\n\nElle renvoie du code Python prêt à coller dans `liluvine_wa_autoreply.py`,\navec une explication des points d'attention (DB collections, secrets, etc.).","operationId":"generate_handler_stub_api_admin_liluvine_pro_exclamations__command__auto_handler_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"command","in":"path","required":true,"schema":{"type":"string","title":"Command"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine-pro/handler-suggestions":{"get":{"tags":["Admin — Liluvine PRO"],"summary":"List Handler Suggestions","operationId":"list_handler_suggestions_api_admin_liluvine_pro_handler_suggestions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"command","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Command"}},{"name":"applied","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Applied"}},{"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine-pro/handler-suggestions/{suggestion_id}":{"patch":{"tags":["Admin — Liluvine PRO"],"summary":"Update Handler Suggestion","description":"Marquer comme `applied` et/ou ajouter des notes éditeur.","operationId":"update_handler_suggestion_api_admin_liluvine_pro_handler_suggestions__suggestion_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"suggestion_id","in":"path","required":true,"schema":{"type":"string","title":"Suggestion Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin — Liluvine PRO"],"summary":"Delete Handler Suggestion","operationId":"delete_handler_suggestion_api_admin_liluvine_pro_handler_suggestions__suggestion_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"suggestion_id","in":"path","required":true,"schema":{"type":"string","title":"Suggestion Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine-pro/handler-suggestions/{suggestion_id}/dry-run":{"post":{"tags":["Admin — Liluvine PRO"],"summary":"Dry Run Handler Suggestion","description":"Exécute la fonction `_build_<command>_reply(db, args)` extraite du code\ngénéré par Claude, dans un sandbox restreint, avec un timeout court.\n\nBody : { args?: str, timeout_ms?: int }\n\nRetour :\n  { ok: bool, reply: str|None, error: str|None, duration_ms: int,\n    extracted_function: str, code_snippet: str }","operationId":"dry_run_handler_suggestion_api_admin_liluvine_pro_handler_suggestions__suggestion_id__dry_run_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"suggestion_id","in":"path","required":true,"schema":{"type":"string","title":"Suggestion Id"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine-pro/wa-requests/import-to-contacts":{"post":{"tags":["Admin — Liluvine PRO"],"summary":"Import Wa Requests To Contacts","description":"Importe les numéros sélectionnés dans le carnet de contacts du user.\n\nBody : { phones: [\"22501020304\", ...], group_name?: \"Interrogations WA\" }","operationId":"import_wa_requests_to_contacts_api_admin_liluvine_pro_wa_requests_import_to_contacts_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/liluvine-pro/wa-requests/export.pdf":{"get":{"tags":["Admin — Liluvine PRO"],"summary":"Export Wa Requests Pdf","description":"Exporte une liste de numéros sélectionnés en PDF (avec stats par numéro).","operationId":"export_wa_requests_pdf_api_admin_liluvine_pro_wa_requests_export_pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"phones","in":"query","required":true,"schema":{"type":"string","description":"Liste de numéros séparés par virgules","title":"Phones"},"description":"Liste de numéros séparés par virgules"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/bird/inbound-sms":{"post":{"tags":["Webhooks — Bird"],"summary":"Bird Inbound Sms","description":"Bird POST y envoie chaque SMS entrant (signé HMAC SHA-256).\n\nLe payload JSON typique contient :\n  - id, workspaceId, channelId, direction=\"inbound\"\n  - sender / receiver / from / to (dépend du schema Bird)\n  - body.text.text ou body.text ou content.text (selon version)\n  - timestamps\n\nLe handler :\n  1. Vérifie la signature `Bird-Signature` si webhook_secret configuré\n  2. Persiste le SMS dans `bird_sms_messages` (unique sur provider_id)\n  3. Si Liluvine est activé, génère une réponse IA et l'envoie via Bird\n  4. Retourne 200 OK avec {status:\"ok\"}","operationId":"bird_inbound_sms_api_webhooks_bird_inbound_sms_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/webhooks/bird/delivery-report":{"post":{"tags":["Webhooks — Bird"],"summary":"Bird Delivery Report","operationId":"bird_delivery_report_api_webhooks_bird_delivery_report_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/bird/test-sms":{"post":{"tags":["Admin — Bird"],"summary":"Admin Test Bird Sms","description":"Test d'envoi SMS Bird avec retour DÉTAILLÉ pour debugging.\n\nContrairement à `/admin/bird/send-sms`, cet endpoint :\n  - Bypass le toggle `bird_enabled` (permet de tester avant activation)\n  - Retourne TOUS les détails : http_status, headers, body, latency_ms, URL appelée\n  - Ne persiste PAS le résultat dans bird_sms_messages\nIdéal pour valider la config Workspace ID / Channel ID / Access Key.","operationId":"admin_test_bird_sms_api_admin_bird_test_sms_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BirdSendPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/bird/send-sms":{"post":{"tags":["Admin — Bird"],"summary":"Admin Send Bird Sms","operationId":"admin_send_bird_sms_api_admin_bird_send_sms_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BirdSendPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/bird/messages":{"get":{"tags":["Admin — Bird"],"summary":"Admin List Bird Messages","operationId":"admin_list_bird_messages_api_admin_bird_messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":200,"title":"Limit"}},{"name":"direction","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(inbound|outbound)$"},{"type":"null"}],"title":"Direction"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/bird/status":{"get":{"tags":["Admin — Bird"],"summary":"Admin Bird Status","operationId":"admin_bird_status_api_admin_bird_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/bird/cost-daily-series":{"get":{"tags":["Admin — Bird"],"summary":"Admin Bird Cost Daily Series","description":"Iter43-fix24f — Série temporelle journalière des SMS Bird outbound.\n\nRetourne un tableau de {date, count, cost} pour les N derniers jours,\nutilisé par la page Admin → Bird Cost (graphique).","operationId":"admin_bird_cost_daily_series_api_admin_bird_cost_daily_series_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/bird/cost-summary":{"get":{"tags":["Admin — Bird"],"summary":"Admin Bird Cost Summary","description":"Iter43-fix24d — Résumé du coût Bird : aujourd'hui, hier, 7 derniers jours, 30 derniers jours.\n\nLe coût est calculé en multipliant le nombre de SMS outbound `provider=\"bird\"`\npar `settings.bird_cost_per_sms_xof` (défaut 25 XOF).","operationId":"admin_bird_cost_summary_api_admin_bird_cost_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/webhooks/officines/inventory":{"post":{"tags":["Webhooks — Officines"],"summary":"Receive Inventory Webhook","description":"Reçoit l'inventaire d'une officine via Bearer token.","operationId":"receive_inventory_webhook_api_webhooks_officines_inventory_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfficineInventoryWebhookPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/officines/inventory/docs":{"get":{"tags":["Webhooks — Officines"],"summary":"Webhook Inventory Docs","description":"Documentation rapide pour intégrateurs SI officine.","operationId":"webhook_inventory_docs_api_webhooks_officines_inventory_docs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/clients/{client_id}/ai-quota":{"get":{"tags":["Admin — IA Quotas"],"summary":"Get Ai Quota","operationId":"get_ai_quota_api_admin_clients__client_id__ai_quota_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Admin — IA Quotas"],"summary":"Put Ai Quota","operationId":"put_ai_quota_api_admin_clients__client_id__ai_quota_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotaConfig"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/clients/{client_id}/ai-usage":{"get":{"tags":["Admin — IA Quotas"],"summary":"Get Ai Usage","operationId":"get_ai_usage_api_admin_clients__client_id__ai_usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/clients/{client_id}/ai-usage/export.csv":{"get":{"tags":["Admin — IA Quotas"],"summary":"Export Ai Usage Csv","operationId":"export_ai_usage_csv_api_admin_clients__client_id__ai_usage_export_csv_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/clients/{client_id}/ai-usage/export.pdf":{"get":{"tags":["Admin — IA Quotas"],"summary":"Export Ai Usage Pdf","operationId":"export_ai_usage_pdf_api_admin_clients__client_id__ai_usage_export_pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"client_id","in":"path","required":true,"schema":{"type":"string","title":"Client Id"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/ai-usage":{"get":{"tags":["Portail Client — IA"],"summary":"Me Ai Usage","operationId":"me_ai_usage_api_me_ai_usage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/ai-costs/monthly":{"get":{"tags":["Admin — IA Quotas"],"summary":"Ai Costs Monthly","operationId":"ai_costs_monthly_api_admin_ai_costs_monthly_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"months","in":"query","required":false,"schema":{"type":"integer","maximum":36,"minimum":1,"default":12,"title":"Months"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine-pro/system-prompt":{"get":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Get System Prompt","operationId":"admin_get_system_prompt_api_admin_liluvine_pro_system_prompt_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Set System Prompt","operationId":"admin_set_system_prompt_api_admin_liluvine_pro_system_prompt_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/liluvine-pro/wa-autoreply":{"get":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Get Autoreply","operationId":"admin_get_autoreply_api_admin_liluvine_pro_wa_autoreply_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Set Autoreply","operationId":"admin_set_autoreply_api_admin_liluvine_pro_wa_autoreply_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoreplyConfigPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/liluvine-pro/wa-autoreply/history":{"get":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Autoreply History","operationId":"admin_autoreply_history_api_admin_liluvine_pro_wa_autoreply_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"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"}}}}}}},"/api/me/liluvine-pro/autoreply-feed":{"get":{"tags":["Portail Client — Liluvine PRO"],"summary":"Autoreply Feed","operationId":"autoreply_feed_api_me_liluvine_pro_autoreply_feed_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Since"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/liluvine-pro/branding":{"get":{"tags":["Portail Client — Liluvine PRO"],"summary":"Get Branding","operationId":"get_branding_api_me_liluvine_pro_branding_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/liluvine-pro/branding":{"get":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Get Branding","operationId":"admin_get_branding_api_admin_liluvine_pro_branding_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Set Branding","operationId":"admin_set_branding_api_admin_liluvine_pro_branding_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandingPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/webhooks/liluvine-pro/{source}/{secret}":{"post":{"tags":["Webhooks"],"summary":"Liluvine Inbound","operationId":"liluvine_inbound_api_webhooks_liluvine_pro__source___secret__post","parameters":[{"name":"source","in":"path","required":true,"schema":{"type":"string","title":"Source"}},{"name":"secret","in":"path","required":true,"schema":{"type":"string","title":"Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine-pro/inbound-urls":{"get":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Inbound Urls","operationId":"admin_inbound_urls_api_admin_liluvine_pro_inbound_urls_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/liluvine-pro/chat":{"post":{"tags":["Portail Client — Liluvine PRO"],"summary":"Chat","operationId":"chat_api_me_liluvine_pro_chat_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatMessage"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/liluvine-pro/chat-with-image":{"post":{"tags":["Portail Client — Liluvine PRO"],"summary":"Chat With Image","operationId":"chat_with_image_api_me_liluvine_pro_chat_with_image_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_chat_with_image_api_me_liluvine_pro_chat_with_image_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/liluvine-pro/chat/stream":{"post":{"tags":["Portail Client — Liluvine PRO"],"summary":"Chat Stream","operationId":"chat_stream_api_me_liluvine_pro_chat_stream_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatMessage"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/liluvine-pro/sessions":{"get":{"tags":["Portail Client — Liluvine PRO"],"summary":"List Sessions","operationId":"list_sessions_api_me_liluvine_pro_sessions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/liluvine-pro/sessions/{sid}":{"get":{"tags":["Portail Client — Liluvine PRO"],"summary":"Get Session","operationId":"get_session_api_me_liluvine_pro_sessions__sid__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Portail Client — Liluvine PRO"],"summary":"Rename Session","operationId":"rename_session_api_me_liluvine_pro_sessions__sid__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameSession"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Portail Client — Liluvine PRO"],"summary":"Delete Session","operationId":"delete_session_api_me_liluvine_pro_sessions__sid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/liluvine-pro/request-help":{"post":{"tags":["Portail Client — Liluvine PRO"],"summary":"Request Help","operationId":"request_help_api_me_liluvine_pro_request_help_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload","default":{}}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/liluvine-pro/sessions/{sid}/takeover":{"post":{"tags":["Admin — Liluvine PRO"],"summary":"Takeover Session","operationId":"takeover_session_api_admin_liluvine_pro_sessions__sid__takeover_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"default":{},"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine-pro/sessions/{sid}/release":{"post":{"tags":["Admin — Liluvine PRO"],"summary":"Release Session","operationId":"release_session_api_admin_liluvine_pro_sessions__sid__release_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine-pro/sessions-history":{"get":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Sessions History","operationId":"admin_sessions_history_api_admin_liluvine_pro_sessions_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel"}},{"name":"date_range","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date Range"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine-pro/screenshots-history":{"get":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Screenshots History","description":"Liste les captures d'écran envoyées par les clients à Liluvine PRO via\n/chat-with-image endpoint. Each entry includes the sender, the\noriginal client screenshot URL, the Vision analysis (OCR + summary),\nand the top SAWALI matches that Liluvine proposed.","operationId":"admin_screenshots_history_api_admin_liluvine_pro_screenshots_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine-pro/top-screens":{"get":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Top Screens","description":"Aggregate the most-matched SAWALI screens across all client\nscreenshots. Useful to spot pages that need better onboarding /\ndocumentation (high-traffic = source of confusion).","operationId":"admin_top_screens_api_admin_liluvine_pro_top_screens_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine-pro/diagnose":{"get":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Diagnose","operationId":"admin_diagnose_api_admin_liluvine_pro_diagnose_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"email","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},{"name":"phone","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/contacts/repair-user-contact":{"post":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Repair User Contact","operationId":"admin_repair_user_contact_api_admin_contacts_repair_user_contact_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/liluvine-pro/bypass-emails":{"get":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Get Bypass Emails","operationId":"admin_get_bypass_emails_api_admin_liluvine_pro_bypass_emails_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Patch Bypass Emails","operationId":"admin_patch_bypass_emails_api_admin_liluvine_pro_bypass_emails_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BypassPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/contacts/search-cross-tenant":{"get":{"tags":["Portail Client"],"summary":"Search Cross Tenant Contacts","description":"Recherche un numéro de téléphone à travers TOUS les tenants. Renvoie une fiche\ncontact cards (name, phone, whatsapp, email, company, tags only —\nno client_id, owner_id, internal flags). Available to every\nauthenticated user (the leak risk is bounded : caller must already\nknow the phone number).","operationId":"search_cross_tenant_contacts_api_me_contacts_search_cross_tenant_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"phone","in":"query","required":true,"schema":{"type":"string","title":"Phone"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/contacts/import-cross-tenant":{"post":{"tags":["Portail Client"],"summary":"Import Cross Tenant Contact","description":"Crée un contact dans le scope du tenant de l'appelant depuis n'importe quel\nmatching cross-tenant record. By default only the contact card\nis copied. Admin/superviseur may set `include_messages=True` to\nalso pull the WhatsApp history (RGPD-controlled).","operationId":"import_cross_tenant_contact_api_me_contacts_import_cross_tenant_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CrossTenantImportPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/liluvine-pro/generate-doc-draft":{"post":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Generate Doc Draft","operationId":"admin_generate_doc_draft_api_admin_liluvine_pro_generate_doc_draft_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/liluvine-pro/coverage-gaps":{"get":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Coverage Gaps","description":"Renvoie les messages image utilisateur dont le meilleur match Qdrant est sous\n`min_score` (or no matches at all). These are gaps in the KB:\nclients asked about something the KB doesn't cover. Each entry\nkeeps the client image, the Vision analysis, and the user's text\n— perfect input to enrich Qdrant via the admin UI.","operationId":"admin_coverage_gaps_api_admin_liluvine_pro_coverage_gaps_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}},{"name":"min_score","in":"query","required":false,"schema":{"type":"number","default":0.5,"title":"Min Score"}},{"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"}}}}}}},"/api/admin/liluvine-pro/module-acl":{"get":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Get Acl","operationId":"admin_get_acl_api_admin_liluvine_pro_module_acl_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin — Liluvine PRO"],"summary":"Admin Set Acl","operationId":"admin_set_acl_api_admin_liluvine_pro_module_acl_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/_ModuleAclPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/settings/test-url":{"post":{"tags":["Admin"],"summary":"Admin Test Critical Url","operationId":"admin_test_critical_url_api_admin_settings_test_url_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CriticalUrlTestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/secrets/change-audit":{"get":{"tags":["Admin"],"summary":"Admin Secret Change Audit","description":"Audit trail of vault-tracked key changes (no values, only fingerprints).","operationId":"admin_secret_change_audit_api_admin_secrets_change_audit_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/incidents":{"get":{"tags":["Admin"],"summary":"Admin List Incidents","operationId":"admin_list_incidents_api_admin_incidents_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/incidents/{incident_id}":{"delete":{"tags":["Admin"],"summary":"Admin Delete Incident","operationId":"admin_delete_incident_api_admin_incidents__incident_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","title":"Incident Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/incidents/export.csv":{"get":{"tags":["Admin"],"summary":"Admin Export Incidents Csv","operationId":"admin_export_incidents_csv_api_admin_incidents_export_csv_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/contact-groups":{"get":{"tags":["Portail Client — Groupes"],"summary":"List Groups","operationId":"list_groups_api_me_contact_groups_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Portail Client — Groupes"],"summary":"Create Group","operationId":"create_group_api_me_contact_groups_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/contact-groups/{gid}":{"put":{"tags":["Portail Client — Groupes"],"summary":"Update Group","operationId":"update_group_api_me_contact_groups__gid__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"string","title":"Gid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Portail Client — Groupes"],"summary":"Delete Group","operationId":"delete_group_api_me_contact_groups__gid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"string","title":"Gid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/contact-groups/{gid}/contacts":{"post":{"tags":["Portail Client — Groupes"],"summary":"Add Contacts","operationId":"add_contacts_api_me_contact_groups__gid__contacts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"string","title":"Gid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddContactsPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/contact-groups/{gid}/contacts/{contact_id}":{"delete":{"tags":["Portail Client — Groupes"],"summary":"Remove Contact","operationId":"remove_contact_api_me_contact_groups__gid__contacts__contact_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"string","title":"Gid"}},{"name":"contact_id","in":"path","required":true,"schema":{"type":"string","title":"Contact Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/contact-groups/resolve":{"post":{"tags":["Portail Client — Groupes"],"summary":"Resolve Recipients","description":"Expand a (groups, contacts) selection into the unique target list.\n\nReturns the merged set of contact_ids (no duplicates) plus a flat\nlist of contact records (id, name, phone, whatsapp) so the caller\ncan render a preview AND submit the recipient ids.","operationId":"resolve_recipients_api_me_contact_groups_resolve_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResolvePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/form-categories":{"get":{"tags":["Formulaires"],"summary":"List Categories","operationId":"list_categories_api_me_form_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Formulaires"],"summary":"Create Category","operationId":"create_category_api_me_form_categories_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/form-categories/{cid}":{"put":{"tags":["Formulaires"],"summary":"Update Category","operationId":"update_category_api_me_form_categories__cid__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Formulaires"],"summary":"Delete Category","operationId":"delete_category_api_me_form_categories__cid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/form-categories/{cid}/set-default":{"post":{"tags":["Formulaires"],"summary":"Set Default Category","operationId":"set_default_category_api_me_form_categories__cid__set_default_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/errors/ingest":{"post":{"tags":["Registre des erreurs (Webhook)"],"summary":"Ingest Error","description":"Webhook public utilisé par les logiciels clients pour pousser des exceptions/erreurs.\n\nAuthentication : Bearer token in the `Authorization` header. The\ntoken must match `settings.global.errors_webhook_token`. If that\nsetting is empty, the webhook accepts unauthenticated calls (dev\nonly — admins must set a token in production).\n\nIter43 (2026-03) — Accepte les formats imbriqués (Aizenta:\n`{TicketDemnde: {...}}`, Biolog: `{Erreur: {...}}` etc.) ainsi que\nle format plat historique. L'unwrap est automatique.","operationId":"ingest_error_api_errors_ingest_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/errors":{"get":{"tags":["Registre des erreurs"],"summary":"List Errors","operationId":"list_errors_api_me_errors_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code_client","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Client"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"}},{"name":"active_only","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active Only"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}},{"name":"date_window","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date Window"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":200,"title":"Limit"}},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Skip"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/errors/stats":{"get":{"tags":["Registre des erreurs"],"summary":"Errors Stats","operationId":"errors_stats_api_me_errors_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/errors/{eid}/acknowledge":{"post":{"tags":["Registre des erreurs"],"summary":"Acknowledge","operationId":"acknowledge_api_me_errors__eid__acknowledge_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/errors/bulk-acknowledge":{"post":{"tags":["Registre des erreurs"],"summary":"Bulk Acknowledge","operationId":"bulk_acknowledge_api_me_errors_bulk_acknowledge_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkIdsPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/errors/acknowledge-all":{"post":{"tags":["Registre des erreurs"],"summary":"Acknowledge All","description":"Marque comme lues TOUTES les erreurs non lues, indépendamment des\nfiltres actuels et de la pagination. Réservé Admin/Superviseur (le\nModérateur peut lire mais pas tout marquer en masse).","operationId":"acknowledge_all_api_me_errors_acknowledge_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/errors/{eid}":{"get":{"tags":["Registre des erreurs"],"summary":"Get Error","operationId":"get_error_api_me_errors__eid__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Registre des erreurs"],"summary":"Soft Delete Error","operationId":"soft_delete_error_api_me_errors__eid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/errors/purge":{"post":{"tags":["Registre des erreurs"],"summary":"Purge Errors","description":"Hard-delete errors matching the date range. Superviseur ONLY.","operationId":"purge_errors_api_me_errors_purge_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PurgePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/errors/bulk-delete":{"post":{"tags":["Registre des erreurs"],"summary":"Bulk Delete Errors","description":"Hard-delete les erreurs sélectionnées par leurs ids.\nAdmin ou Superviseur uniquement (Modérateur = lecture).","operationId":"bulk_delete_errors_api_me_errors_bulk_delete_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkIdsPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/errors/reset":{"post":{"tags":["Registre des erreurs"],"summary":"Reset All Errors","description":"Hard-delete TOUTES les erreurs (remise à zéro complète).\nRéservé Admin/Superviseur.","operationId":"reset_all_errors_api_me_errors_reset_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/error-registry/migrate-from-tickets":{"post":{"tags":["Admin — Registre des erreurs"],"summary":"Migrate From Tickets","operationId":"migrate_from_tickets_api_admin_error_registry_migrate_from_tickets_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/vidal/config":{"get":{"tags":["Admin — VIDAL"],"summary":"Admin Get Vidal Config","operationId":"admin_get_vidal_config_api_admin_vidal_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin — VIDAL"],"summary":"Admin Set Vidal Config","operationId":"admin_set_vidal_config_api_admin_vidal_config_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VidalConfigPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/vidal/test-connection":{"post":{"tags":["Admin — VIDAL"],"summary":"Admin Test Connection","description":"Pings VIDAL with a cheap call to validate credentials and base URL.\n\nReturns a full debug payload (URL appelée, params masqués, body, status\ncode, content-type, elapsed_ms, body preview) for the admin diagnostic\nUI in `S058VidalSection`.","operationId":"admin_test_connection_api_admin_vidal_test_connection_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/vidal/webhook/callback":{"post":{"tags":["VIDAL"],"summary":"Vidal Webhook Callback","operationId":"vidal_webhook_callback_api_vidal_webhook_callback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VidalWebhookCallbackPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/vidal/webhook/test":{"post":{"tags":["Admin — VIDAL"],"summary":"Admin Test Webhook","operationId":"admin_test_webhook_api_admin_vidal_webhook_test_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/vidal/quota/me":{"get":{"tags":["VIDAL"],"summary":"My Quota","operationId":"my_quota_api_vidal_quota_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/vidal/proxy/{subpath}":{"get":{"tags":["VIDAL"],"summary":"Vidal Proxy","description":"Forward any HTTP request to the configured VIDAL origin.\n\nUsed by the iframe-rendered Angular SPA: `<base href=\"/api/vidal/proxy/\">`\nmakes every relative resource go through here.","operationId":"vidal_proxy_api_vidal_proxy__subpath__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subpath","in":"path","required":true,"schema":{"type":"string","title":"Subpath"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"options":{"tags":["VIDAL"],"summary":"Vidal Proxy","description":"Forward any HTTP request to the configured VIDAL origin.\n\nUsed by the iframe-rendered Angular SPA: `<base href=\"/api/vidal/proxy/\">`\nmakes every relative resource go through here.","operationId":"vidal_proxy_api_vidal_proxy__subpath__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subpath","in":"path","required":true,"schema":{"type":"string","title":"Subpath"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["VIDAL"],"summary":"Vidal Proxy","description":"Forward any HTTP request to the configured VIDAL origin.\n\nUsed by the iframe-rendered Angular SPA: `<base href=\"/api/vidal/proxy/\">`\nmakes every relative resource go through here.","operationId":"vidal_proxy_api_vidal_proxy__subpath__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subpath","in":"path","required":true,"schema":{"type":"string","title":"Subpath"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["VIDAL"],"summary":"Vidal Proxy","description":"Forward any HTTP request to the configured VIDAL origin.\n\nUsed by the iframe-rendered Angular SPA: `<base href=\"/api/vidal/proxy/\">`\nmakes every relative resource go through here.","operationId":"vidal_proxy_api_vidal_proxy__subpath__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subpath","in":"path","required":true,"schema":{"type":"string","title":"Subpath"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["VIDAL"],"summary":"Vidal Proxy","description":"Forward any HTTP request to the configured VIDAL origin.\n\nUsed by the iframe-rendered Angular SPA: `<base href=\"/api/vidal/proxy/\">`\nmakes every relative resource go through here.","operationId":"vidal_proxy_api_vidal_proxy__subpath__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subpath","in":"path","required":true,"schema":{"type":"string","title":"Subpath"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vidal/proxy":{"get":{"tags":["VIDAL"],"summary":"Vidal Proxy Root","operationId":"vidal_proxy_root_api_vidal_proxy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["VIDAL"],"summary":"Vidal Proxy Root","operationId":"vidal_proxy_root_api_vidal_proxy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["VIDAL"],"summary":"Vidal Proxy Root","operationId":"vidal_proxy_root_api_vidal_proxy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"delete":{"tags":["VIDAL"],"summary":"Vidal Proxy Root","operationId":"vidal_proxy_root_api_vidal_proxy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"options":{"tags":["VIDAL"],"summary":"Vidal Proxy Root","operationId":"vidal_proxy_root_api_vidal_proxy_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/vidal/search":{"get":{"tags":["VIDAL"],"summary":"Search","operationId":"search_api_vidal_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2,"description":"Terme de recherche","title":"Q"},"description":"Terme de recherche"},{"name":"filter","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(product|package|ucd|vmp|all-packages)$"},{"type":"null"}],"title":"Filter"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vidal/product/{product_id}":{"get":{"tags":["VIDAL"],"summary":"Get Product","operationId":"get_product_api_vidal_product__product_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vidal/product/{product_id}/documents":{"get":{"tags":["VIDAL"],"summary":"Get Product Documents","operationId":"get_product_documents_api_vidal_product__product_id__documents_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"integer","title":"Product Id"}},{"name":"type","in":"query","required":false,"schema":{"type":"string","pattern":"^(RCP|FULL_MONO|PIL|INDICATIONS)$","default":"RCP","title":"Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vidal/products/status":{"get":{"tags":["VIDAL"],"summary":"Get Products By Status","operationId":"get_products_by_status_api_vidal_products_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":true,"schema":{"type":"string","pattern":"^(NEW|AVAILABLE|DELETED|PHARMACO)$","title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vidal/prescription/analyze":{"post":{"tags":["VIDAL"],"summary":"Analyze Prescription","description":"Forwards the payload to VIDAL `/alerts/full`. Result includes alert\nobjects per type (allergy, contraindication, interaction, posology…).\n\nIter43-fix24y (2026-06-16) — VIDAL exige POST avec `Content-Type:\ntext/xml` et un body XML pour `/alerts/full`. On construit l'XML\nbest-effort à partir des champs structurés. Si l'utilisateur fournit\n`xml_body` (string), on l'envoie tel quel.","operationId":"analyze_prescription_api_vidal_prescription_analyze_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrescriptionAnalysisPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/vidal/cache":{"delete":{"tags":["Admin — VIDAL"],"summary":"Purge Cache","operationId":"purge_cache_api_admin_vidal_cache_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/vidal/actions":{"get":{"tags":["Admin — VIDAL"],"summary":"List Actions","operationId":"list_actions_api_admin_vidal_actions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin — VIDAL"],"summary":"Replace Actions","operationId":"replace_actions_api_admin_vidal_actions_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VidalActionsPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/vidal/actions/reset-defaults":{"post":{"tags":["Admin — VIDAL"],"summary":"Reset Defaults","operationId":"reset_defaults_api_admin_vidal_actions_reset_defaults_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/vidal/execute/{action_id}":{"post":{"tags":["VIDAL"],"summary":"Execute Action","operationId":"execute_action_api_vidal_execute__action_id__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"action_id","in":"path","required":true,"schema":{"type":"string","minLength":2,"maxLength":32,"title":"Action Id"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"User Input"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/vidal/actions/portal":{"get":{"tags":["VIDAL"],"summary":"List Portal Actions","description":"Returns the actions that should be rendered as buttons on\n`/portal/vidal`. Filtered by `portal_button_visible == True`.","operationId":"list_portal_actions_api_vidal_actions_portal_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/vidal/favorites":{"get":{"tags":["VIDAL"],"summary":"List Favorites","description":"List the current user's favorite VIDAL products (most recent first).","operationId":"list_favorites_api_vidal_favorites_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Favorites Api Vidal Favorites Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["VIDAL"],"summary":"Add Favorite","description":"Add (or refresh) a favorite. Idempotent on `(user_id, vidal_id)`.","operationId":"add_favorite_api_vidal_favorites_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FavoritePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Add Favorite Api Vidal Favorites Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/vidal/favorites/{vidal_id}":{"delete":{"tags":["VIDAL"],"summary":"Delete Favorite","description":"Remove a favorite. Returns `{ok, deleted}`.","operationId":"delete_favorite_api_vidal_favorites__vidal_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"vidal_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":32,"title":"Vidal Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Delete Favorite Api Vidal Favorites  Vidal Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/linkedin/config":{"get":{"tags":["Admin — LinkedIn"],"summary":"Admin Get Linkedin Config","operationId":"admin_get_linkedin_config_api_admin_linkedin_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Get Linkedin Config Api Admin Linkedin Config Get"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin — LinkedIn"],"summary":"Admin Put Linkedin Config","operationId":"admin_put_linkedin_config_api_admin_linkedin_config_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInConfigPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Put Linkedin Config Api Admin Linkedin Config Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/linkedin/oauth/authorize":{"get":{"tags":["Admin — LinkedIn"],"summary":"Admin Linkedin Authorize","operationId":"admin_linkedin_authorize_api_admin_linkedin_oauth_authorize_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Linkedin Authorize Api Admin Linkedin Oauth Authorize Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/linkedin/oauth/preview-redirect-uri":{"get":{"tags":["Admin — LinkedIn"],"summary":"Admin Linkedin Preview Redirect Uri","description":"Iter43-fix24au-fix1 — Returns the EXACT redirect_uri the backend\nwill send to LinkedIn for OAuth, so the admin can register it in their\nLinkedIn App before clicking « Connecter ».\n\nLightweight (no DB write, no state generation) — safe to call on every\nsection mount.","operationId":"admin_linkedin_preview_redirect_uri_api_admin_linkedin_oauth_preview_redirect_uri_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Linkedin Preview Redirect Uri Api Admin Linkedin Oauth Preview Redirect Uri Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/linkedin/oauth/callback":{"get":{"tags":["LinkedIn"],"summary":"Linkedin Oauth Callback","description":"Handles LinkedIn's redirect. Public endpoint (LinkedIn does NOT send\nany auth header). State validation happens against our DB. On success\nwe render a tiny HTML page that auto-closes the popup or redirects to\nAdmin Settings.\n\nIter43-fix24az (2026-02-26) — Wrap the whole body in a try/except so\nthat any unexpected exception (network glitch, JSON parse, LinkedIn\nAPI quirk…) renders a friendly HTML page instead of FastAPI's bare\n\"Internal Server Error\". The previous version surfaced raw 500s when\ne.g. /v2/userinfo timed out, which the user encountered in production.","operationId":"linkedin_oauth_callback_api_linkedin_oauth_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/linkedin/status":{"get":{"tags":["LinkedIn"],"summary":"Linkedin Status","operationId":"linkedin_status_api_linkedin_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Linkedin Status Api Linkedin Status Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/linkedin/connection":{"delete":{"tags":["Admin — LinkedIn"],"summary":"Admin Linkedin Disconnect","operationId":"admin_linkedin_disconnect_api_admin_linkedin_connection_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Admin Linkedin Disconnect Api Admin Linkedin Connection Delete"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/linkedin/posts":{"post":{"tags":["LinkedIn"],"summary":"Create Linkedin Post","operationId":"create_linkedin_post_api_linkedin_posts_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/routes__linkedin__CreatePostPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Create Linkedin Post Api Linkedin Posts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["LinkedIn"],"summary":"List Linkedin Posts","operationId":"list_linkedin_posts_api_linkedin_posts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"author_type","in":"query","required":false,"schema":{"type":"string","pattern":"^(member|organization)$","default":"member","title":"Author Type"}},{"name":"organization_urn","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Urn"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Linkedin Posts Api Linkedin Posts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/linkedin/autopost/config":{"get":{"tags":["Admin — LinkedIn"],"summary":"Get Autopost Config","operationId":"get_autopost_config_api_admin_linkedin_autopost_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Autopost Config Api Admin Linkedin Autopost Config Get"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin — LinkedIn"],"summary":"Put Autopost Config","operationId":"put_autopost_config_api_admin_linkedin_autopost_config_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutopostConfigPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Autopost Config Api Admin Linkedin Autopost Config Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/linkedin/autopost/generate-draft":{"post":{"tags":["Admin — LinkedIn"],"summary":"Generate Draft Now","description":"Manually generate a draft without scheduling it. Useful for testing\nthe prompt + preview.","operationId":"generate_draft_now_api_admin_linkedin_autopost_generate_draft_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Generate Draft Now Api Admin Linkedin Autopost Generate Draft Post"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/linkedin/autopost/publish-pending":{"post":{"tags":["Admin — LinkedIn"],"summary":"Publish Pending","operationId":"publish_pending_api_admin_linkedin_autopost_publish_pending_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Publish Pending Api Admin Linkedin Autopost Publish Pending Post"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/linkedin/autopost/pending":{"delete":{"tags":["Admin — LinkedIn"],"summary":"Delete Pending","operationId":"delete_pending_api_admin_linkedin_autopost_pending_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Delete Pending Api Admin Linkedin Autopost Pending Delete"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/linkedin/autopost/tick-now":{"post":{"tags":["Admin — LinkedIn"],"summary":"Tick Now","description":"Force-run the autopost tick (bypasses the day/hour/minute check).\nUseful for end-to-end testing. Idempotency guard still active.","operationId":"tick_now_api_admin_linkedin_autopost_tick_now_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Tick Now Api Admin Linkedin Autopost Tick Now Post"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/geocode/config":{"get":{"tags":["Admin — Officines Registry"],"summary":"Get Geocode Config","operationId":"get_geocode_config_api_admin_geocode_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Geocode Config Api Admin Geocode Config Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/officines-registry/geocode-batch":{"post":{"tags":["Admin — Officines Registry"],"summary":"Geocode Batch","operationId":"geocode_batch_api_admin_officines_registry_geocode_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeocodeBatchPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Geocode Batch Api Admin Officines Registry Geocode Batch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/officines-registry/{officine_id}/geocode":{"post":{"tags":["Admin — Officines Registry"],"summary":"Geocode Single","description":"Convenience wrapper for single-officine geocoding.","operationId":"geocode_single_api_admin_officines_registry__officine_id__geocode_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"officine_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"title":"Officine Id"}},{"name":"overwrite_existing","in":"query","required":false,"schema":{"type":"boolean","description":"Re-géolocaliser même si lat/lng déjà présents","default":true,"title":"Overwrite Existing"},"description":"Re-géolocaliser même si lat/lng déjà présents"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Geocode Single Api Admin Officines Registry  Officine Id  Geocode Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/production/intrants":{"get":{"tags":["Production"],"summary":"List Intrants","operationId":"list_intrants_api_production_intrants_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Production"],"summary":"Create Intrant","operationId":"create_intrant_api_production_intrants_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntrantPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/production/intrants/{iid}":{"put":{"tags":["Production"],"summary":"Update Intrant","operationId":"update_intrant_api_production_intrants__iid__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"string","title":"Iid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntrantPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Production"],"summary":"Delete Intrant","operationId":"delete_intrant_api_production_intrants__iid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"string","title":"Iid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/production/recipes":{"get":{"tags":["Production"],"summary":"List Recipes","operationId":"list_recipes_api_production_recipes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Production"],"summary":"Create Recipe","operationId":"create_recipe_api_production_recipes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/production/recipes/{rid}":{"put":{"tags":["Production"],"summary":"Update Recipe","operationId":"update_recipe_api_production_recipes__rid__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Production"],"summary":"Delete Recipe","operationId":"delete_recipe_api_production_recipes__rid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/production/recipes/{rid}/duplicate":{"post":{"tags":["Production"],"summary":"Duplicate Recipe","operationId":"duplicate_recipe_api_production_recipes__rid__duplicate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/production/settings":{"get":{"tags":["Production"],"summary":"Get Prod Settings","operationId":"get_prod_settings_api_production_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Production"],"summary":"Put Prod Settings","operationId":"put_prod_settings_api_production_settings_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/production/export/recipes.pdf":{"get":{"tags":["Production"],"summary":"Export Recipes Pdf","description":"Global table (like the joined 'Cout de Prod' PDF).","operationId":"export_recipes_pdf_api_production_export_recipes_pdf_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/production/export/recipe/{rid}.pdf":{"get":{"tags":["Production"],"summary":"Export Single Recipe Pdf","operationId":"export_single_recipe_pdf_api_production_export_recipe__rid__pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"string","title":"Rid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/twitter/config":{"get":{"tags":["Admin — Twitter"],"summary":"Get Config","operationId":"get_config_api_admin_twitter_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Config Api Admin Twitter Config Get"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin — Twitter"],"summary":"Put Config","operationId":"put_config_api_admin_twitter_config_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TwitterConfigPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Config Api Admin Twitter Config Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/twitter/oauth/preview-redirect-uri":{"get":{"tags":["Admin — Twitter"],"summary":"Preview Redirect","operationId":"preview_redirect_api_admin_twitter_oauth_preview_redirect_uri_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Preview Redirect Api Admin Twitter Oauth Preview Redirect Uri Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/twitter/oauth/authorize":{"get":{"tags":["Admin — Twitter"],"summary":"Authorize","operationId":"authorize_api_admin_twitter_oauth_authorize_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Authorize Api Admin Twitter Oauth Authorize Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/twitter/oauth/callback":{"get":{"tags":["Twitter"],"summary":"Twitter Oauth Callback","operationId":"twitter_oauth_callback_api_twitter_oauth_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/twitter/status":{"get":{"tags":["Twitter"],"summary":"Status","operationId":"status_api_twitter_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Status Api Twitter Status Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/twitter/connection":{"delete":{"tags":["Admin — Twitter"],"summary":"Disconnect","operationId":"disconnect_api_admin_twitter_connection_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Disconnect Api Admin Twitter Connection Delete"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/twitter/tweets":{"post":{"tags":["Twitter"],"summary":"Post Tweet","operationId":"post_tweet_api_twitter_tweets_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TweetPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Tweet Api Twitter Tweets Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Twitter"],"summary":"List Tweets","operationId":"list_tweets_api_twitter_tweets_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":5,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Tweets Api Twitter Tweets Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/facebook/config":{"get":{"tags":["Admin — Facebook"],"summary":"Get Config","operationId":"get_config_api_admin_facebook_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Config Api Admin Facebook Config Get"}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin — Facebook"],"summary":"Put Config","operationId":"put_config_api_admin_facebook_config_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacebookConfigPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Put Config Api Admin Facebook Config Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/facebook/oauth/preview-redirect-uri":{"get":{"tags":["Admin — Facebook"],"summary":"Preview Redirect","operationId":"preview_redirect_api_admin_facebook_oauth_preview_redirect_uri_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Preview Redirect Api Admin Facebook Oauth Preview Redirect Uri Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/facebook/oauth/authorize":{"get":{"tags":["Admin — Facebook"],"summary":"Authorize","operationId":"authorize_api_admin_facebook_oauth_authorize_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Authorize Api Admin Facebook Oauth Authorize Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/facebook/test-config":{"post":{"tags":["Admin — Facebook"],"summary":"Test Config","description":"Iter43-fix24az-c — Validate App ID + App Secret WITHOUT going through\nthe OAuth dance. Calls Facebook's `client_credentials` grant which\nreturns an App Access Token if both are valid, else returns the exact\nFB error (e.g. \"Error validating client secret\").\n\nSaves the user from doing a full OAuth round-trip just to discover\ntheir secret was typed wrong.","operationId":"test_config_api_admin_facebook_test_config_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Test Config Api Admin Facebook Test Config Post"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/facebook/oauth/callback":{"get":{"tags":["Facebook"],"summary":"Facebook Oauth Callback","operationId":"facebook_oauth_callback_api_facebook_oauth_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/facebook/pages":{"get":{"tags":["Admin — Facebook"],"summary":"List Pages","operationId":"list_pages_api_admin_facebook_pages_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response List Pages Api Admin Facebook Pages Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/facebook/active-page":{"put":{"tags":["Admin — Facebook"],"summary":"Set Active Page","operationId":"set_active_page_api_admin_facebook_active_page_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivePagePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Set Active Page Api Admin Facebook Active Page Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/facebook/status":{"get":{"tags":["Facebook"],"summary":"Status","operationId":"status_api_facebook_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Status Api Facebook Status Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/facebook/connection":{"delete":{"tags":["Admin — Facebook"],"summary":"Disconnect","operationId":"disconnect_api_admin_facebook_connection_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Disconnect Api Admin Facebook Connection Delete"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/facebook/posts":{"post":{"tags":["Facebook"],"summary":"Post","operationId":"post_api_facebook_posts_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FacebookPostPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Post Api Facebook Posts Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Facebook"],"summary":"List Page Posts","operationId":"list_page_posts_api_facebook_posts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Page Posts Api Facebook Posts Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/google/calendar/watch":{"get":{"tags":["Admin — Google Calendar"],"summary":"Get Watch Status","operationId":"get_watch_status_api_admin_google_calendar_watch_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Watch Status Api Admin Google Calendar Watch Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin — Google Calendar"],"summary":"Start Watch","operationId":"start_watch_api_admin_google_calendar_watch_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Start Watch Api Admin Google Calendar Watch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]},"delete":{"tags":["Admin — Google Calendar"],"summary":"Stop Watch","operationId":"stop_watch_api_admin_google_calendar_watch_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stop Watch Api Admin Google Calendar Watch Delete"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/google/calendar/sync-now":{"post":{"tags":["Admin — Google Calendar"],"summary":"Sync Now","operationId":"sync_now_api_admin_google_calendar_sync_now_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sync Now Api Admin Google Calendar Sync Now Post"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/notification-sounds/presets":{"get":{"tags":["Public"],"summary":"List Presets","description":"Public list of available preset keys (labels/descriptions live in\nthe frontend so we keep i18n on that side).","operationId":"list_presets_api_notification_sounds_presets_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/notification-sounds/config":{"get":{"tags":["Admin"],"summary":"Admin Get Config","operationId":"admin_get_config_api_admin_notification_sounds_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin"],"summary":"Admin Update Config","operationId":"admin_update_config_api_admin_notification_sounds_config_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationSoundConfig"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/notification-sounds/upload":{"post":{"tags":["Admin"],"summary":"Admin Upload Sound","operationId":"admin_upload_sound_api_admin_notification_sounds_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_admin_upload_sound_api_admin_notification_sounds_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/kyc":{"get":{"tags":["Portail Client"],"summary":"Me Get Kyc","operationId":"me_get_kyc_api_me_kyc_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Portail Client"],"summary":"Me Put Kyc","operationId":"me_put_kyc_api_me_kyc_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KycUpdatePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/kyc/upload/{doc_type}":{"post":{"tags":["Portail Client"],"summary":"Me Upload Kyc","operationId":"me_upload_kyc_api_me_kyc_upload__doc_type__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_type","in":"path","required":true,"schema":{"type":"string","title":"Doc Type"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_me_upload_kyc_api_me_kyc_upload__doc_type__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/kyc/{tenant_id}":{"get":{"tags":["Admin"],"summary":"Admin Get Kyc","operationId":"admin_get_kyc_api_admin_kyc__tenant_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/smart-communications":{"get":{"tags":["Portail Client"],"summary":"Me Get Smart Comm","description":"Return the caller tenant's smart-communications config with SECRETS\nMASKED (last 4 chars). Use PUT to overwrite full secrets.","operationId":"me_get_smart_comm_api_me_smart_communications_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Portail Client"],"summary":"Me Put Smart Comm","operationId":"me_put_smart_comm_api_me_smart_communications_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SmartCommUpdatePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/amm":{"get":{"tags":["AMM"],"summary":"List Amm","operationId":"list_amm_api_amm_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recherche par nom ou numéro AMM","title":"Q"},"description":"Recherche par nom ou numéro AMM"},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(active|withdrawn|suspended)$"},{"type":"null"}],"title":"Status"}},{"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["AMM"],"summary":"Create Amm","operationId":"create_amm_api_amm_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AmmCreatePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/amm/by-product/{vidal_product_id}":{"get":{"tags":["AMM"],"summary":"Get Amm By Product","operationId":"get_amm_by_product_api_amm_by_product__vidal_product_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"vidal_product_id","in":"path","required":true,"schema":{"type":"integer","title":"Vidal Product Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/amm/import-csv":{"post":{"tags":["AMM"],"summary":"Import Csv","description":"Import en masse depuis un CSV.\n\nColonnes attendues (insensible à la casse, accents ignorés) :\n    Nom du produit, AMM, CIP1, date expiration, Laboratoire, Note\n\nRègle utilisateur :\n  - Doublons (AMM ou CIP1 déjà en DB OU dans le fichier) → refuse TOUT\n    l'import et liste les conflits.\n  - AMM et CIP1 peuvent être NULL — un internal_no est auto-généré.","operationId":"import_csv_api_amm_import_csv_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_csv_api_amm_import_csv_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/amm/{amm_id}":{"put":{"tags":["AMM"],"summary":"Update Amm","operationId":"update_amm_api_amm__amm_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"amm_id","in":"path","required":true,"schema":{"type":"string","title":"Amm Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AmmUpdatePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["AMM"],"summary":"Delete Amm","operationId":"delete_amm_api_amm__amm_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"amm_id","in":"path","required":true,"schema":{"type":"string","title":"Amm Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/officines/lookup":{"post":{"tags":["Officines"],"summary":"Lookup","operationId":"lookup_api_officines_lookup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfficineLookupPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/officines/test-connection":{"post":{"tags":["Admin — VIDAL"],"summary":"Admin Officines Test","description":"Iter41 Phase 4b — Diagnostic verbose pour l'API Officines.\n\nEffectue un POST réel sur l'URL configurée avec un payload minimal\n(`product_name = \"doliprane\"`) et retourne :\n  - request : URL, headers (token masqué), body envoyé\n  - response : status code, content-type, elapsed_ms, body preview\n  - error : message en cas de timeout / DNS / TLS\nAucun audit ni quota — utilisé uniquement pour le débogage admin.","operationId":"admin_officines_test_api_admin_officines_test_connection_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/vidal/usage":{"get":{"tags":["Admin — VIDAL"],"summary":"Vidal Usage","description":"Renvoie l'usage VIDAL agrégé pour les `days` derniers jours.","operationId":"vidal_usage_api_admin_vidal_usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/officines/usage":{"get":{"tags":["Admin — VIDAL"],"summary":"Officines Usage","description":"Renvoie l'usage de l'API officines : top recherches, consommation publique !aizenta.","operationId":"officines_usage_api_admin_officines_usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/officines/register":{"post":{"tags":["Officines — Public"],"summary":"Public Register","description":"Lets an officine declare its inventory. The body must be HMAC-signed\nwith the shared secret published to the officine on enrollment.\n\nHeader layout :\n  X-Officine-Id: opaque identifier supplied to the officine\n  X-Timestamp:   epoch seconds (±5 min)\n  X-Signature:   sha256 HMAC = hexdigest( secret, f\"{ts}.{body_raw}\" )","operationId":"public_register_api_public_officines_register_post","parameters":[{"name":"X-Signature","in":"header","required":true,"schema":{"type":"string","title":"X-Signature"}},{"name":"X-Timestamp","in":"header","required":true,"schema":{"type":"string","title":"X-Timestamp"}},{"name":"X-Officine-Id","in":"header","required":true,"schema":{"type":"string","title":"X-Officine-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfficineRegisterPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/officines-portal/register":{"post":{"tags":["Officines Portal"],"summary":"Register","operationId":"register_api_officines_portal_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfficineRegisterIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/officines-portal/auth/request-otp":{"post":{"tags":["Officines Portal"],"summary":"Request Otp","operationId":"request_otp_api_officines_portal_auth_request_otp_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpRequestIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/officines-portal/auth/verify-otp":{"post":{"tags":["Officines Portal"],"summary":"Verify Otp","operationId":"verify_otp_api_officines_portal_auth_verify_otp_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OtpVerifyIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/officines-portal/auth/magic-link":{"post":{"tags":["Officines Portal"],"summary":"Magic Link Request","operationId":"magic_link_request_api_officines_portal_auth_magic_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MagicLinkRequestIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/officines-portal/auth/magic-callback":{"get":{"tags":["Officines Portal"],"summary":"Magic Link Callback","operationId":"magic_link_callback_api_officines_portal_auth_magic_callback_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/officines-portal/me":{"get":{"tags":["Officines Portal"],"summary":"Me","operationId":"me_api_officines_portal_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/officines-portal/me/regenerate-secret":{"post":{"tags":["Officines Portal"],"summary":"Regenerate Secret","operationId":"regenerate_secret_api_officines_portal_me_regenerate_secret_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/officines-portal/inventory":{"get":{"tags":["Officines Portal"],"summary":"List Inventory","operationId":"list_inventory_api_officines_portal_inventory_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Officines Portal"],"summary":"Create Inventory","operationId":"create_inventory_api_officines_portal_inventory_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InventoryItemIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/officines-portal/inventory/{item_id}":{"put":{"tags":["Officines Portal"],"summary":"Update Inventory","operationId":"update_inventory_api_officines_portal_inventory__item_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InventoryItemIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Officines Portal"],"summary":"Delete Inventory","operationId":"delete_inventory_api_officines_portal_inventory__item_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/officines-portal/inventory/export.csv":{"get":{"tags":["Officines Portal"],"summary":"Export Inventory Csv","operationId":"export_inventory_csv_api_officines_portal_inventory_export_csv_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/officines-portal/history":{"get":{"tags":["Officines Portal"],"summary":"List History","operationId":"list_history_api_officines_portal_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/officines-portal/history/export.csv":{"get":{"tags":["Officines Portal"],"summary":"Export History Csv","operationId":"export_history_csv_api_officines_portal_history_export_csv_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/officines-permissions":{"get":{"tags":["Admin — Officines Registry"],"summary":"Me Officines Permissions","description":"Retourne {can_view, edit_mode, editable_fields} pour l'utilisateur courant.\n\nUtilisé par le frontend pour griser les champs en mode délégué et\npour le route-guard du menu Officines.","operationId":"me_officines_permissions_api_me_officines_permissions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/officines-registry":{"get":{"tags":["Admin — Officines Registry"],"summary":"List Registry","operationId":"list_registry_api_admin_officines_registry_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(pending|active|suspended)$"},{"type":"null"}],"title":"Status"}},{"name":"activite","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Activite"}},{"name":"role","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":2000,"minimum":1,"default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Admin — Officines Registry"],"summary":"Create Officine","description":"Création manuelle d'une officine.\n\nChamps requis : `name` (sert aussi de `code`).\nChamps optionnels : tous les autres (intitule, email, phone, whatsapp,\naddress, city, country, location_hint, numero_ordre, contact_name,\nlatitude, longitude, role, groupe_garde, activite_principale).\n\nIter43-fix24n : utilisateur \"délégué\" peut créer une officine avec TOUS\nles champs (la restriction limited s'applique seulement à l'édition).","operationId":"create_officine_api_admin_officines_registry_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/officines-registry/roles":{"get":{"tags":["Admin — Officines Registry"],"summary":"List Officine Roles V2","operationId":"list_officine_roles_v2_api_admin_officines_registry_roles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin — Officines Registry"],"summary":"Update Officine Roles V2","operationId":"update_officine_roles_v2_api_admin_officines_registry_roles_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/officines-registry/garde-groups":{"get":{"tags":["Admin — Officines Registry"],"summary":"List Garde Groups V2","operationId":"list_garde_groups_v2_api_admin_officines_registry_garde_groups_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/officines-registry/logos/health":{"get":{"tags":["Admin — Officines Registry"],"summary":"Officines Logos Health V2","operationId":"officines_logos_health_v2_api_admin_officines_registry_logos_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/officines-registry/bulk-assign":{"post":{"tags":["Admin — Officines Registry"],"summary":"Bulk Assign To Officines V2","operationId":"bulk_assign_to_officines_v2_api_admin_officines_registry_bulk_assign_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/officines-registry/{officine_id}":{"get":{"tags":["Admin — Officines Registry"],"summary":"Detail","operationId":"detail_api_admin_officines_registry__officine_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"officine_id","in":"path","required":true,"schema":{"type":"string","title":"Officine Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Admin — Officines Registry"],"summary":"Update Officine","description":"Mise à jour d'une fiche officine. Champs autorisés : name (=code),\nintitule, email, phone, whatsapp, address, city, country, location_hint,\nnumero_ordre, contact_name, logo_url, latitude, longitude.\n\nIter43-fix24n : un utilisateur \"délégué\" (non-admin listé dans\n`officines_menu_allowed_emails`) ne peut modifier QUE :\nintitule, phone, whatsapp, latitude, longitude, location_hint,\nactivite_principale.","operationId":"update_officine_api_admin_officines_registry__officine_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"officine_id","in":"path","required":true,"schema":{"type":"string","title":"Officine Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/officines-registry/{officine_id}/approve":{"post":{"tags":["Admin — Officines Registry"],"summary":"Approve","operationId":"approve_api_admin_officines_registry__officine_id__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"officine_id","in":"path","required":true,"schema":{"type":"string","title":"Officine Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/officines-registry/{officine_id}/suspend":{"post":{"tags":["Admin — Officines Registry"],"summary":"Suspend","operationId":"suspend_api_admin_officines_registry__officine_id__suspend_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"officine_id","in":"path","required":true,"schema":{"type":"string","title":"Officine Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/officines-registry/{officine_id}/reactivate":{"post":{"tags":["Admin — Officines Registry"],"summary":"Reactivate","operationId":"reactivate_api_admin_officines_registry__officine_id__reactivate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"officine_id","in":"path","required":true,"schema":{"type":"string","title":"Officine Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/officines-registry/{officine_id}/link-client":{"post":{"tags":["Admin — Officines Registry"],"summary":"Link Client","operationId":"link_client_api_admin_officines_registry__officine_id__link_client_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"officine_id","in":"path","required":true,"schema":{"type":"string","title":"Officine Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkClientIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/officines-registry/{officine_id}/unlink-client":{"post":{"tags":["Admin — Officines Registry"],"summary":"Unlink Client","operationId":"unlink_client_api_admin_officines_registry__officine_id__unlink_client_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"officine_id","in":"path","required":true,"schema":{"type":"string","title":"Officine Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/officines-registry/import-csv":{"post":{"tags":["Admin — Officines Registry"],"summary":"Import Csv","description":"Import en masse des officines depuis un fichier CSV.\n\nFormat attendu (séparateur `;`) :\n    Nom de la pharmacie;Téléphone;Ville;Indications de localisation;Numéro d'ordre\n\nLe « Nom de la pharmacie » sert également de code (champ `name`). Les\nlignes sont créées avec status='pending' et un email/phone provisoires\nsi non fournis (l'admin pourra compléter via la modale d'édition).","operationId":"import_csv_api_admin_officines_registry_import_csv_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/officines-registry/{officine_id}/upload-logo":{"post":{"tags":["Admin — Officines Registry"],"summary":"Upload Logo","description":"Upload du logo d'une officine.\n\nIter43-fix21 (2026-06) — **Stockage MongoDB (base64)** pour résister\naux redéploiements Kubernetes. Le disque conteneur `/app/backend/uploads/`\nest éphémère : tous les fichiers étaient perdus à chaque redéploy\n(« les logos marchaient hier, cassés aujourd'hui »). On stocke\ndésormais l'image dans `db.officines.logo_data_b64` (persistant).","operationId":"upload_logo_api_admin_officines_registry__officine_id__upload_logo_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"officine_id","in":"path","required":true,"schema":{"type":"string","title":"Officine Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/officines-registry/{officine_id}/logo":{"get":{"tags":["Officines Registry — Public"],"summary":"Get Officine Logo","operationId":"get_officine_logo_api_officines_registry__officine_id__logo_get","parameters":[{"name":"officine_id","in":"path","required":true,"schema":{"type":"string","title":"Officine Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/officines-registry/import-to-contacts":{"post":{"tags":["Admin — Officines Registry"],"summary":"Import To Contacts","description":"Importe une sélection d'officines dans le répertoire de contacts du\nclient_scope de l'utilisateur (admin SAWALI) et les ajoute à un\ngroupe « Officine » (créé si nécessaire).\n\nBody : { officine_ids: [str, ...], group_name?: str (défaut 'Officines') }","operationId":"import_to_contacts_api_admin_officines_registry_import_to_contacts_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/officine-activities":{"get":{"tags":["Admin — Officines Registry"],"summary":"List Activities","operationId":"list_activities_api_admin_officine_activities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin — Officines Registry"],"summary":"Update Activities","operationId":"update_activities_api_admin_officine_activities_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/officines-registry/{officine_id}/products/import":{"post":{"tags":["Admin — Officines Registry"],"summary":"Import Products","description":"Import en masse de produits pour une officine (CSV ou JSON).\n\nFormat CSV (séparateur auto `,` ou `;`) :\n    Code Officine,Produit,Conditionnement,CIP,Stock\nFormat JSON : liste plate OU structure imbriquée (auto-aplatie).\nMode : `replace` (vide + ré-importe) OU `append` (ajoute sans toucher).\nClé d'unicité : (officine_id, product_name, conditionnement) en minuscules.","operationId":"import_products_api_admin_officines_registry__officine_id__products_import_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"officine_id","in":"path","required":true,"schema":{"type":"string","title":"Officine Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/officines-registry/{officine_id}/products":{"get":{"tags":["Admin — Officines Registry"],"summary":"List Products","operationId":"list_products_api_admin_officines_registry__officine_id__products_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"officine_id","in":"path","required":true,"schema":{"type":"string","title":"Officine Id"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","pattern":"^(product_name|cip|stock|conditionnement|created_at)$","default":"product_name","title":"Sort"}},{"name":"order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"asc","title":"Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin — Officines Registry"],"summary":"Clear Products","operationId":"clear_products_api_admin_officines_registry__officine_id__products_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"officine_id","in":"path","required":true,"schema":{"type":"string","title":"Officine Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/officines-registry/{officine_id}/products/export.csv":{"get":{"tags":["Admin — Officines Registry"],"summary":"Export Products Csv","operationId":"export_products_csv_api_admin_officines_registry__officine_id__products_export_csv_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"officine_id","in":"path","required":true,"schema":{"type":"string","title":"Officine Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/synthese/test":{"post":{"tags":["Admin — Synthèse"],"summary":"Admin Synthese Test","operationId":"admin_synthese_test_api_admin_synthese_test_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/officine-otp/test":{"post":{"tags":["Admin — Officines OTP"],"summary":"Admin Officine Otp Test","operationId":"admin_officine_otp_test_api_admin_officine_otp_test_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/incidents-webhook":{"get":{"tags":["Admin — Incidents Webhook"],"summary":"Admin Get Incidents Webhook","operationId":"admin_get_incidents_webhook_api_admin_incidents_webhook_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/incidents-webhook/regenerate-password":{"post":{"tags":["Admin — Incidents Webhook"],"summary":"Admin Regen Incidents Password","operationId":"admin_regen_incidents_password_api_admin_incidents_webhook_regenerate_password_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/incidents-webhook/password":{"delete":{"tags":["Admin — Incidents Webhook"],"summary":"Admin Disable Incidents Webhook","operationId":"admin_disable_incidents_webhook_api_admin_incidents_webhook_password_delete","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/officines-portal/inventory/lookup-amm":{"post":{"tags":["Officines Portal"],"summary":"Lookup Amm","description":"Cherche dans `amm_numbers` un produit correspondant au CIP scanné\npour le pays par défaut configuré dans Admin Settings.\n\nRetourne `{found, country, product_name?, amm_number?, status?, expires_at?}`.","operationId":"lookup_amm_api_officines_portal_inventory_lookup_amm_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AmmLookupIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/story-studio/settings":{"get":{"tags":["Admin — Story Studio"],"summary":"Get Settings","description":"Récupère la config globale Story Studio. Masque les secrets.","operationId":"get_settings_api_admin_story_studio_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin — Story Studio"],"summary":"Update Settings","description":"Met à jour la config globale. Si une valeur secrète est `null` OU\ncommence par `***` (masque), elle n'est PAS modifiée.","operationId":"update_settings_api_admin_story_studio_settings_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/story-studio/library/upload":{"post":{"tags":["Admin — Story Studio"],"summary":"Story Studio Upload Local","description":"Upload d'un asset local (image ou vidéo) directement dans la\nbibliothèque Story Studio. Multipart form-data :\n  - file (required) : le fichier binaire\n  - title (optional) : titre lisible\n  - tenant_id (optional) : tenant cible (super-admin peut cibler un autre tenant)\nRetourne le doc `story_assets` créé (`status=\"ready\"`).","operationId":"story_studio_upload_local_api_admin_story_studio_library_upload_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/story-studio/generate/text-to-video":{"post":{"tags":["Admin — Story Studio"],"summary":"Generate Text To Video","description":"Génère une vidéo à partir d'un prompt texte. Synchrone (jusqu'à 10 min).","operationId":"generate_text_to_video_api_admin_story_studio_generate_text_to_video_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoryGenerateText2Video"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/story-studio/generate/text-to-image":{"post":{"tags":["Admin — Story Studio"],"summary":"Generate Text To Image","description":"Génère une image (Nano Banana via Universal Key) en format 9:16.","operationId":"generate_text_to_image_api_admin_story_studio_generate_text_to_image_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoryGenerateImage"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/story-studio/library":{"get":{"tags":["Admin — Story Studio"],"summary":"List Library","operationId":"list_library_api_admin_story_studio_library_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/library/{asset_id}":{"put":{"tags":["Admin — Story Studio"],"summary":"Update Asset","operationId":"update_asset_api_admin_story_studio_library__asset_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoryAssetUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin — Story Studio"],"summary":"Delete Asset","operationId":"delete_asset_api_admin_story_studio_library__asset_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/library/{asset_id}/media":{"get":{"tags":["Admin — Story Studio"],"summary":"Stream Asset Media","operationId":"stream_asset_media_api_admin_story_studio_library__asset_id__media_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/library/{asset_id}/whatsapp-share":{"get":{"tags":["Admin — Story Studio"],"summary":"Whatsapp Share Link","description":"Renvoie un deep link WhatsApp pour partager l'asset sur le mobile admin.\n\nComme Meta n'expose pas d'API pour publier un Status, le flow est :\n1. Admin reçoit le lien\n2. Ouvre depuis son mobile → WhatsApp s'ouvre avec un message pré-rempli\n   (texte + lien direct vers le média)\n3. Admin appuie sur \"Status\" depuis WhatsApp pour publier","operationId":"whatsapp_share_link_api_admin_story_studio_library__asset_id__whatsapp_share_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/social-accounts":{"get":{"tags":["Admin — Story Studio"],"summary":"List Social Accounts","operationId":"list_social_accounts_api_admin_story_studio_social_accounts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/social-accounts/manual":{"post":{"tags":["Admin — Story Studio"],"summary":"Add Social Account Manual","description":"Iter43-fix10 — Saisie manuelle d'un token (mode dev). Phase 2\nintroduira un vrai flow OAuth (login + callback).","operationId":"add_social_account_manual_api_admin_story_studio_social_accounts_manual_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SocialAccountManualToken"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/story-studio/social-accounts/{account_id}":{"delete":{"tags":["Admin — Story Studio"],"summary":"Remove Social Account","operationId":"remove_social_account_api_admin_story_studio_social_accounts__account_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/library/{asset_id}/publish":{"post":{"tags":["Admin — Story Studio"],"summary":"Publish Asset","description":"Publie une vidéo générée vers les réseaux sociaux sélectionnés.\n\n- `mode=draft` enregistre l'intent sans appel Meta (utile pour planifier).\n- `mode=immediate` appelle l'API Graph pour chaque target.\nChaque target reçoit son propre statut dans la réponse — un échec\npartiel n'empêche pas les autres canaux d'aboutir.","operationId":"publish_asset_api_admin_story_studio_library__asset_id__publish_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/posts/{post_id}/publish-now":{"post":{"tags":["Admin — Story Studio"],"summary":"Publish Draft Now","operationId":"publish_draft_now_api_admin_story_studio_posts__post_id__publish_now_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/billing/tenants/{tenant_id}/config":{"get":{"tags":["Admin — Story Studio Billing"],"summary":"Get Tenant Billing Config","operationId":"get_tenant_billing_config_api_admin_story_studio_billing_tenants__tenant_id__config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Admin — Story Studio Billing"],"summary":"Update Tenant Billing Config","operationId":"update_tenant_billing_config_api_admin_story_studio_billing_tenants__tenant_id__config_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantPublishConfigUpsert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/billing/tenants/{tenant_id}/credits/topup":{"post":{"tags":["Admin — Story Studio Billing"],"summary":"Topup Credits","description":"Ajoute des crédits manuellement (admin only). Pour un topup via\nStripe/PawaPay, créer d'abord la session de paiement côté CRM, puis\nappeler cet endpoint dans le webhook de confirmation.","operationId":"topup_credits_api_admin_story_studio_billing_tenants__tenant_id__credits_topup_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditTopupRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/billing/tenants/{tenant_id}/ledger":{"get":{"tags":["Admin — Story Studio Billing"],"summary":"Get Tenant Ledger","operationId":"get_tenant_ledger_api_admin_story_studio_billing_tenants__tenant_id__ledger_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/billing/tenants/{tenant_id}/invoices":{"get":{"tags":["Admin — Story Studio Billing"],"summary":"List Tenant Invoices","operationId":"list_tenant_invoices_api_admin_story_studio_billing_tenants__tenant_id__invoices_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/billing/invoices/{invoice_id}/status":{"put":{"tags":["Admin — Story Studio Billing"],"summary":"Update Invoice Status","description":"Marque une facture comme payée / annulée / en attente.","operationId":"update_invoice_status_api_admin_story_studio_billing_invoices__invoice_id__status_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"string","title":"Invoice Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/billing/summary":{"get":{"tags":["Admin — Story Studio Billing"],"summary":"Billing Summary","description":"Vue agrégée : total crédits en circulation, factures du mois, top consommateurs.","operationId":"billing_summary_api_admin_story_studio_billing_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/story-studio/billing/tenants":{"get":{"tags":["Admin — Story Studio Billing"],"summary":"List Tenants With Billing","description":"Liste tous les tenants ayant déjà une config billing OU au moins un social_account.","operationId":"list_tenants_with_billing_api_admin_story_studio_billing_tenants_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/story-studio/posts":{"get":{"tags":["Admin — Story Studio"],"summary":"List Posts","operationId":"list_posts_api_admin_story_studio_posts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/oauth/meta/start":{"get":{"tags":["Admin — Story Studio"],"summary":"Meta Oauth Start","description":"Génère l'URL d'autorisation Meta. Le front l'utilise pour rediriger.\n\nLe `state` est un JWT signé qui transporte le tenant_id cible + l'admin\nappelant. Meta nous renverra sur le callback backend qui décodera ce\nstate pour rattacher le compte au bon tenant.","operationId":"meta_oauth_start_api_admin_story_studio_oauth_meta_start_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"return_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Return To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/oauth/meta/callback":{"get":{"tags":["Admin — Story Studio"],"summary":"Meta Oauth Callback","description":"Endpoint PUBLIC appelé par Meta après authentification utilisateur.\n\nDécode le state, échange le code contre un token court → long-lived,\nrécupère les Pages + IG accounts, persiste le tout en `social_accounts`\n(tokens encryptés), puis redirige vers le front.","operationId":"meta_oauth_callback_api_admin_story_studio_oauth_meta_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/social-accounts/{account_id}/refresh":{"post":{"tags":["Admin — Story Studio"],"summary":"Refresh Meta Account","description":"Re-fetch les Pages et IG accounts d'un compte Meta connecté.","operationId":"refresh_meta_account_api_admin_story_studio_social_accounts__account_id__refresh_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/social-accounts/{account_id}/pages/{page_id}":{"put":{"tags":["Admin — Story Studio"],"summary":"Toggle Page Active","description":"Active/désactive une Page (page reste connue mais ignorée des publications).","operationId":"toggle_page_active_api_admin_story_studio_social_accounts__account_id__pages__page_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","title":"Account Id"}},{"name":"page_id","in":"path","required":true,"schema":{"type":"string","title":"Page Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/library/{asset_id}/signed-media":{"get":{"tags":["Admin — Story Studio"],"summary":"Signed Public Media","description":"Endpoint PUBLIC (signé par JWT court terme) — utilisé par Meta pour\ntélécharger la vidéo lors d'un appel `video_url`.","operationId":"signed_public_media_api_admin_story_studio_library__asset_id__signed_media_get","parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","title":"Asset Id"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/oauth/tiktok/start":{"get":{"tags":["Admin — Story Studio"],"summary":"Tiktok Oauth Start","operationId":"tiktok_oauth_start_api_admin_story_studio_oauth_tiktok_start_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}},{"name":"return_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Return To"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/oauth/tiktok/callback":{"get":{"tags":["Admin — Story Studio"],"summary":"Tiktok Oauth Callback","operationId":"tiktok_oauth_callback_api_admin_story_studio_oauth_tiktok_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Description"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/scheduler/tick":{"post":{"tags":["Admin — Story Studio"],"summary":"Scheduler Tick","description":"Endpoint à appeler par un cron externe (ex: every 5min) qui passe les\nposts `draft` avec `scheduled_at <= now` en `publishing` puis les exécute.\n\nIdempotent : ne traite que les posts pas encore exécutés.","operationId":"scheduler_tick_api_admin_story_studio_scheduler_tick_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"max_posts","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":20,"title":"Max Posts"}},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/story-studio/posts/{post_id}/insights":{"get":{"tags":["Admin — Story Studio"],"summary":"Fetch Post Insights","description":"Récupère likes/reach/impressions pour chaque cible d'un post publié.\n\n- IG : utilise /v23.0/{ig_media_id}/insights\n- FB : utilise /v23.0/{video_id}/video_insights (ou /insights selon disponibilité)\n- TikTok : non encore supporté (Phase 5)","operationId":"fetch_post_insights_api_admin_story_studio_posts__post_id__insights_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"post_id","in":"path","required":true,"schema":{"type":"string","title":"Post Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/planning/config":{"get":{"tags":["Admin — Planning"],"summary":"Admin Planning Config","operationId":"admin_planning_config_api_admin_planning_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin — Planning"],"summary":"Admin Planning Config Update","operationId":"admin_planning_config_update_api_admin_planning_config_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanningConfigUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/planning/reminders/run":{"post":{"tags":["Admin — Planning"],"summary":"Admin Planning Reminders Run Now","description":"Iter43-fix24az-n — Déclenche manuellement le job de rappels WA\n(utile pour démo/débug). Retourne le nombre de messages envoyés.","operationId":"admin_planning_reminders_run_now_api_admin_planning_reminders_run_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/webhooks/planning/{secret}":{"post":{"tags":["Webhooks"],"summary":"Planning Webhook Receive","description":"Reçoit un RDV depuis un système externe (planning clinique).\nPayload minimum : {code_clinique, medecin, patient, start, end}.\nChamps optionnels : motif, id_user, medecin_email, external_id.\nIdempotent : upsert sur (tenant_id, code_clinique, medecin, patient, start_at).","operationId":"planning_webhook_receive_api_webhooks_planning__secret__post","parameters":[{"name":"secret","in":"path","required":true,"schema":{"type":"string","title":"Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/planning/doctors":{"get":{"tags":["Portail Client — Planning"],"summary":"Planning List Doctors","description":"Liste les utilisateurs suivis avec role='Médecin' du tenant courant.","operationId":"planning_list_doctors_api_me_planning_doctors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/planning/appointments":{"get":{"tags":["Portail Client — Planning"],"summary":"Planning List Appointments","description":"Retourne les RDV pour une date donnée + optionnellement un médecin.","operationId":"planning_list_appointments_api_me_planning_appointments_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date YYYY-MM-DD (défaut = aujourd'hui UTC)","title":"Date"},"description":"Date YYYY-MM-DD (défaut = aujourd'hui UTC)"},{"name":"medecin_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtre par médecin (id user)","title":"Medecin Id"},"description":"Filtre par médecin (id user)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/planning/counts":{"get":{"tags":["Portail Client — Planning"],"summary":"Planning Counts","description":"Compteurs live pour la sidebar et le header planning.\n\nRetourne :\n  - `today_walk_ins_open` : walk-ins ouverts pour AUJOURD'HUI (peu importe la date)\n  - `upcoming_rdv_count`  : RDV à partir de `date + 1 jour` sur `horizon_days`\n  - `upcoming_walk_in_count` : walk-ins à partir de `date + 1 jour` sur `horizon_days`\n  - `date`, `from_date`, `horizon_days` (echo pour le frontend)","operationId":"planning_counts_api_me_planning_counts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date de référence YYYY-MM-DD (défaut = aujourd'hui UTC)","title":"Date"},"description":"Date de référence YYYY-MM-DD (défaut = aujourd'hui UTC)"},{"name":"medecin_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtre par médecin (admin/superviseur)","title":"Medecin Id"},"description":"Filtre par médecin (admin/superviseur)"},{"name":"horizon_days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Fenêtre pour les `upcoming_*` (défaut 90j)","default":90,"title":"Horizon Days"},"description":"Fenêtre pour les `upcoming_*` (défaut 90j)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/planning/next-busy-day":{"get":{"tags":["Portail Client — Planning"],"summary":"Planning Next Busy Day","operationId":"planning_next_busy_day_api_me_planning_next_busy_day_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"after","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date de départ YYYY-MM-DD (défaut = demain UTC)","title":"After"},"description":"Date de départ YYYY-MM-DD (défaut = demain UTC)"},{"name":"medecin_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtre par médecin (admin/superviseur)","title":"Medecin Id"},"description":"Filtre par médecin (admin/superviseur)"},{"name":"horizon_days","in":"query","required":false,"schema":{"type":"integer","maximum":365,"minimum":1,"description":"Fenêtre de recherche (défaut 90j)","default":90,"title":"Horizon Days"},"description":"Fenêtre de recherche (défaut 90j)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/planning/heatmap":{"get":{"tags":["Portail Client — Planning"],"summary":"Planning Heatmap","operationId":"planning_heatmap_api_me_planning_heatmap_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"from_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Date de début YYYY-MM-DD (défaut = aujourd'hui UTC)","title":"From Date"},"description":"Date de début YYYY-MM-DD (défaut = aujourd'hui UTC)"},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"description":"Nombre de jours (défaut 30)","default":30,"title":"Days"},"description":"Nombre de jours (défaut 30)"},{"name":"medecin_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtre par médecin (admin/superviseur)","title":"Medecin Id"},"description":"Filtre par médecin (admin/superviseur)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/planning/walk-in":{"post":{"tags":["Portail Client — Planning"],"summary":"Planning Create Walk In","description":"Créer un walk-in (patient sans RDV). Ouvert aux secrétaires médicales\net rôles élevés. La date par défaut est aujourd'hui.","operationId":"planning_create_walk_in_api_me_planning_walk_in_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalkInCreatePayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/planning/walk-in/{wid}":{"patch":{"tags":["Portail Client — Planning"],"summary":"Planning Update Walk In","description":"Modifier un walk-in existant (patient, phone, médecin, date, motif).","operationId":"planning_update_walk_in_api_me_planning_walk_in__wid__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WalkInUpdatePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Portail Client — Planning"],"summary":"Planning Delete Walk In","description":"Supprimer un walk-in existant.","operationId":"planning_delete_walk_in_api_me_planning_walk_in__wid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"string","title":"Wid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/planning/stream":{"get":{"tags":["Portail Client — Planning"],"summary":"Planning Sse Stream","description":"Server-Sent Events : push temps réel des nouveaux RDV/mises à jour.\nAuth via query param `token` (JWT). Filtre par medecin_id optionnel.\nLe stream envoie un ping toutes les 20s pour maintenir la connexion vivante\n(contourne les 60s de Cloudflare + les timeouts uvicorn keep-alive).","operationId":"planning_sse_stream_api_me_planning_stream_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","description":"JWT (query param car EventSource ne supporte pas les headers)","title":"Token"},"description":"JWT (query param car EventSource ne supporte pas les headers)"},{"name":"medecin_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Medecin Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine/reactions-config":{"get":{"tags":["Admin — Liluvine Reactions"],"summary":"Get Config","operationId":"get_config_api_admin_liluvine_reactions_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin — Liluvine Reactions"],"summary":"Put Config","operationId":"put_config_api_admin_liluvine_reactions_config_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReactionsConfigUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/liluvine/reactions-templates":{"get":{"tags":["Admin — Liluvine Reactions"],"summary":"List Templates","operationId":"list_templates_api_admin_liluvine_reactions_templates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin — Liluvine Reactions"],"summary":"Create Template","operationId":"create_template_api_admin_liluvine_reactions_templates_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdTemplateCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/liluvine/reactions-templates/{tid}":{"put":{"tags":["Admin — Liluvine Reactions"],"summary":"Update Template","operationId":"update_template_api_admin_liluvine_reactions_templates__tid__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","title":"Tid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdTemplateUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin — Liluvine Reactions"],"summary":"Delete Template","operationId":"delete_template_api_admin_liluvine_reactions_templates__tid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"string","title":"Tid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine/reactions-templates/bulk-csv":{"post":{"tags":["Admin — Liluvine Reactions"],"summary":"Bulk Upload Csv","description":"Import CSV. Colonnes attendues (première ligne = header, séparateur `,` ou `;`) :\n`name,trigger_text,response_text,trigger_variations,response_media_url,response_media_kind,active`\n\n- `trigger_variations` : séparé par `|` (pipe).\n- `active` : \"true\"/\"1\"/\"oui\" → True, sinon False. Défaut True.\n- `response_media_url` + `response_media_kind` optionnels.","operationId":"bulk_upload_csv_api_admin_liluvine_reactions_templates_bulk_csv_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkCsvPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/liluvine/reactions-stats":{"get":{"tags":["Admin — Liluvine Reactions"],"summary":"Get Stats","operationId":"get_stats_api_admin_liluvine_reactions_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/contacts/{cid}/liluvine-history":{"get":{"tags":["Contacts — Liluvine"],"summary":"Contact History","description":"Timeline des matches Liluvine pour un contact précis.","operationId":"contact_history_api_me_contacts__cid__liluvine_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"string","title":"Cid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine/unmatched-suggestions":{"get":{"tags":["Admin — Liluvine Reactions"],"summary":"List Unmatched","description":"Retourne les groupes de messages non-traités (par similarité), triés par volume.","operationId":"list_unmatched_api_admin_liluvine_unmatched_suggestions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":30,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine/unmatched-suggestions/{sid}/convert":{"post":{"tags":["Admin — Liluvine Reactions"],"summary":"Convert Suggestion To Template","description":"Convertit une suggestion en template Ad.","operationId":"convert_suggestion_to_template_api_admin_liluvine_unmatched_suggestions__sid__convert_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine/unmatched-suggestions/{sid}":{"delete":{"tags":["Admin — Liluvine Reactions"],"summary":"Dismiss Suggestion","operationId":"dismiss_suggestion_api_admin_liluvine_unmatched_suggestions__sid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine-pro/kb":{"get":{"tags":["Admin — Liluvine PRO"],"summary":"Kb List","operationId":"kb_list_api_admin_liluvine_pro_kb_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin — Liluvine PRO"],"summary":"Kb Create","operationId":"kb_create_api_admin_liluvine_pro_kb_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KbEntryCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/liluvine-pro/kb/{eid}":{"put":{"tags":["Admin — Liluvine PRO"],"summary":"Kb Update","operationId":"kb_update_api_admin_liluvine_pro_kb__eid__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KbEntryUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin — Liluvine PRO"],"summary":"Kb Delete","operationId":"kb_delete_api_admin_liluvine_pro_kb__eid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"eid","in":"path","required":true,"schema":{"type":"string","title":"Eid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine-pro/kb/ocr-usage":{"get":{"tags":["Admin — Liluvine PRO"],"summary":"Kb Ocr Usage","description":"Iter38r-fix9k — Monthly OCR usage report (pages + XOF cost).\n`month` = \"YYYY-MM\" (defaults to current month).\nIter38r-fix9q — `client_id` (optional) scopes the result to a single\ntenant; per-tenant pricing/cap from the client's features doc override\nthe global settings when present.","operationId":"kb_ocr_usage_api_admin_liluvine_pro_kb_ocr_usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"month","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Month"}},{"name":"client_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine-pro/kb/upload":{"post":{"tags":["Admin — Liluvine PRO"],"summary":"Kb Upload","description":"Iter38r-fix9i — `force_ocr` (form, optional) :\n- 'true'  → mode OCR (image obligatoire, Claude Vision)\n- 'false' / absent → mode classique (PDF/TXT uniquement, pas d'OCR sur image)","operationId":"kb_upload_api_admin_liluvine_pro_kb_upload_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_kb_upload_api_admin_liluvine_pro_kb_upload_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/payments/pawapay/payout":{"post":{"tags":["Portail Client — PawaPay Payouts"],"summary":"Create Payout","operationId":"create_payout_api_me_payments_pawapay_payout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PayoutCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/payments/pawapay/payout/{pid}":{"get":{"tags":["Portail Client — PawaPay Payouts"],"summary":"Get Payout","operationId":"get_payout_api_me_payments_pawapay_payout__pid__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Refresh"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/payments/pawapay/payouts":{"get":{"tags":["Portail Client — PawaPay Payouts"],"summary":"List Payouts","operationId":"list_payouts_api_me_payments_pawapay_payouts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/pawapay/payouts/{secret}":{"post":{"tags":["Webhooks"],"summary":"Webhook Payouts","operationId":"webhook_payouts_api_webhooks_pawapay_payouts__secret__post","parameters":[{"name":"secret","in":"path","required":true,"schema":{"type":"string","title":"Secret"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/wa-credentials-resolver-diag":{"get":{"tags":["Admin"],"summary":"Admin Wa Credentials Resolver Diag","operationId":"admin_wa_credentials_resolver_diag_api_admin_wa_credentials_resolver_diag_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/smart-comm/resolver-diag":{"get":{"tags":["Admin"],"summary":"Admin Smart Comm Resolver Diag","operationId":"admin_smart_comm_resolver_diag_api_admin_smart_comm_resolver_diag_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"channel","in":"query","required":true,"schema":{"type":"string","title":"Channel"}},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/wa-tasks-digest/run-now":{"post":{"tags":["Admin — Bonus pack"],"summary":"Admin Run Wa Tasks Digest","operationId":"admin_run_wa_tasks_digest_api_admin_wa_tasks_digest_run_now_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/liluvine-weekly-digest/run-now":{"post":{"tags":["Admin — Bonus pack"],"summary":"Admin Run Weekly Digest","operationId":"admin_run_weekly_digest_api_admin_liluvine_weekly_digest_run_now_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/gdpr/anonymize-now":{"post":{"tags":["Admin — Bonus pack"],"summary":"Admin Anonymize Now","operationId":"admin_anonymize_now_api_admin_gdpr_anonymize_now_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/gdpr/export":{"get":{"tags":["Portail Client — GDPR"],"summary":"Me Gdpr Export","operationId":"me_gdpr_export_api_me_gdpr_export_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/wa-tasks-digest":{"get":{"tags":["Portail Client — Bonus pack"],"summary":"Me Get Wa Digest","operationId":"me_get_wa_digest_api_me_wa_tasks_digest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Portail Client — Bonus pack"],"summary":"Me Set Wa Digest","operationId":"me_set_wa_digest_api_me_wa_tasks_digest_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/planning-wa-digest":{"get":{"tags":["Portail Client — Planning"],"summary":"Me Get Planning Wa Digest","operationId":"me_get_planning_wa_digest_api_me_planning_wa_digest_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Portail Client — Planning"],"summary":"Me Set Planning Wa Digest","operationId":"me_set_planning_wa_digest_api_me_planning_wa_digest_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/planning-wa-digest/run-now":{"post":{"tags":["Admin — Planning"],"summary":"Admin Run Planning Digest Now","operationId":"admin_run_planning_digest_now_api_admin_planning_wa_digest_run_now_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/auth/wa-planning-exchange":{"post":{"tags":["Portail Client — Planning"],"summary":"Wa Planning Exchange","operationId":"wa_planning_exchange_api_auth_wa_planning_exchange_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/planning-digest/analytics":{"get":{"tags":["Admin — Planning"],"summary":"Admin Planning Digest Analytics","operationId":"admin_planning_digest_analytics_api_admin_planning_digest_analytics_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/social/status":{"get":{"tags":["Portail Client — Social"],"summary":"Me Social Status","operationId":"me_social_status_api_me_social_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/social/linkedin/post":{"post":{"tags":["Portail Client — Social"],"summary":"Me Social Linkedin Post","operationId":"me_social_linkedin_post_api_me_social_linkedin_post_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInPostIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/social/meta/post":{"post":{"tags":["Portail Client — Social"],"summary":"Me Social Meta Post","operationId":"me_social_meta_post_api_me_social_meta_post_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaPostIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/social/x/post":{"post":{"tags":["Portail Client — Social"],"summary":"Me Social X Post","description":"2026-02 fork iter102 — Publie un tweet via OAuth 1.0a signé.\n\nUtilise l'endpoint v2 `POST /2/tweets` (JSON body). Les credentials\nsont résolues via SmartCommResolver (`source=tenant` si les 4 clés\nOAuth du tenant sont présentes, sinon `source=global`).","operationId":"me_social_x_post_api_me_social_x_post_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/XPostIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/social/instagram/post":{"post":{"tags":["Portail Client — Social"],"summary":"Me Social Instagram Post","description":"2026-02 fork iter103 — Publie une image / carrousel / Reels sur\nInstagram Business via Graph API v22.\n\n3 modes :\n  - `image_url` seul → single image\n  - `image_urls` (2-10) → carousel (POST /media?is_carousel_item…)\n  - `video_url` seul → Reels","operationId":"me_social_instagram_post_api_me_social_instagram_post_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstagramPostIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/social/tiktok/post":{"post":{"tags":["Portail Client — Social"],"summary":"Me Social Tiktok Post","description":"2026-02 fork iter103 — Publie une vidéo TikTok via l'API Direct-Post.\n\nUtilise `PULL_FROM_URL` (l'URL doit être publiquement téléchargeable\ndepuis les serveurs TikTok). Le `privacy_level` par défaut est lu\ndepuis `settings.global.tiktok_privacy_level` (fallback SELF_ONLY).","operationId":"me_social_tiktok_post_api_me_social_tiktok_post_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TikTokPostIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/ai/generate-video-veo":{"post":{"tags":["Portail Client — AI Media (fix9m)"],"summary":"Generate Video Veo","operationId":"generate_video_veo_api_me_ai_generate_video_veo_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/ai/generate-video-veo/{job_id}":{"get":{"tags":["Portail Client — AI Media (fix9m)"],"summary":"Poll Video Veo","operationId":"poll_video_veo_api_me_ai_generate_video_veo__job_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/ai/generate-image-imagen":{"post":{"tags":["Portail Client — AI Media (fix9m)"],"summary":"Generate Image Imagen","operationId":"generate_image_imagen_api_me_ai_generate_image_imagen_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/ai/voices/clone":{"post":{"tags":["Portail Client — AI Media (fix9m)"],"summary":"Clone Voice","operationId":"clone_voice_api_me_ai_voices_clone_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_clone_voice_api_me_ai_voices_clone_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/ai/voices":{"get":{"tags":["Portail Client — AI Media (fix9m)"],"summary":"List Voices","operationId":"list_voices_api_me_ai_voices_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/ai/voices/{voice_id}":{"delete":{"tags":["Portail Client — AI Media (fix9m)"],"summary":"Delete Voice","operationId":"delete_voice_api_me_ai_voices__voice_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"voice_id","in":"path","required":true,"schema":{"type":"string","title":"Voice Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/ai/tts-elevenlabs":{"post":{"tags":["Portail Client — AI Media (fix9m)"],"summary":"Tts Elevenlabs","operationId":"tts_elevenlabs_api_me_ai_tts_elevenlabs_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/public/products/{product_id}/checkout":{"post":{"tags":["Public"],"summary":"Public Product Checkout","operationId":"public_product_checkout_api_public_products__product_id__checkout_post","parameters":[{"name":"product_id","in":"path","required":true,"schema":{"type":"string","title":"Product Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/orders/{order_id}":{"get":{"tags":["Public"],"summary":"Public Order Status","operationId":"public_order_status_api_public_orders__order_id__get","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/stripe/webhook-events":{"get":{"tags":["Admin — Stripe"],"summary":"List Webhook Events","operationId":"list_webhook_events_api_admin_stripe_webhook_events_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/coupons":{"get":{"tags":["Admin — Coupons"],"summary":"List Coupons","operationId":"list_coupons_api_admin_coupons_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin — Coupons"],"summary":"Create Coupon","operationId":"create_coupon_api_admin_coupons_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CouponCreate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/coupons/{coupon_id}":{"put":{"tags":["Admin — Coupons"],"summary":"Update Coupon","operationId":"update_coupon_api_admin_coupons__coupon_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"coupon_id","in":"path","required":true,"schema":{"type":"string","title":"Coupon Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin — Coupons"],"summary":"Delete Coupon","operationId":"delete_coupon_api_admin_coupons__coupon_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"coupon_id","in":"path","required":true,"schema":{"type":"string","title":"Coupon Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/coupons/{code}/validate":{"get":{"tags":["Public"],"summary":"Validate Coupon","description":"Validate a coupon for a given XOF amount (UX preview before checkout).","operationId":"validate_coupon_api_public_coupons__code__validate_get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}},{"name":"amount","in":"query","required":true,"schema":{"type":"integer","title":"Amount"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/wa-otp/request":{"post":{"tags":["Auth — WhatsApp OTP"],"summary":"Request Wa Otp","operationId":"request_wa_otp_api_auth_wa_otp_request_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/wa-otp/verify":{"post":{"tags":["Auth — WhatsApp OTP"],"summary":"Verify Wa Otp","operationId":"verify_wa_otp_api_auth_wa_otp_verify_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/wa-demo/recent":{"get":{"tags":["Admin — Bonus"],"summary":"Admin Wa Demo Recent","operationId":"admin_wa_demo_recent_api_admin_wa_demo_recent_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/wa-demo/{user_id}/mark-seen":{"post":{"tags":["Admin — Bonus"],"summary":"Mark Seen","operationId":"mark_seen_api_admin_wa_demo__user_id__mark_seen_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/wa-otp/test":{"post":{"tags":["Admin — WhatsApp OTP"],"summary":"Admin Test Wa Otp","operationId":"admin_test_wa_otp_api_admin_wa_otp_test_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/files/{file_path}":{"get":{"tags":["Files"],"summary":"Proxy File Download","description":"Iter38r-fix8 — Endpoint proxy servant les fichiers depuis Emergent Object Storage.\nPath matches the value `save_and_log()` returned. Public by default for\nmost assets (catalog images, avatars, AI media that are already accessible\nby URL); private files would add an auth check here in the future.","operationId":"proxy_file_download_api_files__file_path__get","parameters":[{"name":"file_path","in":"path","required":true,"schema":{"type":"string","title":"File Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/docs":{"get":{"tags":["Public — Docs"],"summary":"List Docs","operationId":"list_docs_api_public_docs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/docs/{slug}":{"get":{"tags":["Public — Docs"],"summary":"Download Doc","operationId":"download_doc_api_public_docs__slug__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/admin/docs/regenerate/{slug}":{"post":{"tags":["Admin — Docs"],"summary":"Regenerate Doc","operationId":"regenerate_doc_api_admin_docs_regenerate__slug__post","security":[{"HTTPBearer":[]}],"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/admin/voice-notifications/catalog":{"get":{"tags":["Admin — Voice Notifications"],"summary":"Get Catalog","operationId":"get_catalog_api_admin_voice_notifications_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/voice-notifications/config":{"get":{"tags":["Admin — Voice Notifications"],"summary":"Get Config","operationId":"get_config_api_admin_voice_notifications_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"put":{"tags":["Admin — Voice Notifications"],"summary":"Update Config","operationId":"update_config_api_admin_voice_notifications_config_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/voice-notifications/rules":{"get":{"tags":["Admin — Voice Notifications"],"summary":"List Rules","operationId":"list_rules_api_admin_voice_notifications_rules_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/voice-notifications/rules/{event_key}":{"put":{"tags":["Admin — Voice Notifications"],"summary":"Upsert Rule","operationId":"upsert_rule_api_admin_voice_notifications_rules__event_key__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"event_key","in":"path","required":true,"schema":{"type":"string","title":"Event Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/voice-notifications/custom-events":{"post":{"tags":["Admin — Voice Notifications"],"summary":"Add Custom Event","operationId":"add_custom_event_api_admin_voice_notifications_custom_events_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/voice-notifications/custom-events/{event_key}":{"delete":{"tags":["Admin — Voice Notifications"],"summary":"Delete Custom Event","operationId":"delete_custom_event_api_admin_voice_notifications_custom_events__event_key__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"event_key","in":"path","required":true,"schema":{"type":"string","title":"Event Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/voice-notifications/test":{"post":{"tags":["Admin — Voice Notifications"],"summary":"Test Voice","operationId":"test_voice_api_admin_voice_notifications_test_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/voice-notifications/log":{"get":{"tags":["Admin — Voice Notifications"],"summary":"Get Log","operationId":"get_log_api_admin_voice_notifications_log_get","security":[{"HTTPBearer":[]}],"parameters":[{"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"}}}}}}},"/api/voice-notifications/trigger":{"post":{"tags":["Voice Notifications"],"summary":"Manual Trigger","description":"Utilisé par les utilisateurs suivis ou l'admin pour envoyer une notification vocale\nexplicitly (e.g. button in the UI). The rule must be enabled.","operationId":"manual_trigger_api_voice_notifications_trigger_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/ai-subscriptions":{"get":{"tags":["Admin — Abonnements IA"],"summary":"List Subs","operationId":"list_subs_api_admin_ai_subscriptions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin — Abonnements IA"],"summary":"Create Sub","operationId":"create_sub_api_admin_ai_subscriptions_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/ai-subscriptions/{sub_id}":{"put":{"tags":["Admin — Abonnements IA"],"summary":"Update Sub","operationId":"update_sub_api_admin_ai_subscriptions__sub_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubscriptionUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin — Abonnements IA"],"summary":"Delete Sub","operationId":"delete_sub_api_admin_ai_subscriptions__sub_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ai-subscriptions/{sub_id}/send-reminder":{"post":{"tags":["Admin — Abonnements IA"],"summary":"Trigger Reminder","operationId":"trigger_reminder_api_admin_ai_subscriptions__sub_id__send_reminder_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sub_id","in":"path","required":true,"schema":{"type":"string","title":"Sub Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/ad-banners/active":{"get":{"tags":["Public — Ad Banners"],"summary":"Public Pick Banner","description":"Return ONE active banner suitable for `placement` (weighted random).\nReturns 204 No Content when no banner is currently active.\n\nIter40-modal — When placement=\"public_modal\", banners must be EXACTLY\nof placement \"public_modal\" (these are reserved for the random popup\nmodal shown on public-page load — not mixed with the top-of-page slot).","operationId":"public_pick_banner_api_public_ad_banners_active_get","parameters":[{"name":"placement","in":"query","required":false,"schema":{"type":"string","pattern":"^(public|portal|public_modal)$","default":"public","title":"Placement"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/ad-banners/config":{"get":{"tags":["Public — Ad Banners"],"summary":"Public Ad Config","operationId":"public_ad_config_api_public_ad_banners_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/public/ad-banners/{banner_id}/impression":{"post":{"tags":["Public — Ad Banners"],"summary":"Public Impression","operationId":"public_impression_api_public_ad_banners__banner_id__impression_post","parameters":[{"name":"banner_id","in":"path","required":true,"schema":{"type":"string","title":"Banner Id"}},{"name":"variant","in":"query","required":false,"schema":{"type":"string","pattern":"^(a|b)$","default":"a","title":"Variant"}},{"name":"modal","in":"query","required":false,"schema":{"type":"integer","maximum":1,"minimum":0,"default":0,"title":"Modal"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/ad-banners/{banner_id}/click":{"post":{"tags":["Public — Ad Banners"],"summary":"Public Click","operationId":"public_click_api_public_ad_banners__banner_id__click_post","parameters":[{"name":"banner_id","in":"path","required":true,"schema":{"type":"string","title":"Banner Id"}},{"name":"variant","in":"query","required":false,"schema":{"type":"string","pattern":"^(a|b)$","default":"a","title":"Variant"}},{"name":"modal","in":"query","required":false,"schema":{"type":"integer","maximum":1,"minimum":0,"default":0,"title":"Modal"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ad-banners":{"get":{"tags":["Admin — Ad Banners"],"summary":"List Banners","operationId":"list_banners_api_admin_ad_banners_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin — Ad Banners"],"summary":"Create Banner","operationId":"create_banner_api_admin_ad_banners_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdBannerPayload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/ad-banners/{banner_id}":{"put":{"tags":["Admin — Ad Banners"],"summary":"Update Banner","operationId":"update_banner_api_admin_ad_banners__banner_id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"banner_id","in":"path","required":true,"schema":{"type":"string","title":"Banner Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdBannerUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin — Ad Banners"],"summary":"Delete Banner","operationId":"delete_banner_api_admin_ad_banners__banner_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"banner_id","in":"path","required":true,"schema":{"type":"string","title":"Banner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ad-banners/{banner_id}/rotate-token":{"post":{"tags":["Admin — Ad Banners"],"summary":"Rotate Share Token","description":"Regenerate the share_token (invalidates previously shared URLs).","operationId":"rotate_share_token_api_admin_ad_banners__banner_id__rotate_token_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"banner_id","in":"path","required":true,"schema":{"type":"string","title":"Banner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ad-banners/fix-urls":{"post":{"tags":["Admin — Ad Banners"],"summary":"Fix Absolute Urls","operationId":"fix_absolute_urls_api_admin_ad_banners_fix_urls_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/ad-banners/{banner_id}/toggle-paid":{"post":{"tags":["Admin — Ad Banners"],"summary":"Toggle Paid","operationId":"toggle_paid_api_admin_ad_banners__banner_id__toggle_paid_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"banner_id","in":"path","required":true,"schema":{"type":"string","title":"Banner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ad-banners/{banner_id}/stats":{"get":{"tags":["Admin — Ad Banners"],"summary":"Banner Stats","operationId":"banner_stats_api_admin_ad_banners__banner_id__stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"banner_id","in":"path","required":true,"schema":{"type":"string","title":"Banner Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/ads-report/{slug}":{"get":{"tags":["Public — Ad Banners"],"summary":"Public Ads Report","description":"Iter38r-fix9y — Rapport public en direct pour un annonceur. Nécessite le\nslug + share_token couple (set when the banner is created and\ninvalidatable via /admin/ad-banners/{id}/rotate-token). Returns only\nthe fields safe to share with the advertiser (no costs the admin paid,\nno internal IDs).","operationId":"public_ads_report_api_public_ads_report__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/ads-report/{slug}/renew":{"post":{"tags":["Public — Ad Banners"],"summary":"Public Renew Campaign","operationId":"public_renew_campaign_api_public_ads_report__slug__renew_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenewRequestPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ad-renewal-requests":{"get":{"tags":["Admin — Ad Banners"],"summary":"List Renewal Requests","operationId":"list_renewal_requests_api_admin_ad_renewal_requests_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/ad-renewal-requests/{req_id}/mark-handled":{"post":{"tags":["Admin — Ad Banners"],"summary":"Mark Renewal Handled","operationId":"mark_renewal_handled_api_admin_ad_renewal_requests__req_id__mark_handled_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"req_id","in":"path","required":true,"schema":{"type":"string","title":"Req Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/ad-banners/run-reminder-cron":{"post":{"tags":["Admin — Ad Banners"],"summary":"Run Reminder Cron Now","operationId":"run_reminder_cron_now_api_admin_ad_banners_run_reminder_cron_post","requestBody":{"content":{"application/json":{"schema":{"title":"Send Email Fn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/public/ads-report/{slug}/checkout":{"post":{"tags":["Public — Ad Banners"],"summary":"Public Create Checkout","description":"Crée une session Stripe Checkout pour le renouvellement de la campagne.\n\nIdempotent w.r.t. session_id (returned to the caller). On success\nwebhook/poll-status will extend the banner expiration_date by\n`duration_days` and top up `budget_amount` by `amount_xof`.","operationId":"public_create_checkout_api_public_ads_report__slug__checkout_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutPayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/ads-report/{slug}/payment-status/{session_id}":{"get":{"tags":["Public — Ad Banners"],"summary":"Public Payment Status","description":"Poll endpoint. Confirms the Stripe session and, on first paid\nobservation, atomically extends the campaign's expiration + budget.","operationId":"public_payment_status_api_public_ads_report__slug__payment_status__session_id__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/ads-report/{slug}/media":{"put":{"tags":["Public — Ad Banners"],"summary":"Public Update Media","description":"Self-service media update. The advertiser uploads via the admin\npublic-upload endpoint then PUTs the resulting `/api/files/{id}` URL\nhere. Only `image_url`, `media_kind`, `target_url`, plus the variant_b\nequivalents can be changed — nothing else (preserves admin-set budget,\nplacement, sizing, etc.).","operationId":"public_update_media_api_public_ads_report__slug__media_put","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaUpdatePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/public/ads-report/{slug}/ai-plan":{"post":{"tags":["Public — Ad Banners"],"summary":"Public Ai Campaign Plan","operationId":"public_ai_campaign_plan_api_public_ads_report__slug__ai_plan_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"token","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/meetings":{"get":{"tags":["PV de réunions"],"summary":"List Meetings","operationId":"list_meetings_api_me_meetings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Q"}},{"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":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["PV de réunions"],"summary":"Create Meeting","operationId":"create_meeting_api_me_meetings_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/meetings/{mid}":{"get":{"tags":["PV de réunions"],"summary":"Get Meeting","operationId":"get_meeting_api_me_meetings__mid__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mid","in":"path","required":true,"schema":{"type":"string","title":"Mid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["PV de réunions"],"summary":"Update Meeting","operationId":"update_meeting_api_me_meetings__mid__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mid","in":"path","required":true,"schema":{"type":"string","title":"Mid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["PV de réunions"],"summary":"Delete Meeting","operationId":"delete_meeting_api_me_meetings__mid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mid","in":"path","required":true,"schema":{"type":"string","title":"Mid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/meetings/{mid}/sign":{"post":{"tags":["PV de réunions"],"summary":"Sign Meeting","operationId":"sign_meeting_api_me_meetings__mid__sign_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mid","in":"path","required":true,"schema":{"type":"string","title":"Mid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/meetings/{mid}/unsign":{"post":{"tags":["PV de réunions"],"summary":"Unsign Meeting","operationId":"unsign_meeting_api_me_meetings__mid__unsign_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mid","in":"path","required":true,"schema":{"type":"string","title":"Mid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/meetings/{mid}/pdf":{"get":{"tags":["PV de réunions"],"summary":"Export Pdf","operationId":"export_pdf_api_me_meetings__mid__pdf_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mid","in":"path","required":true,"schema":{"type":"string","title":"Mid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/download-requests":{"post":{"tags":["Téléchargements protégés"],"summary":"Create Request","operationId":"create_request_api_me_download_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownloadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/me/download-requests/{token}":{"get":{"tags":["Téléchargements protégés"],"summary":"Get Status","operationId":"get_status_api_me_download_requests__token__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/download-requests/{token}/cancel":{"post":{"tags":["Téléchargements protégés"],"summary":"Cancel Request","operationId":"cancel_request_api_me_download_requests__token__cancel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/download-requests/admin/audit":{"get":{"tags":["Téléchargements protégés","Téléchargements protégés","Admin"],"summary":"Admin Audit","operationId":"admin_audit_api_me_download_requests_admin_audit_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/wa-action/{token}/{action}":{"get":{"tags":["Téléchargements protégés (public)"],"summary":"Public Decide","operationId":"public_decide_api_wa_action__token___action__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}},{"name":"action","in":"path","required":true,"schema":{"type":"string","title":"Action"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/llm-health":{"get":{"tags":["Admin"],"summary":"Get State","description":"Admin/Superviseur can read the state. The frontend banner uses an\nadditional client-side filter so it only renders for the super-admin.","operationId":"get_state_api_admin_llm_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/llm-health/ping":{"post":{"tags":["Admin"],"summary":"Manual Ping","description":"Force a fresh health probe (admin button).","operationId":"manual_ping_api_admin_llm_health_ping_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/llm-health/reset-stale":{"post":{"tags":["Admin"],"summary":"Reset Stale","description":"Iter43-fix (2026-03) — Efface manuellement les `current_cost` /\n`max_budget` figés par une ancienne erreur Emergent « Budget exceeded ».\nÀ utiliser quand le banner reste bloqué à 100% après une recharge\net qu'aucun probe ne parvient à débloquer l'état.","operationId":"reset_stale_api_admin_llm_health_reset_stale_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/llm-health/test-summary":{"post":{"tags":["Admin"],"summary":"Test Summary","description":"S033 — Manual budget test: forces a health probe AND returns the\nformatted human-readable summary (same text used by the WhatsApp\nkeyword trigger). Used by the \"Tester maintenant\" button in\n/admin/settings.","operationId":"test_summary_api_admin_llm_health_test_summary_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/llm-health/usage-chart":{"get":{"tags":["Admin"],"summary":"Usage Chart","description":"S-iter39n — Daily consumption chart for the Universal Key.\n\nAggregates `llm_usage_log` per day over the last `days` days and\nreturns a list of `{date, cost_usd, calls, by_context}` entries\nsuitable for a frontend bar/line chart. Backbone for the S032\nburn-rate dashboard.","operationId":"usage_chart_api_admin_llm_health_usage_chart_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/qdrant/test-connection":{"post":{"tags":["Admin — Qdrant RAG"],"summary":"R Test","operationId":"r_test_api_admin_qdrant_test_connection_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/qdrant/storage":{"get":{"tags":["Admin — Qdrant RAG"],"summary":"R Storage","description":"S041 — Total estimated Qdrant disk usage vs cluster quota.","operationId":"r_storage_api_admin_qdrant_storage_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/qdrant/collections":{"get":{"tags":["Admin — Qdrant RAG"],"summary":"R List","operationId":"r_list_api_admin_qdrant_collections_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin — Qdrant RAG"],"summary":"R Create","operationId":"r_create_api_admin_qdrant_collections_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/qdrant/collections/{name}":{"delete":{"tags":["Admin — Qdrant RAG"],"summary":"R Delete","operationId":"r_delete_api_admin_qdrant_collections__name__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Admin — Qdrant RAG"],"summary":"R Patch","description":"Met à jour les métadonnées de la collection (enabled_for_liluvine, description).","operationId":"r_patch_api_admin_qdrant_collections__name__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/qdrant/collections/{name}/points":{"get":{"tags":["Admin — Qdrant RAG"],"summary":"R Browse","operationId":"r_browse_api_admin_qdrant_collections__name__points_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"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"}}}}}}},"/api/admin/qdrant/collections/{name}/points/text":{"post":{"tags":["Admin — Qdrant RAG"],"summary":"R Upsert Text","operationId":"r_upsert_text_api_admin_qdrant_collections__name__points_text_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/qdrant/collections/{name}/points/pdf":{"post":{"tags":["Admin — Qdrant RAG"],"summary":"R Upsert Pdf","operationId":"r_upsert_pdf_api_admin_qdrant_collections__name__points_pdf_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_r_upsert_pdf_api_admin_qdrant_collections__name__points_pdf_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/qdrant/collections/{name}/points/url":{"post":{"tags":["Admin — Qdrant RAG"],"summary":"R Upsert Url","operationId":"r_upsert_url_api_admin_qdrant_collections__name__points_url_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/qdrant/collections/{name}/points/image":{"post":{"tags":["Admin — Qdrant RAG"],"summary":"R Upsert Image","description":"S041 + P1 (2026-02) — Upload an image, save it in the media\nlibrary, optionally enrich it via Claude Vision (OCR + visual\ndescription), and index everything in Qdrant. Liluvine can then\nsurface the image URL in her replies via Markdown.\n\n`auto_describe` accepts: 'on' / 'off' / 'auto'. 'auto' (default)\nrespects the global setting `qdrant_image_auto_describe` (True by\ndefault).","operationId":"r_upsert_image_api_admin_qdrant_collections__name__points_image_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_r_upsert_image_api_admin_qdrant_collections__name__points_image_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/qdrant/collections/{name}/points/{pid}":{"delete":{"tags":["Admin — Qdrant RAG"],"summary":"R Delete Point","operationId":"r_delete_point_api_admin_qdrant_collections__name__points__pid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"pid","in":"path","required":true,"schema":{"type":"string","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/qdrant/collections/{name}/search":{"post":{"tags":["Admin — Qdrant RAG"],"summary":"R Search","operationId":"r_search_api_admin_qdrant_collections__name__search_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/qdrant/migrate-mongo-kb":{"post":{"tags":["Admin — Qdrant RAG"],"summary":"R Migrate","description":"One-shot migration : pull all entries from `liluvine_kb_entries`\nand index them into the target Qdrant collection.","operationId":"r_migrate_api_admin_qdrant_migrate_mongo_kb_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/public/media-library":{"get":{"tags":["Public — Media Library"],"summary":"List Public","description":"All `public=True` media, sorted by sort_order asc then created_at desc.","operationId":"list_public_api_public_media_library_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/media-library":{"get":{"tags":["Admin — Media Library"],"summary":"List Admin","operationId":"list_admin_api_admin_media_library_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin — Media Library"],"summary":"Upload","operationId":"upload_api_admin_media_library_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_api_admin_media_library_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/media-library/{mid}":{"patch":{"tags":["Admin — Media Library"],"summary":"Patch Media","operationId":"patch_media_api_admin_media_library__mid__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mid","in":"path","required":true,"schema":{"type":"string","title":"Mid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin — Media Library"],"summary":"Delete Media","operationId":"delete_media_api_admin_media_library__mid__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mid","in":"path","required":true,"schema":{"type":"string","title":"Mid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/suggestions-registry":{"get":{"tags":["Admin"],"summary":"Get Suggestions Registry","operationId":"get_suggestions_registry_api_admin_suggestions_registry_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/suggestions-history":{"get":{"tags":["Admin"],"summary":"Get Suggestions History","description":"List parsed suggestions from SUGGESTIONS.md.\n\nQuery params:\n  - status : filter by canonical status key (implemented | accepted | proposed | deferred | refused)","operationId":"get_suggestions_history_api_admin_suggestions_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/suggestions-history/{sid}/status":{"patch":{"tags":["Admin"],"summary":"Admin Vote Suggestion Status","description":"2026-02 fork iter103 — Change a suggestion status via UI (override).\n\nPersists in `db.suggestion_overrides` so the markdown file is left intact.\nThe GET endpoint merges the override on top of the parsed status.","operationId":"admin_vote_suggestion_status_api_admin_suggestions_history__sid__status_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuggestionVotePayload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Admin Clear Suggestion Override","description":"Clear the DB override → back to the markdown-declared status.","operationId":"admin_clear_suggestion_override_api_admin_suggestions_history__sid__status_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"sid","in":"path","required":true,"schema":{"type":"string","title":"Sid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/liluvine-escalation/test":{"post":{"tags":["Admin"],"summary":"Admin Test Liluvine Escalation","operationId":"admin_test_liluvine_escalation_api_admin_liluvine_escalation_test_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}}},"components":{"schemas":{"AbsencePayload":{"properties":{"employee_id":{"type":"string","minLength":1,"title":"Employee Id"},"start_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","title":"Start Date"},"end_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","title":"End Date"},"hours_count":{"type":"number","minimum":0.0,"title":"Hours Count","default":8.0},"abs_type":{"type":"string","title":"Abs Type","default":"non_justifiee"},"is_justified":{"type":"boolean","title":"Is Justified","default":false},"justification":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Justification"}},"type":"object","required":["employee_id","start_date","end_date"],"title":"AbsencePayload"},"AbsenceUpdate":{"properties":{"start_date":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"title":"Start Date"},"end_date":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"title":"End Date"},"hours_count":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Hours Count"},"abs_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Abs Type"},"is_justified":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Justified"},"justification":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Justification"}},"type":"object","title":"AbsenceUpdate"},"AccessLogCreate":{"properties":{"module":{"type":"string","title":"Module"},"page":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page"}},"type":"object","required":["module"],"title":"AccessLogCreate"},"ActivePagePayload":{"properties":{"page_id":{"type":"string","title":"Page Id"},"page_access_token":{"type":"string","title":"Page Access Token"},"page_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Name"}},"type":"object","required":["page_id","page_access_token"],"title":"ActivePagePayload"},"AdBannerPayload":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"advertiser_name":{"type":"string","maxLength":120,"title":"Advertiser Name","default":""},"image_url":{"type":"string","maxLength":600,"minLength":4,"title":"Image Url"},"media_kind":{"type":"string","pattern":"^(image|video)$","title":"Media Kind","default":"image"},"target_url":{"type":"string","maxLength":600,"minLength":4,"title":"Target Url"},"placement":{"type":"string","pattern":"^(public|portal|both|public_modal)$","title":"Placement","default":"both"},"animated":{"type":"boolean","title":"Animated","default":false},"active":{"type":"boolean","title":"Active","default":true},"budget_amount":{"type":"number","minimum":0.0,"title":"Budget Amount","default":0},"currency":{"type":"string","maxLength":8,"minLength":2,"title":"Currency","default":"XOF"},"cost_per_impression":{"type":"number","minimum":0.0,"title":"Cost Per Impression","default":0},"cost_per_click":{"type":"number","minimum":0.0,"title":"Cost Per Click","default":0},"paid":{"type":"boolean","title":"Paid","default":false},"payment_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Date"},"expiration_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expiration Date"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"notes":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Notes","default":""},"display_mode":{"type":"string","pattern":"^(auto|ratio|percentage|fixed)$","title":"Display Mode","default":"auto"},"aspect_ratio":{"type":"string","maxLength":12,"title":"Aspect Ratio","default":"16:9"},"width_pct":{"type":"integer","maximum":100.0,"minimum":10.0,"title":"Width Pct","default":100},"height_px":{"type":"integer","maximum":1200.0,"minimum":20.0,"title":"Height Px","default":80},"width_px":{"type":"integer","maximum":2400.0,"minimum":50.0,"title":"Width Px","default":728},"object_fit":{"type":"string","pattern":"^(cover|contain|fill)$","title":"Object Fit","default":"cover"},"modal_frequency":{"type":"string","pattern":"^(session|daily|always)$","title":"Modal Frequency","default":"session"},"variant_b_modal_frequency":{"type":"string","maxLength":12,"title":"Variant B Modal Frequency","default":""},"ab_enabled":{"type":"boolean","title":"Ab Enabled","default":false},"variant_b_image_url":{"type":"string","maxLength":600,"title":"Variant B Image Url","default":""},"variant_b_media_kind":{"type":"string","pattern":"^(image|video)$","title":"Variant B Media Kind","default":"image"},"variant_b_target_url":{"type":"string","maxLength":600,"title":"Variant B Target Url","default":""},"advertiser_email":{"type":"string","maxLength":200,"title":"Advertiser Email","default":""},"advertiser_phone":{"type":"string","maxLength":40,"title":"Advertiser Phone","default":""},"reminder_email_enabled":{"type":"boolean","title":"Reminder Email Enabled","default":true},"reminder_wa_enabled":{"type":"boolean","title":"Reminder Wa Enabled","default":false},"reminder_days_before":{"type":"integer","maximum":30.0,"minimum":1.0,"title":"Reminder Days Before","default":3}},"type":"object","required":["name","image_url","target_url"],"title":"AdBannerPayload"},"AdBannerUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"advertiser_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Advertiser Name"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"media_kind":{"anyOf":[{"type":"string","pattern":"^(image|video)$"},{"type":"null"}],"title":"Media Kind"},"target_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Url"},"placement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Placement"},"animated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Animated"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"budget_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget Amount"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"cost_per_impression":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cost Per Impression"},"cost_per_click":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cost Per Click"},"paid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Paid"},"payment_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Date"},"expiration_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expiration Date"},"start_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"display_mode":{"anyOf":[{"type":"string","pattern":"^(auto|ratio|percentage|fixed)$"},{"type":"null"}],"title":"Display Mode"},"aspect_ratio":{"anyOf":[{"type":"string","maxLength":12},{"type":"null"}],"title":"Aspect Ratio"},"width_pct":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":10.0},{"type":"null"}],"title":"Width Pct"},"height_px":{"anyOf":[{"type":"integer","maximum":1200.0,"minimum":20.0},{"type":"null"}],"title":"Height Px"},"width_px":{"anyOf":[{"type":"integer","maximum":2400.0,"minimum":50.0},{"type":"null"}],"title":"Width Px"},"object_fit":{"anyOf":[{"type":"string","pattern":"^(cover|contain|fill)$"},{"type":"null"}],"title":"Object Fit"},"modal_frequency":{"anyOf":[{"type":"string","pattern":"^(session|daily|always)$"},{"type":"null"}],"title":"Modal Frequency"},"variant_b_modal_frequency":{"anyOf":[{"type":"string","maxLength":12},{"type":"null"}],"title":"Variant B Modal Frequency"},"ab_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ab Enabled"},"variant_b_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variant B Image Url"},"variant_b_media_kind":{"anyOf":[{"type":"string","pattern":"^(image|video)$"},{"type":"null"}],"title":"Variant B Media Kind"},"variant_b_target_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variant B Target Url"},"advertiser_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Advertiser Email"},"advertiser_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Advertiser Phone"},"reminder_email_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reminder Email Enabled"},"reminder_wa_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reminder Wa Enabled"},"reminder_days_before":{"anyOf":[{"type":"integer","maximum":30.0,"minimum":1.0},{"type":"null"}],"title":"Reminder Days Before"}},"type":"object","title":"AdBannerUpdate"},"AdTemplateCreate":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"trigger_text":{"type":"string","maxLength":500,"minLength":1,"title":"Trigger Text"},"trigger_variations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Trigger Variations"},"response_text":{"type":"string","maxLength":4000,"minLength":1,"title":"Response Text"},"response_media_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Media Url"},"response_media_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Media Kind","description":"image | video | audio | doc"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active","default":true}},"type":"object","required":["name","trigger_text","response_text"],"title":"AdTemplateCreate"},"AdTemplateUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"trigger_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trigger Text"},"trigger_variations":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Trigger Variations"},"response_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Text"},"response_media_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Media Url"},"response_media_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Response Media Kind"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"}},"type":"object","title":"AdTemplateUpdate"},"AddContactsPayload":{"properties":{"contact_ids":{"items":{"type":"string"},"type":"array","title":"Contact Ids"}},"type":"object","title":"AddContactsPayload"},"AdminBulkSendRequest":{"properties":{"recipients":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Recipients"},"template_name":{"type":"string","title":"Template Name"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code","default":"fr"},"components":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Components"},"variables":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Variables"},"header_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Header Text"},"header_media":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Header Media"},"button_vars":{"anyOf":[{"items":{"items":{"type":"string"},"type":"array"},"type":"array"},{"type":"null"}],"title":"Button Vars"},"button_specs":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Button Specs"}},"type":"object","required":["recipients","template_name"],"title":"AdminBulkSendRequest"},"AdminRemoteLinkRequest":{"properties":{"ttl_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ttl Hours","default":720}},"type":"object","title":"AdminRemoteLinkRequest"},"AdminScheduleCreate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"recipients":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Recipients"},"template_name":{"type":"string","title":"Template Name"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code","default":"fr"},"components":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Components"},"variables":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Variables"},"header_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Header Text"},"header_media":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Header Media"},"button_vars":{"anyOf":[{"items":{"items":{"type":"string"},"type":"array"},"type":"array"},{"type":"null"}],"title":"Button Vars"},"button_specs":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Button Specs"},"scheduled_at":{"type":"string","title":"Scheduled At"}},"type":"object","required":["recipients","template_name","scheduled_at"],"title":"AdminScheduleCreate"},"AdminSmsTestRequest":{"properties":{"provider":{"type":"string","title":"Provider"},"to":{"type":"string","title":"To"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender"}},"type":"object","required":["provider","to"],"title":"AdminSmsTestRequest"},"AdminSupportLoadUpdate":{"properties":{"level":{"type":"integer","title":"Level"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","required":["level"],"title":"AdminSupportLoadUpdate"},"AdvancePayload":{"properties":{"employee_id":{"type":"string","minLength":1,"title":"Employee Id"},"amount":{"type":"number","exclusiveMinimum":0.0,"title":"Amount"},"currency":{"type":"string","maxLength":8,"title":"Currency","default":"XOF"},"motive":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Motive"},"granted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Granted At"},"auto_deduct":{"type":"boolean","title":"Auto Deduct","default":true}},"type":"object","required":["employee_id","amount"],"title":"AdvancePayload"},"AdvanceRepayPayload":{"properties":{"repaid_amount":{"type":"number","exclusiveMinimum":0.0,"title":"Repaid Amount"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"}},"type":"object","required":["repaid_amount"],"title":"AdvanceRepayPayload"},"AgendaWebhookCreate":{"properties":{"action":{"type":"string","title":"Action"},"client_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Email"},"appointment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Appointment Id"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"scheduled_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled At"},"duration_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Min"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},"type":"object","required":["action"],"title":"AgendaWebhookCreate"},"AiSummaryRequest":{"properties":{"messages":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Messages"},"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"}},"type":"object","required":["messages"],"title":"AiSummaryRequest"},"AiSummaryToReport":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"is_private":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Private","default":true},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}},"type":"object","title":"AiSummaryToReport"},"AllowancePayload":{"properties":{"label":{"type":"string","maxLength":120,"minLength":1,"title":"Label"},"amount":{"type":"number","minimum":0.0,"title":"Amount"},"currency":{"type":"string","maxLength":8,"title":"Currency","default":"XOF"},"active":{"type":"boolean","title":"Active","default":true},"sort_order":{"type":"integer","title":"Sort Order","default":0},"notes":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Notes"},"catalog_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Catalog Id"}},"type":"object","required":["label","amount"],"title":"AllowancePayload","description":"Indemnité fixe — récurrente chaque mois (transport, logement, panier…).\nReste active jusqu'à modification/désactivation/suppression manuelle."},"AllowanceUpdate":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Label"},"amount":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Amount"},"currency":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Currency"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"},"notes":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Notes"}},"type":"object","title":"AllowanceUpdate"},"AmmCreatePayload":{"properties":{"vidal_product_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Vidal Product Id"},"product_name":{"type":"string","title":"Product Name"},"amm_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amm Number"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"laboratory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Laboratory"},"galenic_form":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Galenic Form"},"atc_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Atc Class"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","default":"active"},"granted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Granted At"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"cip1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cip1"},"cip2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cip2"},"cip3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cip3"},"cip4":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cip4"},"cip5":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cip5"}},"type":"object","required":["product_name"],"title":"AmmCreatePayload"},"AmmLookupIn":{"properties":{"cip":{"type":"string","maxLength":30,"minLength":3,"title":"Cip"}},"type":"object","required":["cip"],"title":"AmmLookupIn"},"AmmUpdatePayload":{"properties":{"vidal_product_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Vidal Product Id"},"product_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Name"},"amm_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amm Number"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"laboratory":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Laboratory"},"galenic_form":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Galenic Form"},"atc_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Atc Class"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"granted_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Granted At"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"cip1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cip1"},"cip2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cip2"},"cip3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cip3"},"cip4":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cip4"},"cip5":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cip5"}},"type":"object","title":"AmmUpdatePayload"},"ApiTraceCreate":{"properties":{"method":{"type":"string","title":"Method"},"url":{"type":"string","title":"Url"},"status":{"type":"integer","title":"Status"},"request_body":{"anyOf":[{},{"type":"null"}],"title":"Request Body"},"response_body":{"anyOf":[{},{"type":"null"}],"title":"Response Body"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"module":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Module"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["method","url","status"],"title":"ApiTraceCreate"},"AppointmentUpdate":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"scheduled_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled At"},"duration_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Min"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","title":"AppointmentUpdate"},"AuthTokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"user":{"$ref":"#/components/schemas/UserPublic"}},"type":"object","required":["access_token","user"],"title":"AuthTokenResponse"},"AutomationCreate":{"properties":{"title":{"type":"string","title":"Title"},"event":{"type":"string","title":"Event"},"template_name":{"type":"string","title":"Template Name"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code","default":"fr"},"variables":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Variables"},"delay_minutes":{"type":"integer","title":"Delay Minutes","default":0},"target":{"type":"string","title":"Target","default":"event_target"},"target_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Phone"},"enabled":{"type":"boolean","title":"Enabled","default":true},"notification_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Notification Email"},"notification_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Phone"}},"type":"object","required":["title","event","template_name"],"title":"AutomationCreate"},"AutomationUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"template_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Name"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"},"variables":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Variables"},"delay_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Delay Minutes"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"},"target_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Phone"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"notification_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Notification Email"},"notification_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notification Phone"}},"type":"object","title":"AutomationUpdate"},"AutopostConfigPayload":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"day_of_week":{"anyOf":[{"type":"integer","maximum":6.0,"minimum":0.0},{"type":"null"}],"title":"Day Of Week"},"hour":{"anyOf":[{"type":"integer","maximum":23.0,"minimum":0.0},{"type":"null"}],"title":"Hour"},"minute":{"anyOf":[{"type":"integer","maximum":59.0,"minimum":0.0},{"type":"null"}],"title":"Minute"},"topic_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Prompt"},"author_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Type"},"organization_urn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Urn"},"validation_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validation Mode"},"validation_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Validation Phone"},"also_post_twitter":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Also Post Twitter"},"also_post_facebook":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Also Post Facebook"}},"type":"object","title":"AutopostConfigPayload"},"AutoreplyConfigPayload":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"allow_phones":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allow Phones"},"deny_phones":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Deny Phones"},"allow_mode":{"anyOf":[{"type":"string","pattern":"^(any|whitelist)$"},{"type":"null"}],"title":"Allow Mode"},"schedule":{"anyOf":[{"type":"string","pattern":"^(always|outside_hours|business_hours)$"},{"type":"null"}],"title":"Schedule"},"keywords":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Keywords"},"cooldown_seconds":{"anyOf":[{"type":"integer","maximum":3600.0,"minimum":0.0},{"type":"null"}],"title":"Cooldown Seconds"},"signature":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Signature"},"unknown_cmd_reply":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Unknown Cmd Reply"},"unknown_cmd_fallback_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Unknown Cmd Fallback Enabled"},"brand_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Brand Name"},"brand_phone":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Brand Phone"},"brand_whatsapp":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Brand Whatsapp"},"brand_email":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Brand Email"},"brand_address":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Brand Address"},"brand_city":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Brand City"},"brand_country":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Brand Country"},"brand_location_hint":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Brand Location Hint"},"brand_latitude":{"anyOf":[{"type":"number","maximum":90.0,"minimum":-90.0},{"type":"null"}],"title":"Brand Latitude"},"brand_longitude":{"anyOf":[{"type":"number","maximum":180.0,"minimum":-180.0},{"type":"null"}],"title":"Brand Longitude"},"brand_hours":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Brand Hours"},"brand_maps_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Brand Maps Url"}},"type":"object","title":"AutoreplyConfigPayload"},"BirdSendPayload":{"properties":{"to":{"type":"string","title":"To"},"text":{"type":"string","title":"Text"},"sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender"}},"type":"object","required":["to","text"],"title":"BirdSendPayload"},"BlacklistedIPCreate":{"properties":{"cidr":{"type":"string","title":"Cidr"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["cidr"],"title":"BlacklistedIPCreate"},"Body_admin_import_csv_api_admin_i18n_translations_import_csv_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_admin_import_csv_api_admin_i18n_translations_import_csv_post"},"Body_admin_import_snapshot_api_admin_snapshots_import_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"mode":{"type":"string","title":"Mode","default":"replace"},"dry_run":{"type":"string","title":"Dry Run","default":"false"},"comment":{"type":"string","title":"Comment","default":""}},"type":"object","required":["file"],"title":"Body_admin_import_snapshot_api_admin_snapshots_import_post"},"Body_admin_upload_api_admin_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_admin_upload_api_admin_upload_post"},"Body_admin_upload_policy_api_admin_policies__slot__upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_admin_upload_policy_api_admin_policies__slot__upload_post"},"Body_admin_upload_sound_api_admin_notification_sounds_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_admin_upload_sound_api_admin_notification_sounds_upload_post"},"Body_admin_vault_import_api_admin_secrets_import_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"password":{"type":"string","title":"Password"},"dry_run":{"type":"string","title":"Dry Run","default":"false"},"overwrite_filled":{"type":"string","title":"Overwrite Filled","default":"false"}},"type":"object","required":["file","password"],"title":"Body_admin_vault_import_api_admin_secrets_import_post"},"Body_apply_catalog_to_employee_api_hr_employees__eid__apply_catalog__cid__post":{"properties":{"amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount"},"bonus_month":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bonus Month"}},"type":"object","title":"Body_apply_catalog_to_employee_api_hr_employees__eid__apply_catalog__cid__post"},"Body_chat_with_image_api_me_liluvine_pro_chat_with_image_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"text":{"type":"string","title":"Text","default":""},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},"type":"object","required":["file"],"title":"Body_chat_with_image_api_me_liluvine_pro_chat_with_image_post"},"Body_clone_voice_api_me_ai_voices_clone_post":{"properties":{"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description","default":""},"audio_file":{"type":"string","format":"binary","title":"Audio File"}},"type":"object","required":["name","audio_file"],"title":"Body_clone_voice_api_me_ai_voices_clone_post"},"Body_edit_image_api_me_ai_edit_image_post":{"properties":{"prompt":{"type":"string","maxLength":2000,"minLength":3,"title":"Prompt"},"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["prompt","file"],"title":"Body_edit_image_api_me_ai_edit_image_post"},"Body_import_csv_api_amm_import_csv_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_import_csv_api_amm_import_csv_post"},"Body_kb_upload_api_admin_liluvine_pro_kb_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"title":{"type":"string","title":"Title"},"force_ocr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Force Ocr"}},"type":"object","required":["file","title"],"title":"Body_kb_upload_api_admin_liluvine_pro_kb_upload_post"},"Body_me_chat_send_photo_api_me_chat__client_id__messages_photo_post":{"properties":{"photo":{"type":"string","format":"binary","title":"Photo"},"recipient_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recipient Id"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption"},"reply_to_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply To Id"}},"type":"object","required":["photo"],"title":"Body_me_chat_send_photo_api_me_chat__client_id__messages_photo_post"},"Body_me_chat_transcribe_api_me_chat_transcribe_post":{"properties":{"audio":{"type":"string","format":"binary","title":"Audio"}},"type":"object","required":["audio"],"title":"Body_me_chat_transcribe_api_me_chat_transcribe_post"},"Body_me_form_upload_file_api_me_forms__form_id__upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_me_form_upload_file_api_me_forms__form_id__upload_post"},"Body_me_media_library_create_api_me_media_library_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"label":{"type":"string","title":"Label","default":""},"target_client_id":{"type":"string","title":"Target Client Id","default":""}},"type":"object","required":["file"],"title":"Body_me_media_library_create_api_me_media_library_post"},"Body_me_upload_api_me_upload_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_me_upload_api_me_upload_post"},"Body_me_upload_contact_photo_api_me_contacts__cid__photo_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_me_upload_contact_photo_api_me_contacts__cid__photo_post"},"Body_me_upload_kyc_api_me_kyc_upload__doc_type__post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_me_upload_kyc_api_me_kyc_upload__doc_type__post"},"Body_me_whatsapp_send_media_api_me_whatsapp_send_media_post":{"properties":{"to":{"type":"string","title":"To"},"contact_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Id"},"tracked_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tracked User Id"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption"},"add_watermark":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Add Watermark"},"add_qr":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Add Qr"},"reply_to_message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply To Message Id"},"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["to","file"],"title":"Body_me_whatsapp_send_media_api_me_whatsapp_send_media_post"},"Body_r_upsert_image_api_admin_qdrant_collections__name__points_image_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"title":{"type":"string","title":"Title","default":""},"caption":{"type":"string","title":"Caption","default":""},"auto_describe":{"type":"string","title":"Auto Describe","default":"auto"}},"type":"object","required":["file"],"title":"Body_r_upsert_image_api_admin_qdrant_collections__name__points_image_post"},"Body_r_upsert_pdf_api_admin_qdrant_collections__name__points_pdf_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_r_upsert_pdf_api_admin_qdrant_collections__name__points_pdf_post"},"Body_transcribe_audio_api_transcribe_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"language":{"type":"string","title":"Language","default":"fr"}},"type":"object","required":["file"],"title":"Body_transcribe_audio_api_transcribe_post"},"Body_upload_api_admin_media_library_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description","default":""},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"public":{"type":"boolean","title":"Public","default":true},"sort_order":{"type":"integer","title":"Sort Order","default":0},"tags":{"type":"string","title":"Tags","default":""}},"type":"object","required":["file","title"],"title":"Body_upload_api_admin_media_library_post"},"BonusPayload":{"properties":{"month":{"type":"string","pattern":"^\\d{4}-\\d{2}$","title":"Month"},"label":{"type":"string","maxLength":120,"minLength":1,"title":"Label"},"amount":{"type":"number","minimum":0.0,"title":"Amount"},"currency":{"type":"string","maxLength":8,"title":"Currency","default":"XOF"},"notes":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Notes"},"catalog_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Catalog Id"}},"type":"object","required":["month","label","amount"],"title":"BonusPayload","description":"Prime variable — rattachée à un mois précis (YYYY-MM). Peut être\nabsente ou présente d'un mois à l'autre."},"BonusUpdate":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Label"},"amount":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Amount"},"currency":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Currency"},"notes":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Notes"}},"type":"object","title":"BonusUpdate"},"BrandingPayload":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Name"},"avatar_url":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Avatar Url"},"color":{"anyOf":[{"type":"string","pattern":"^(fuchsia|violet|indigo|sky|emerald|amber|rose)$"},{"type":"null"}],"title":"Color"},"tagline":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Tagline"}},"type":"object","title":"BrandingPayload"},"BuildLinkRequest":{"properties":{"action":{"type":"string","title":"Action"},"client_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Code"},"username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Username"},"target_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Id"},"ttl_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ttl Seconds"}},"type":"object","required":["action"],"title":"BuildLinkRequest"},"BulkCsvPayload":{"properties":{"csv":{"type":"string","maxLength":200000,"minLength":1,"title":"Csv"},"dry_run":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Dry Run","default":false}},"type":"object","required":["csv"],"title":"BulkCsvPayload"},"BulkIdsPayload":{"properties":{"ids":{"items":{"type":"string"},"type":"array","maxItems":5000,"title":"Ids"}},"type":"object","title":"BulkIdsPayload"},"BulkTransferTrackedRequest":{"properties":{"tracked_user_ids":{"items":{"type":"string"},"type":"array","title":"Tracked User Ids"},"target_client_id":{"type":"string","title":"Target Client Id"}},"type":"object","required":["tracked_user_ids","target_client_id"],"title":"BulkTransferTrackedRequest"},"BusinessClientPayload":{"properties":{"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"legal_form":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Legal Form"},"nif":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Nif"},"ifu":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Ifu"},"rccm":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Rccm"},"phone":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Phone"},"whatsapp":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Whatsapp"},"email":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Email"},"billing_address":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Billing Address"},"shipping_address":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Shipping Address"},"notes":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Notes"},"auto_relance_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Relance Enabled","default":false},"relance_channel":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Relance Channel","default":"whatsapp"}},"type":"object","required":["name"],"title":"BusinessClientPayload"},"BypassPayload":{"properties":{"emails":{"items":{"type":"string"},"type":"array","title":"Emails"}},"type":"object","title":"BypassPayload"},"CampaignCreatePayload":{"properties":{"ad_account_id":{"type":"string","title":"Ad Account Id"},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"objective":{"type":"string","title":"Objective","description":"ex: OUTCOME_TRAFFIC, OUTCOME_LEADS"},"status":{"type":"string","pattern":"^(ACTIVE|PAUSED)$","title":"Status","default":"PAUSED"},"special_ad_categories":{"items":{"type":"string"},"type":"array","title":"Special Ad Categories"}},"type":"object","required":["ad_account_id","name","objective"],"title":"CampaignCreatePayload"},"CampaignStatusPayload":{"properties":{"status":{"type":"string","pattern":"^(ACTIVE|PAUSED|ARCHIVED|DELETED)$","title":"Status"}},"type":"object","required":["status"],"title":"CampaignStatusPayload"},"CatalogTrackPayload":{"properties":{"event_type":{"type":"string","pattern":"^(catalog_view|product_share|product_quote_click|product_og_fetch)$","title":"Event Type"},"product_id":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Product Id"},"product_sku":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Product Sku"},"product_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Product Name"},"referrer":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Referrer"}},"type":"object","required":["event_type"],"title":"CatalogTrackPayload"},"CategoryCreate":{"properties":{"name":{"type":"string","maxLength":60,"minLength":1,"title":"Name"},"color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Color"},"is_default":{"type":"boolean","title":"Is Default","default":false},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","required":["name"],"title":"CategoryCreate"},"CategoryUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":60,"minLength":1},{"type":"null"}],"title":"Name"},"color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Color"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"CategoryUpdate"},"ChangePasswordRequest":{"properties":{"current_password":{"type":"string","title":"Current Password"},"new_password":{"type":"string","title":"New Password"}},"type":"object","required":["current_password","new_password"],"title":"ChangePasswordRequest"},"ChatMessage":{"properties":{"text":{"type":"string","maxLength":8000,"minLength":1,"title":"Text"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},"type":"object","required":["text"],"title":"ChatMessage"},"CheckoutPayload":{"properties":{"amount_xof":{"type":"number","exclusiveMinimum":0.0,"title":"Amount Xof"},"duration_days":{"type":"integer","maximum":730.0,"minimum":1.0,"title":"Duration Days","default":30},"origin_url":{"type":"string","maxLength":500,"minLength":8,"title":"Origin Url"},"contact_email":{"type":"string","maxLength":200,"title":"Contact Email","default":""},"contact_name":{"type":"string","maxLength":120,"title":"Contact Name","default":""}},"type":"object","required":["amount_xof","origin_url"],"title":"CheckoutPayload"},"CheckoutRequest":{"properties":{"quantity":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Quantity","default":1},"coupon_code":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Coupon Code"},"customer_email":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Customer Email"},"customer_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Customer Name"},"return_url":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Return Url"}},"type":"object","title":"CheckoutRequest"},"ClientAppointmentRequest":{"properties":{"subject":{"type":"string","title":"Subject"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"scheduled_at":{"type":"string","title":"Scheduled At"},"duration_min":{"type":"integer","title":"Duration Min","default":30}},"type":"object","required":["subject","scheduled_at"],"title":"ClientAppointmentRequest"},"ClientCategoryCreate":{"properties":{"label":{"type":"string","title":"Label"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"is_default":{"type":"boolean","title":"Is Default","default":false}},"type":"object","required":["label"],"title":"ClientCategoryCreate"},"ClientCategoryUpdate":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"is_default":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Default"}},"type":"object","title":"ClientCategoryUpdate"},"ClientFeaturesUpdate":{"properties":{"whatsapp":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Whatsapp"},"sms":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sms"},"ai":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ai"},"payments":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Payments"},"webhook_returns":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Webhook Returns"},"anon_name":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Anon Name"},"anon_company":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Anon Company"},"anon_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Anon Email"},"anon_phone":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Anon Phone"},"anon_whatsapp":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Anon Whatsapp"},"anon_rapports":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Anon Rapports"},"anon_suivis":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Anon Suivis"},"anon_communications":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Anon Communications"},"wa_sound_alerts":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Wa Sound Alerts"},"internal_chat":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Internal Chat"},"meta_pages":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Meta Pages"},"meta_messenger":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Meta Messenger"},"meta_ads":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Meta Ads"},"ai_image_gen":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ai Image Gen"},"ai_video_gen":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ai Video Gen"},"ai_liluvine_pro":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ai Liluvine Pro"},"ai_voice_gen":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ai Voice Gen"},"kb_ocr_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Kb Ocr Enabled"},"kb_ocr_xof_per_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Kb Ocr Xof Per Page"},"kb_ocr_xof_monthly_cap":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Kb Ocr Xof Monthly Cap"},"kb_ocr_pdf_max_pages":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Kb Ocr Pdf Max Pages"},"tickets_bubble":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Tickets Bubble"},"vidal_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Vidal Enabled"},"vidal_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vidal Mode"},"pawapay_mnos":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Pawapay Mnos"},"pawapay_fix_msisdn":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pawapay Fix Msisdn"}},"type":"object","title":"ClientFeaturesUpdate"},"ClientNoteCreate":{"properties":{"text":{"type":"string","title":"Text"},"voice_note_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Note Url"},"voice_note_transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Note Transcript"}},"type":"object","required":["text"],"title":"ClientNoteCreate"},"ClientTaskCreate":{"properties":{"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"due_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due At"},"remind_via_whatsapp":{"type":"boolean","title":"Remind Via Whatsapp","default":false},"voice_note_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Note Url"},"voice_note_transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Note Transcript"}},"type":"object","required":["title"],"title":"ClientTaskCreate"},"ClientTaskUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"due_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due At"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"remind_via_whatsapp":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Remind Via Whatsapp"},"voice_note_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Note Url"},"voice_note_transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Note Transcript"}},"type":"object","title":"ClientTaskUpdate"},"CommentReplyPayload":{"properties":{"message":{"type":"string","maxLength":8000,"minLength":1,"title":"Message"}},"type":"object","required":["message"],"title":"CommentReplyPayload"},"ContactCreate":{"properties":{"name":{"type":"string","title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"message":{"type":"string","title":"Message"}},"type":"object","required":["name","email","message"],"title":"ContactCreate"},"ContentUpsert":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"body_html":{"type":"string","title":"Body Html","default":""},"images":{"items":{"type":"string"},"type":"array","title":"Images","default":[]},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata","default":{}},"translations":{"additionalProperties":true,"type":"object","title":"Translations","default":{}}},"type":"object","required":["slug","title"],"title":"ContentUpsert"},"CopyPayItemsPayload":{"properties":{"target_employee_id":{"type":"string","minLength":1,"title":"Target Employee Id"},"include_allowances":{"type":"boolean","title":"Include Allowances","default":true},"include_bonuses":{"type":"boolean","title":"Include Bonuses","default":false},"bonus_month":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}$"},{"type":"null"}],"title":"Bonus Month"}},"type":"object","required":["target_employee_id"],"title":"CopyPayItemsPayload","description":"Copy primes/indemnités from src employee to target employee."},"CountryPayload":{"properties":{"code":{"type":"string","maxLength":4,"minLength":2,"title":"Code"},"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"},"dial":{"type":"string","pattern":"^\\+\\d{1,4}$","title":"Dial"},"example":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Example"}},"type":"object","required":["code","name","dial"],"title":"CountryPayload"},"CouponCreate":{"properties":{"code":{"type":"string","maxLength":40,"minLength":2,"title":"Code"},"discount_pct":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":1.0},{"type":"null"}],"title":"Discount Pct"},"discount_xof":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Discount Xof"},"valid_until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Valid Until"},"max_uses":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Max Uses"},"active":{"type":"boolean","title":"Active","default":true}},"type":"object","required":["code"],"title":"CouponCreate"},"CreditTopupRequest":{"properties":{"amount_xof":{"type":"integer","minimum":100.0,"title":"Amount Xof","description":"Montant à créditer en XOF"},"reason":{"type":"string","maxLength":100,"title":"Reason","default":"admin_topup"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["amount_xof"],"title":"CreditTopupRequest"},"CriticalUrlTestRequest":{"properties":{"key":{"type":"string","title":"Key"},"method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Method"}},"type":"object","required":["key"],"title":"CriticalUrlTestRequest"},"CrossTenantImportPayload":{"properties":{"phone":{"type":"string","maxLength":32,"minLength":4,"title":"Phone"},"include_messages":{"type":"boolean","title":"Include Messages","default":false}},"type":"object","required":["phone"],"title":"CrossTenantImportPayload"},"DeploymentCreate":{"properties":{"solution_name":{"type":"string","title":"Solution Name"},"country":{"type":"string","title":"Country"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"installations":{"type":"integer","title":"Installations","default":1},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["solution_name","country"],"title":"DeploymentCreate"},"DeploymentUpdate":{"properties":{"solution_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Solution Name"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"installations":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Installations"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"DeploymentUpdate"},"DirectoryContactCreate":{"properties":{"name":{"type":"string","title":"Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone","default":""},"whatsapp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whatsapp","default":""},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","default":""},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company","default":""},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes","default":""},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags","default":[]},"shared":{"type":"boolean","title":"Shared","default":false},"photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Photo Url"}},"type":"object","required":["name"],"title":"DirectoryContactCreate"},"DirectoryContactUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"whatsapp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whatsapp"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"shared":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Shared"},"photo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Photo Url"}},"type":"object","title":"DirectoryContactUpdate"},"DocumentCategoryCreate":{"properties":{"label":{"type":"string","title":"Label"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"is_default":{"type":"boolean","title":"Is Default","default":false}},"type":"object","required":["label"],"title":"DocumentCategoryCreate"},"DocumentCategoryUpdate":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"icon":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Icon"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"is_default":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Default"}},"type":"object","title":"DocumentCategoryUpdate"},"DocumentCreate":{"properties":{"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"type":"string","title":"Category","default":"documentation"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"file_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Type"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename"},"file_extension":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Extension"},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"is_public":{"type":"boolean","title":"Is Public","default":false},"cover_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Image Url"},"access_client_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Access Client Ids"}},"type":"object","required":["title"],"title":"DocumentCreate"},"DocumentUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"file_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Id"},"file_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Url"},"file_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Type"},"filename":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filename"},"file_extension":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"File Extension"},"body_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body Html"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"is_public":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Public"},"cover_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Image Url"},"access_client_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Access Client Ids"}},"type":"object","title":"DocumentUpdate"},"DownloadRequest":{"properties":{"resource_label":{"type":"string","maxLength":240,"minLength":1,"title":"Resource Label"},"resource_url":{"type":"string","maxLength":2000,"minLength":1,"title":"Resource Url"}},"type":"object","required":["resource_label","resource_url"],"title":"DownloadRequest"},"EmployeePayload":{"properties":{"user_id":{"type":"string","minLength":1,"title":"User Id"},"base_salary":{"type":"number","minimum":0.0,"title":"Base Salary","default":0.0},"pay_type":{"type":"string","pattern":"^(monthly|hourly|fixed)$","title":"Pay Type","default":"monthly"},"currency":{"type":"string","maxLength":8,"title":"Currency","default":"XOF"},"hourly_rate":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Hourly Rate"},"monthly_hours_baseline":{"type":"number","minimum":0.0,"title":"Monthly Hours Baseline","default":160.0},"department":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Department"},"job_title":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Job Title"},"notes":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Notes"},"absence_threshold_hours_override":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Absence Threshold Hours Override"},"tax_overrides":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Tax Overrides"}},"type":"object","required":["user_id"],"title":"EmployeePayload"},"EmployeeUpdate":{"properties":{"base_salary":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Base Salary"},"pay_type":{"anyOf":[{"type":"string","pattern":"^(monthly|hourly|fixed)$"},{"type":"null"}],"title":"Pay Type"},"currency":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Currency"},"hourly_rate":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Hourly Rate"},"monthly_hours_baseline":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Monthly Hours Baseline"},"department":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Department"},"job_title":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Job Title"},"notes":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Notes"},"absence_threshold_hours_override":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Absence Threshold Hours Override"},"tax_overrides":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Tax Overrides"}},"type":"object","title":"EmployeeUpdate"},"ExpenseJustifyPayload":{"properties":{"justification_text":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Justification Text"},"justification_proof_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Justification Proof Url"},"force":{"type":"boolean","title":"Force","default":false}},"type":"object","title":"ExpenseJustifyPayload"},"ExpensePayload":{"properties":{"amount":{"type":"number","exclusiveMinimum":0.0,"title":"Amount"},"currency":{"type":"string","maxLength":8,"title":"Currency","default":"XOF"},"method":{"type":"string","pattern":"^(cash|check)$","title":"Method","default":"cash"},"payee":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Payee"},"motif":{"type":"string","maxLength":500,"minLength":1,"title":"Motif"},"expense_date":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"title":"Expense Date"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"},"attribution_type":{"type":"string","pattern":"^(third_party|employee)$","title":"Attribution Type","default":"third_party"},"employee_id":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Employee Id"}},"type":"object","required":["amount","motif"],"title":"ExpensePayload"},"ExpenseUpdatePayload":{"properties":{"amount":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Amount"},"currency":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Currency"},"method":{"anyOf":[{"type":"string","pattern":"^(cash|check)$"},{"type":"null"}],"title":"Method"},"payee":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Payee"},"motif":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Motif"},"expense_date":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"title":"Expense Date"},"note":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Note"},"attribution_type":{"anyOf":[{"type":"string","pattern":"^(third_party|employee)$"},{"type":"null"}],"title":"Attribution Type"},"employee_id":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Employee Id"}},"type":"object","title":"ExpenseUpdatePayload"},"FacebookConfigPayload":{"properties":{"app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"},"app_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Secret"},"redirect_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Uri"}},"type":"object","title":"FacebookConfigPayload"},"FacebookPostPayload":{"properties":{"text":{"type":"string","title":"Text"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"}},"type":"object","required":["text"],"title":"FacebookPostPayload"},"FavoritePayload":{"properties":{"vidal_id":{"type":"string","maxLength":32,"minLength":1,"title":"Vidal Id","description":"VIDAL numeric code (digits)"},"title":{"type":"string","maxLength":400,"title":"Title","default":""},"type":{"type":"string","maxLength":64,"title":"Type","default":""},"summary":{"type":"string","maxLength":800,"title":"Summary","default":""}},"type":"object","required":["vidal_id"],"title":"FavoritePayload"},"FormCreate":{"properties":{"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","default":""},"is_public":{"type":"boolean","title":"Is Public","default":false},"pages":{"anyOf":[{"items":{"$ref":"#/components/schemas/FormPage"},"type":"array"},{"type":"null"}],"title":"Pages"},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id"},"access_client_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Access Client Ids"}},"type":"object","required":["title"],"title":"FormCreate"},"FormField":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","title":"Type"},"label":{"type":"string","title":"Label"},"required":{"type":"boolean","title":"Required","default":false},"options":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Options"},"placeholder":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Placeholder"},"default_value":{"anyOf":[{},{"type":"null"}],"title":"Default Value"},"col_start":{"type":"integer","title":"Col Start","default":1},"col_span":{"type":"integer","title":"Col Span","default":12},"row":{"type":"integer","title":"Row","default":0},"columns":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Columns"},"accept":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Accept"}},"type":"object","required":["id","type","label"],"title":"FormField"},"FormPage":{"properties":{"id":{"type":"string","title":"Id"},"title":{"type":"string","title":"Title","default":"Page"},"fields":{"items":{"$ref":"#/components/schemas/FormField"},"type":"array","title":"Fields","default":[]}},"type":"object","required":["id"],"title":"FormPage"},"FormUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_public":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Public"},"pages":{"anyOf":[{"items":{"$ref":"#/components/schemas/FormPage"},"type":"array"},{"type":"null"}],"title":"Pages"},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id"},"access_client_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Access Client Ids"}},"type":"object","title":"FormUpdate"},"FormationCreate":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"available":{"type":"boolean","title":"Available","default":true},"access":{"type":"string","title":"Access","default":"free"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"default_credits":{"type":"integer","title":"Default Credits","default":0},"cover_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Image Url"},"access_client_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Access Client Ids"}},"type":"object","required":["name"],"title":"FormationCreate"},"FormationCreditsUpdate":{"properties":{"credits_delta":{"type":"integer","title":"Credits Delta"}},"type":"object","required":["credits_delta"],"title":"FormationCreditsUpdate"},"FormationModuleCreate":{"properties":{"name":{"type":"string","title":"Name"},"order":{"type":"integer","title":"Order","default":0},"screenshot_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screenshot Url"},"software_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Software Path"},"content_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Html","default":""},"api_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Url"},"api_auth_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Auth Type","default":"none"},"api_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Token"},"api_basic_user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Basic User"},"api_basic_pass":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Basic Pass"}},"type":"object","required":["name"],"title":"FormationModuleCreate"},"FormationModuleQuestion":{"properties":{"question":{"type":"string","title":"Question"},"payload":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payload"}},"type":"object","required":["question"],"title":"FormationModuleQuestion"},"FormationModuleUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Order"},"screenshot_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Screenshot Url"},"software_path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Software Path"},"content_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Html"},"api_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Url"},"api_auth_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Auth Type"},"api_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Token"},"api_basic_user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Basic User"},"api_basic_pass":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Basic Pass"}},"type":"object","title":"FormationModuleUpdate"},"FormationStateUpdate":{"properties":{"state":{"type":"string","title":"State"}},"type":"object","required":["state"],"title":"FormationStateUpdate"},"FormationUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"available":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Available"},"access":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Access"},"price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price"},"default_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Default Credits"},"cover_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cover Image Url"},"access_client_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Access Client Ids"}},"type":"object","title":"FormationUpdate"},"GenerateImagePayload":{"properties":{"prompt":{"type":"string","maxLength":2000,"minLength":3,"title":"Prompt"},"aspect":{"type":"string","pattern":"^(square|portrait|landscape)$","title":"Aspect","default":"square"},"icon_mode":{"type":"boolean","title":"Icon Mode","default":false}},"type":"object","required":["prompt"],"title":"GenerateImagePayload"},"GenerateVideoPayload":{"properties":{"prompt":{"type":"string","maxLength":2000,"minLength":3,"title":"Prompt"},"duration":{"type":"integer","title":"Duration","description":"4, 8, or 12 seconds","default":4},"size":{"type":"string","pattern":"^(1280x720|1792x1024|1024x1792|1024x1024)$","title":"Size","default":"1280x720"},"model":{"type":"string","pattern":"^(sora-2|sora-2-pro)$","title":"Model","default":"sora-2"}},"type":"object","required":["prompt"],"title":"GenerateVideoPayload"},"GeocodeBatchPayload":{"properties":{"officine_ids":{"items":{"type":"string"},"type":"array","maxItems":200,"minItems":1,"title":"Officine Ids"},"overwrite_existing":{"type":"boolean","title":"Overwrite Existing","description":"Re-géolocaliser même si lat/lng déjà présents","default":false}},"type":"object","required":["officine_ids"],"title":"GeocodeBatchPayload"},"GroupCreate":{"properties":{"name":{"type":"string","maxLength":80,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":400},{"type":"null"}],"title":"Description"},"color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Color"},"contact_ids":{"items":{"type":"string"},"type":"array","title":"Contact Ids"},"shared_with_tenant":{"type":"boolean","title":"Shared With Tenant","default":false},"editable_by_tenant":{"type":"boolean","title":"Editable By Tenant","default":false}},"type":"object","required":["name"],"title":"GroupCreate"},"GroupUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":80,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":400},{"type":"null"}],"title":"Description"},"color":{"anyOf":[{"type":"string","maxLength":24},{"type":"null"}],"title":"Color"},"shared_with_tenant":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Shared With Tenant"},"editable_by_tenant":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Editable By Tenant"}},"type":"object","title":"GroupUpdate"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HolidayPayload":{"properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","title":"Date"},"label":{"type":"string","maxLength":160,"minLength":1,"title":"Label"},"holiday_type":{"type":"string","pattern":"^(national|religious|local|other)$","title":"Holiday Type","default":"national"},"is_paid":{"type":"boolean","title":"Is Paid","default":true}},"type":"object","required":["date","label"],"title":"HolidayPayload"},"HolidayUpdate":{"properties":{"date":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"title":"Date"},"label":{"anyOf":[{"type":"string","maxLength":160,"minLength":1},{"type":"null"}],"title":"Label"},"holiday_type":{"anyOf":[{"type":"string","pattern":"^(national|religious|local|other)$"},{"type":"null"}],"title":"Holiday Type"},"is_paid":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Paid"}},"type":"object","title":"HolidayUpdate"},"HrSettingsPayload":{"properties":{"absence_threshold_hours":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Absence Threshold Hours"},"payslip_company_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Payslip Company Name"},"payslip_employer_id":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Payslip Employer Id"},"payslip_address":{"anyOf":[{"type":"string","maxLength":400},{"type":"null"}],"title":"Payslip Address"},"payslip_legal_mentions":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Payslip Legal Mentions"},"payslip_footer":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Payslip Footer"}},"type":"object","title":"HrSettingsPayload"},"InboxSendPayload":{"properties":{"channel":{"type":"string","pattern":"^(whatsapp|sms|sms_bird|messenger)$","title":"Channel"},"thread_id":{"type":"string","minLength":1,"title":"Thread Id"},"text":{"type":"string","maxLength":4000,"minLength":1,"title":"Text"},"page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Id"}},"type":"object","required":["channel","thread_id","text"],"title":"InboxSendPayload"},"IncidentSubscribeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"IncidentSubscribeRequest"},"InstagramPostIn":{"properties":{"caption":{"type":"string","maxLength":2200,"title":"Caption","default":""},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"image_urls":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Image Urls"},"video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Url"},"as_story":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"As Story","default":false}},"type":"object","title":"InstagramPostIn"},"InterventionCreate":{"properties":{"client_id":{"type":"string","title":"Client Id"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"type":"string","title":"Status","default":"completed"},"intervention_date":{"type":"string","title":"Intervention Date"},"technician":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Technician"},"duration_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Hours"},"attachments":{"items":{"type":"string"},"type":"array","title":"Attachments","default":[]},"images":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Images"},"voice_note_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Note Url"},"voice_note_transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Note Transcript"},"shared_with_tenant":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Shared With Tenant"},"editable_by_tenant":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Editable By Tenant"}},"type":"object","required":["client_id","title","intervention_date"],"title":"InterventionCreate"},"InterventionInvoicePayload":{"properties":{"intervention_ids":{"items":{"type":"string"},"type":"array","maxItems":500,"title":"Intervention Ids"}},"type":"object","title":"InterventionInvoicePayload"},"InterventionUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"intervention_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Intervention Date"},"technician":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Technician"},"duration_hours":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration Hours"},"attachments":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Attachments"},"images":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Images"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"voice_note_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Note Url"},"voice_note_transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Note Transcript"},"shared_with_tenant":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Shared With Tenant"},"editable_by_tenant":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Editable By Tenant"}},"type":"object","title":"InterventionUpdate"},"IntrantPayload":{"properties":{"name":{"type":"string","title":"Name"},"unit":{"type":"string","title":"Unit","default":"ml"},"unit_cost":{"type":"number","title":"Unit Cost","default":0.0},"category":{"type":"string","title":"Category","default":"raw_material"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["name"],"title":"IntrantPayload"},"InventoryItemIn":{"properties":{"cip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cip"},"product_name":{"type":"string","maxLength":300,"minLength":1,"title":"Product Name"},"lot_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lot Number"},"expiry_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expiry Date"},"quantity":{"type":"integer","minimum":0.0,"title":"Quantity","default":0},"unit_price":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Unit Price"},"currency":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Currency","default":"XOF"},"available":{"type":"boolean","title":"Available","default":true},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["product_name"],"title":"InventoryItemIn"},"InvoiceItemPayload":{"properties":{"product_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product Id"},"label":{"type":"string","maxLength":300,"minLength":1,"title":"Label"},"quantity":{"type":"number","exclusiveMinimum":0.0,"title":"Quantity"},"unit_price_ht":{"type":"number","minimum":0.0,"title":"Unit Price Ht"},"tva_pct":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Tva Pct","default":0},"unit":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Unit"}},"type":"object","required":["label","quantity","unit_price_ht"],"title":"InvoiceItemPayload"},"InvoicePatchPayload":{"properties":{"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"payment_method_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method Id"},"payment_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Reference"}},"type":"object","title":"InvoicePatchPayload","description":"Lifecycle transitions: proforma->invoice, issued->paid, issued->cancelled."},"InvoicePayload":{"properties":{"kind":{"type":"string","title":"Kind","default":"invoice"},"business_client_id":{"type":"string","minLength":1,"title":"Business Client Id"},"billing_address":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Billing Address"},"shipping_address":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Shipping Address"},"items":{"items":{"$ref":"#/components/schemas/InvoiceItemPayload"},"type":"array","maxItems":200,"minItems":1,"title":"Items"},"discount_kind":{"type":"string","title":"Discount Kind","default":"none"},"discount_value":{"type":"number","minimum":0.0,"title":"Discount Value","default":0},"notes":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Notes"},"due_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Due Date"}},"type":"object","required":["business_client_id","items"],"title":"InvoicePayload"},"InvoicePaymentUpdate":{"properties":{"deposited_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deposited At"},"paid_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paid At"},"due_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Due Days"},"clear_deposited_at":{"type":"boolean","title":"Clear Deposited At","default":false},"clear_paid_at":{"type":"boolean","title":"Clear Paid At","default":false}},"type":"object","title":"InvoicePaymentUpdate"},"KbEntryCreate":{"properties":{"title":{"type":"string","maxLength":200,"minLength":1,"title":"Title"},"content":{"type":"string","maxLength":8000,"minLength":1,"title":"Content"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"}},"type":"object","required":["title","content"],"title":"KbEntryCreate"},"KbEntryUpdate":{"properties":{"title":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"null"}],"title":"Title"},"content":{"anyOf":[{"type":"string","maxLength":8000,"minLength":1},{"type":"null"}],"title":"Content"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"type":"object","title":"KbEntryUpdate"},"KycUpdatePayload":{"properties":{"business_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Business Name"},"ifu":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Ifu"},"rccm":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Rccm"},"address":{"anyOf":[{"type":"string","maxLength":400},{"type":"null"}],"title":"Address"},"phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Phone"},"bank_details":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"title":"Bank Details"}},"type":"object","title":"KycUpdatePayload"},"LegalFormPayload":{"properties":{"label":{"type":"string","maxLength":80,"minLength":1,"title":"Label"}},"type":"object","required":["label"],"title":"LegalFormPayload"},"LinkClientIn":{"properties":{"client_email":{"type":"string","format":"email","title":"Client Email"}},"type":"object","required":["client_email"],"title":"LinkClientIn"},"LinkedInConfigPayload":{"properties":{"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"},"redirect_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Uri"},"enable_member":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enable Member"},"enable_organization":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enable Organization"}},"type":"object","title":"LinkedInConfigPayload"},"LinkedInPostIn":{"properties":{"text":{"type":"string","maxLength":3000,"minLength":1,"title":"Text"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"org_urn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Urn"}},"type":"object","required":["text"],"title":"LinkedInPostIn"},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","title":"Password"},"captcha_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Captcha Token"}},"type":"object","required":["email","password"],"title":"LoginRequest"},"LoginResponse":{"properties":{"needs_otp":{"type":"boolean","title":"Needs Otp","default":true},"session_token":{"type":"string","title":"Session Token"},"message":{"type":"string","title":"Message"},"dev_otp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dev Otp"}},"type":"object","required":["session_token","message"],"title":"LoginResponse"},"MagicLinkRequestIn":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"MagicLinkRequestIn"},"MarkQuoteTreatedPayload":{"properties":{"product_id":{"type":"string","maxLength":80,"minLength":1,"title":"Product Id"}},"type":"object","required":["product_id"],"title":"MarkQuoteTreatedPayload"},"MarkSeenRequest":{"properties":{"module":{"type":"string","title":"Module"}},"type":"object","required":["module"],"title":"MarkSeenRequest"},"MeScheduleCreate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"recipients":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Recipients"},"template_name":{"type":"string","title":"Template Name"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code","default":"fr"},"components":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Components"},"variables":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Variables"},"header_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Header Text"},"header_media":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Header Media"},"button_vars":{"anyOf":[{"items":{"items":{"type":"string"},"type":"array"},"type":"array"},{"type":"null"}],"title":"Button Vars"},"button_specs":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Button Specs"},"scheduled_at":{"type":"string","title":"Scheduled At"}},"type":"object","required":["recipients","template_name","scheduled_at"],"title":"MeScheduleCreate"},"MeSmsBulkRequest":{"properties":{"contact_ids":{"items":{"type":"string"},"type":"array","title":"Contact Ids"},"message":{"type":"string","title":"Message"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender"},"scheduled_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled At"}},"type":"object","required":["contact_ids","message"],"title":"MeSmsBulkRequest"},"MeSmsSendRequest":{"properties":{"to":{"type":"string","title":"To"},"message":{"type":"string","title":"Message"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender"},"contact_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Id"}},"type":"object","required":["to","message"],"title":"MeSmsSendRequest"},"MeWaBulkRequest":{"properties":{"contact_ids":{"items":{"type":"string"},"type":"array","title":"Contact Ids"},"template_name":{"type":"string","title":"Template Name"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code","default":"fr"},"variables":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Variables"},"header_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Header Text"},"header_media":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Header Media"},"button_vars":{"anyOf":[{"items":{"items":{"type":"string"},"type":"array"},"type":"array"},{"type":"null"}],"title":"Button Vars"},"button_specs":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Button Specs"},"scheduled_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled At"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"sms_fallback":{"type":"boolean","title":"Sms Fallback","default":false},"sms_fallback_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Fallback Message"},"sms_fallback_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Fallback Provider"},"sms_fallback_sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Fallback Sender"}},"type":"object","required":["contact_ids","template_name"],"title":"MeWaBulkRequest"},"MediaUpdatePayload":{"properties":{"image_url":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"title":"Image Url"},"media_kind":{"anyOf":[{"type":"string","pattern":"^(image|video)$"},{"type":"null"}],"title":"Media Kind"},"target_url":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"title":"Target Url"},"variant_b_image_url":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"title":"Variant B Image Url"},"variant_b_media_kind":{"anyOf":[{"type":"string","pattern":"^(image|video)$"},{"type":"null"}],"title":"Variant B Media Kind"},"variant_b_target_url":{"anyOf":[{"type":"string","maxLength":600},{"type":"null"}],"title":"Variant B Target Url"}},"type":"object","title":"MediaUpdatePayload"},"MeetingCreate":{"properties":{"meeting_date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","title":"Meeting Date"},"started_at":{"type":"string","maxLength":64,"title":"Started At"},"title":{"type":"string","maxLength":240,"minLength":1,"title":"Title"},"body_html":{"type":"string","maxLength":200000,"title":"Body Html","default":""},"attendees":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Attendees"},"signers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Signers"},"participants":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Participants"},"shared_with_tenant":{"type":"boolean","title":"Shared With Tenant","default":false},"editable_by_tenant":{"type":"boolean","title":"Editable By Tenant","default":false}},"type":"object","required":["meeting_date","started_at","title"],"title":"MeetingCreate"},"MeetingUpdate":{"properties":{"meeting_date":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"title":"Meeting Date"},"started_at":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Started At"},"ended_at":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Ended At"},"title":{"anyOf":[{"type":"string","maxLength":240,"minLength":1},{"type":"null"}],"title":"Title"},"body_html":{"anyOf":[{"type":"string","maxLength":200000},{"type":"null"}],"title":"Body Html"},"attendees":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Attendees"},"signers":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Signers"},"participants":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Participants"},"shared_with_tenant":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Shared With Tenant"},"editable_by_tenant":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Editable By Tenant"}},"type":"object","title":"MeetingUpdate"},"MessengerSendPayload":{"properties":{"page_id":{"type":"string","title":"Page Id"},"recipient_id":{"type":"string","title":"Recipient Id"},"text":{"type":"string","maxLength":2000,"minLength":1,"title":"Text"},"quick_replies":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Quick Replies"}},"type":"object","required":["page_id","recipient_id","text"],"title":"MessengerSendPayload"},"MetaConfigUpdate":{"properties":{"meta_app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta App Id"},"meta_app_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta App Secret"},"meta_webhook_verify_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta Webhook Verify Token"},"meta_graph_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta Graph Version"},"meta_redirect_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta Redirect Uri"}},"type":"object","title":"MetaConfigUpdate"},"MetaPostIn":{"properties":{"message":{"type":"string","maxLength":8000,"minLength":1,"title":"Message"},"page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Page Id"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"}},"type":"object","required":["message"],"title":"MetaPostIn"},"NotificationSoundConfig":{"properties":{"preset":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preset","description":"Preset key or 'custom'"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"volume":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Volume"}},"type":"object","title":"NotificationSoundConfig"},"OfficineInventoryWebhookPayload":{"properties":{"officine_id":{"type":"string","title":"Officine Id"},"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","default":"webhook"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["officine_id","items"],"title":"OfficineInventoryWebhookPayload"},"OfficineLookupPayload":{"properties":{"product_name":{"type":"string","title":"Product Name"},"cip_codes":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Cip Codes"},"requester_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requester Role"}},"type":"object","required":["product_name"],"title":"OfficineLookupPayload"},"OfficineRegisterIn":{"properties":{"name":{"type":"string","maxLength":200,"minLength":2,"title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"phone":{"type":"string","maxLength":30,"minLength":6,"title":"Phone"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"linked_client_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Linked Client Email"}},"type":"object","required":["name","email","phone"],"title":"OfficineRegisterIn"},"OfficineRegisterPayload":{"properties":{"officine_name":{"type":"string","title":"Officine Name"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"contact_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Email"},"inventory":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Inventory"}},"type":"object","required":["officine_name","inventory"],"title":"OfficineRegisterPayload"},"OtpRequestIn":{"properties":{"identifier":{"type":"string","title":"Identifier"},"channel":{"type":"string","pattern":"^(wa|sms)$","title":"Channel","default":"wa"}},"type":"object","required":["identifier"],"title":"OtpRequestIn"},"OtpVerifyIn":{"properties":{"identifier":{"type":"string","title":"Identifier"},"code":{"type":"string","maxLength":8,"minLength":4,"title":"Code"}},"type":"object","required":["identifier","code"],"title":"OtpVerifyIn"},"OtpVerifyRequest":{"properties":{"session_token":{"type":"string","title":"Session Token"},"code":{"type":"string","title":"Code"}},"type":"object","required":["session_token","code"],"title":"OtpVerifyRequest"},"PawaPayDepositCreate":{"properties":{"amount":{"type":"number","title":"Amount"},"msisdn":{"type":"string","title":"Msisdn"},"mno":{"type":"string","title":"Mno"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["amount","msisdn","mno"],"title":"PawaPayDepositCreate"},"PawaPayPaymentPageCreate":{"properties":{"amount":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Amount"},"msisdn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Msisdn"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"reason":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Reason"},"return_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Return Url"}},"type":"object","title":"PawaPayPaymentPageCreate"},"PayCatalogItemPayload":{"properties":{"kind":{"type":"string","pattern":"^(allowance|bonus)$","title":"Kind"},"label":{"type":"string","maxLength":120,"minLength":1,"title":"Label"},"default_amount":{"type":"number","minimum":0.0,"title":"Default Amount","default":0},"currency":{"type":"string","maxLength":8,"title":"Currency","default":"XOF"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"}},"type":"object","required":["kind","label"],"title":"PayCatalogItemPayload"},"PayCatalogItemUpdate":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Label"},"default_amount":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Default Amount"},"currency":{"anyOf":[{"type":"string","maxLength":8},{"type":"null"}],"title":"Currency"},"description":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Description"}},"type":"object","title":"PayCatalogItemUpdate"},"PaymentLinkCreate":{"properties":{"label":{"type":"string","title":"Label"},"amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount"},"currency":{"type":"string","title":"Currency","default":"XOF"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"allowed_mnos":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allowed Mnos"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"max_uses":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Uses"}},"type":"object","required":["label"],"title":"PaymentLinkCreate"},"PaymentMethodPayload":{"properties":{"label":{"type":"string","maxLength":80,"minLength":1,"title":"Label"},"kind":{"type":"string","title":"Kind","default":"electronic"},"active":{"type":"boolean","title":"Active","default":true},"sort_order":{"type":"integer","title":"Sort Order","default":0}},"type":"object","required":["label"],"title":"PaymentMethodPayload"},"PayoutCreate":{"properties":{"amount":{"type":"number","exclusiveMinimum":0.0,"title":"Amount"},"msisdn":{"type":"string","maxLength":20,"minLength":8,"title":"Msisdn"},"provider":{"type":"string","maxLength":40,"minLength":3,"title":"Provider"},"customer_message":{"anyOf":[{"type":"string","maxLength":160},{"type":"null"}],"title":"Customer Message"},"related_kind":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Related Kind"},"related_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Related Id"},"country":{"anyOf":[{"type":"string","maxLength":3,"minLength":3},{"type":"null"}],"title":"Country","default":"BFA"}},"type":"object","required":["amount","msisdn","provider"],"title":"PayoutCreate"},"PlanningConfigUpdate":{"properties":{"planning_webhook_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Planning Webhook Secret","description":"Secret du webhook (32 chars)"},"regenerate":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Regenerate","description":"Génère un nouveau secret aléatoire","default":false},"reminder_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reminder Template","description":"Template WA (placeholders {patient}, {medecin}, {start_time}, {motif})"}},"type":"object","title":"PlanningConfigUpdate"},"PrescriptionAnalysisPayload":{"properties":{"patient":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Patient"},"prescriptions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Prescriptions","default":[]},"allergies":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allergies"},"pathologies":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Pathologies"},"xml_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Xml Body"}},"type":"object","title":"PrescriptionAnalysisPayload","description":"Mirror of the VIDAL `/alerts/full` body, simplified.\n\nIter43-fix24y — VIDAL exige du XML pour `/alerts/full`. On accepte deux\nmodes : (a) champs structurés que le backend convertit en XML, ou\n(b) `xml_body` raw que le backend envoie tel quel à VIDAL (utile pour\ncoller la structure exacte du manuel d'intégration VIDAL)."},"ProductCategoryPayload":{"properties":{"label":{"type":"string","maxLength":80,"minLength":1,"title":"Label"}},"type":"object","required":["label"],"title":"ProductCategoryPayload"},"ProductPayload":{"properties":{"sku":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Sku"},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Description"},"category":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}],"title":"Category"},"unit":{"type":"string","maxLength":30,"title":"Unit","default":"pièce"},"unit_price_ht":{"type":"number","minimum":0.0,"title":"Unit Price Ht"},"tva_pct":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Tva Pct","default":0},"stock":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Stock"},"image_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Image Url"},"active":{"type":"boolean","title":"Active","default":true},"is_public":{"type":"boolean","title":"Is Public","default":false}},"type":"object","required":["name","unit_price_ht"],"title":"ProductPayload"},"ProfilePhotoPayload":{"properties":{"prompt":{"type":"string","maxLength":500,"minLength":4,"title":"Prompt"},"style":{"anyOf":[{"type":"string","maxLength":40},{"type":"null"}],"title":"Style","default":"professional"}},"type":"object","required":["prompt"],"title":"ProfilePhotoPayload"},"PublicAppointmentRequest":{"properties":{"name":{"type":"string","title":"Name"},"email":{"type":"string","format":"email","title":"Email"},"phone":{"type":"string","title":"Phone"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"subject":{"type":"string","title":"Subject"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"scheduled_at":{"type":"string","title":"Scheduled At"},"duration_min":{"type":"integer","title":"Duration Min","default":30}},"type":"object","required":["name","email","phone","subject","scheduled_at"],"title":"PublicAppointmentRequest"},"PublicPayRequest":{"properties":{"msisdn":{"type":"string","title":"Msisdn"},"mno":{"type":"string","title":"Mno"},"amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount"},"payer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payer Name"}},"type":"object","required":["msisdn","mno"],"title":"PublicPayRequest"},"PublicSubmissionRequest":{"properties":{"data":{"additionalProperties":true,"type":"object","title":"Data"},"geo":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Geo"},"respondent_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Respondent Name"},"respondent_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Respondent Email"}},"type":"object","required":["data"],"title":"PublicSubmissionRequest"},"PublishRequest":{"properties":{"targets":{"items":{"$ref":"#/components/schemas/PublishTarget"},"type":"array","title":"Targets"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption"},"mode":{"type":"string","title":"Mode","default":"immediate"},"scheduled_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scheduled At"}},"type":"object","title":"PublishRequest"},"PublishTarget":{"properties":{"social_account_id":{"type":"string","title":"Social Account Id"},"page_id":{"type":"string","title":"Page Id"},"target":{"type":"string","title":"Target"}},"type":"object","required":["social_account_id","page_id","target"],"title":"PublishTarget"},"PurgePayload":{"properties":{"from_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From Date"},"to_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To Date"},"code_client":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code Client"}},"type":"object","title":"PurgePayload"},"QueryParam":{"properties":{"key":{"type":"string","title":"Key"},"value_template":{"type":"string","title":"Value Template","default":""},"required":{"type":"boolean","title":"Required","default":false}},"type":"object","required":["key"],"title":"QueryParam"},"QuickTicketPayload":{"properties":{"client_id":{"type":"string","title":"Client Id"},"reason":{"type":"string","title":"Reason"},"contact_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Name"},"contact_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Phone"},"contact_whatsapp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Whatsapp"},"incident_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incident At"},"software":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Software"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"attach_wa_sms_history":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Attach Wa Sms History","default":false},"shared_with_tenant":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Shared With Tenant"},"editable_by_tenant":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Editable By Tenant"}},"type":"object","required":["client_id","reason"],"title":"QuickTicketPayload"},"QuotaConfig":{"properties":{"mode":{"type":"string","enum":["off","quota","budget"],"title":"Mode","default":"off"},"currency":{"type":"string","title":"Currency","default":"XOF"},"monthly_images":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Monthly Images"},"monthly_videos":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Monthly Videos"},"monthly_transcription_minutes":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Monthly Transcription Minutes"},"monthly_chat_tokens":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Monthly Chat Tokens"},"monthly_budget_xof":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Monthly Budget Xof"},"alert_warn_pct":{"type":"integer","maximum":99.0,"minimum":1.0,"title":"Alert Warn Pct","default":80},"block_on_limit":{"type":"boolean","title":"Block On Limit","default":true},"cost_per_image_xof":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Cost Per Image Xof"},"cost_per_video_xof":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Cost Per Video Xof"},"cost_per_transcription_minute_xof":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Cost Per Transcription Minute Xof"},"cost_per_1k_tokens_xof":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Cost Per 1K Tokens Xof"}},"type":"object","title":"QuotaConfig"},"RatingCreate":{"properties":{"stars":{"type":"integer","title":"Stars"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"}},"type":"object","required":["stars"],"title":"RatingCreate"},"ReactionsConfigUpdate":{"properties":{"fuzzy_match_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Fuzzy Match Enabled"},"fuzzy_threshold":{"anyOf":[{"type":"integer","maximum":95.0,"minimum":50.0},{"type":"null"}],"title":"Fuzzy Threshold"},"auto_add_new_contacts":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Add New Contacts"},"default_new_contact_group_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default New Contact Group Id"},"correction_prefix_text":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Correction Prefix Text"},"unmatched_capture_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Unmatched Capture Enabled"}},"type":"object","title":"ReactionsConfigUpdate"},"ReceiptPayload":{"properties":{"business_client_id":{"type":"string","minLength":1,"title":"Business Client Id"},"beneficiary_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Beneficiary Name"},"amount":{"type":"number","exclusiveMinimum":0.0,"title":"Amount"},"motif":{"type":"string","maxLength":500,"minLength":1,"title":"Motif"},"payment_method_id":{"type":"string","minLength":1,"title":"Payment Method Id"},"payment_reference":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Payment Reference"},"related_invoice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Related Invoice Id"}},"type":"object","required":["business_client_id","amount","motif","payment_method_id"],"title":"ReceiptPayload"},"RecipeIntrantIn":{"properties":{"intrant_id":{"type":"string","title":"Intrant Id"},"quantity":{"type":"number","title":"Quantity","default":0.0}},"type":"object","required":["intrant_id"],"title":"RecipeIntrantIn"},"RecipePayload":{"properties":{"name":{"type":"string","title":"Name"},"variant_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variant Label"},"dosage_number":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dosage Number"},"dosage_unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dosage Unit","default":"ml"},"output_batch_units":{"type":"number","title":"Output Batch Units","default":1.0},"output_unit_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Unit Label","default":"unit"},"intrants":{"items":{"$ref":"#/components/schemas/RecipeIntrantIn"},"type":"array","title":"Intrants"},"pricing_mode":{"type":"string","title":"Pricing Mode","default":"margin_first"},"margin_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Margin Pct"},"public_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Public Price"},"catalog_product_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Catalog Product Id"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["name"],"title":"RecipePayload"},"RemoteSupportUpdate":{"properties":{"level":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Level"},"threshold":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Threshold"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"}},"type":"object","title":"RemoteSupportUpdate"},"RenameSession":{"properties":{"title":{"type":"string","maxLength":120,"minLength":1,"title":"Title"}},"type":"object","required":["title"],"title":"RenameSession"},"RenewRequestPayload":{"properties":{"contact_name":{"type":"string","maxLength":120,"title":"Contact Name","default":""},"contact_email":{"type":"string","maxLength":200,"title":"Contact Email","default":""},"contact_phone":{"type":"string","maxLength":40,"title":"Contact Phone","default":""},"new_budget":{"type":"number","minimum":0.0,"title":"New Budget","default":0},"target_duration_days":{"type":"integer","maximum":730.0,"minimum":0.0,"title":"Target Duration Days","default":0},"message":{"type":"string","maxLength":2000,"title":"Message","default":""}},"type":"object","title":"RenewRequestPayload"},"ResolvePayload":{"properties":{"group_ids":{"items":{"type":"string"},"type":"array","title":"Group Ids"},"contact_ids":{"items":{"type":"string"},"type":"array","title":"Contact Ids"}},"type":"object","title":"ResolvePayload"},"SaveContactAsTrackedUser":{"properties":{"client_id":{"type":"string","title":"Client Id"},"role":{"type":"string","title":"Role","default":"Consultation"},"department":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department"}},"type":"object","required":["client_id"],"title":"SaveContactAsTrackedUser"},"SaveToLibraryRequest":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"}},"type":"object","title":"SaveToLibraryRequest"},"SendMessagePayload":{"properties":{"text":{"type":"string","maxLength":2000,"minLength":1,"title":"Text"},"recipient_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recipient Id"},"reply_to_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply To Id"}},"type":"object","required":["text"],"title":"SendMessagePayload"},"SettingsPayload":{"properties":{"production_default_margin_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Production Default Margin Pct"}},"type":"object","title":"SettingsPayload"},"SettingsUpdate":{"properties":{"recaptcha_site_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recaptcha Site Key"},"recaptcha_secret_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recaptcha Secret Key"},"recaptcha_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Recaptcha Enabled"},"public_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Base Url"},"liluvine_takeover_default_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Liluvine Takeover Default Minutes"},"auto_logout_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Logout Minutes"},"modal_global_cap_per_day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Modal Global Cap Per Day"},"global_route_loader_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Global Route Loader Enabled"},"public_brand_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Brand Name"},"public_brand_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Brand Color"},"public_brand_text_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Brand Text Color"},"public_logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Logo Url"},"public_hero_tagline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Hero Tagline"},"public_bg_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Bg Mode"},"public_bg_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Bg Color"},"public_bg_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Bg Image Url"},"public_bg_image_position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Bg Image Position"},"portal_bg_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Portal Bg Mode"},"portal_bg_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Portal Bg Color"},"portal_bg_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Portal Bg Image Url"},"portal_bg_image_position":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Portal Bg Image Position"},"wa_silent_phones_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Wa Silent Phones Enabled"},"wa_silent_phones":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Wa Silent Phones"},"officines_menu_allowed_emails":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Officines Menu Allowed Emails"},"errors_webhook_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Errors Webhook Token"},"default_intervention_hourly_rate_xof":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Default Intervention Hourly Rate Xof"},"error_severity_mapping":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Error Severity Mapping"},"sidebar_bg_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sidebar Bg Color"},"sidebar_text_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sidebar Text Color"},"sidebar_accent_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sidebar Accent Color"},"login_bg_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Login Bg Mode"},"login_bg_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Login Bg Color"},"login_bg_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Login Bg Image Url"},"login_text_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Login Text Color"},"login_card_bg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Login Card Bg"},"login_card_text_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Login Card Text Color"},"login_button_bg":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Login Button Bg"},"login_button_text_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Login Button Text Color"},"public_blocks_theme":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Public Blocks Theme"},"download_approval_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Download Approval Enabled"},"download_approval_whatsapp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Approval Whatsapp"},"download_pending_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Pending Message"},"download_approval_template_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Approval Template Name"},"download_approval_template_lang":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Approval Template Lang"},"download_approval_text_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Download Approval Text Body"},"meeting_signers_notify_channel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meeting Signers Notify Channel"},"llm_budget_warning_pct":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Llm Budget Warning Pct"},"llm_budget_critical_pct":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Llm Budget Critical Pct"},"llm_budget_max_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Llm Budget Max Usd"},"llm_budget_notify_email":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Llm Budget Notify Email"},"llm_budget_notify_wa":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Llm Budget Notify Wa"},"llm_budget_notify_wa_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Budget Notify Wa Phone"},"llm_budget_wa_query_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Llm Budget Wa Query Enabled"},"llm_budget_wa_query_keyword":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Budget Wa Query Keyword"},"llm_alerts_muted_until":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Llm Alerts Muted Until"},"liluvine_escalation_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Liluvine Escalation Enabled"},"liluvine_escalation_wa_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Liluvine Escalation Wa Phone"},"liluvine_escalation_cooldown_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Liluvine Escalation Cooldown Minutes"},"qdrant_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Qdrant Enabled"},"qdrant_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qdrant Url"},"qdrant_api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qdrant Api Key"},"qdrant_collection_settings":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Qdrant Collection Settings"},"qdrant_image_auto_describe":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Qdrant Image Auto Describe"},"health_weekly_send_from_preview":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Health Weekly Send From Preview"},"stripe_webhook_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Webhook Secret"},"alexa_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Alexa Enabled"},"alexa_webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Alexa Webhook Url"},"alexa_events":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Alexa Events"},"secret_audit_email_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Secret Audit Email Enabled"},"secret_audit_email_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret Audit Email To"},"sms_orange_unit_cost_xof":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sms Orange Unit Cost Xof"},"sms_moov_unit_cost_xof":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sms Moov Unit Cost Xof"},"sms_telecel_unit_cost_xof":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sms Telecel Unit Cost Xof"},"sms_ovh_unit_cost_xof":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sms Ovh Unit Cost Xof"},"sms_monthly_budget_xof":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sms Monthly Budget Xof"},"wa_template_note_service":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Template Note Service"},"wa_template_note_service_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Template Note Service Language"},"auto_snapshot_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Snapshot Enabled"},"auto_snapshot_keep":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Snapshot Keep"},"auto_snapshot_email_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Snapshot Email Enabled"},"auto_snapshot_email_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auto Snapshot Email To"},"support_load_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Support Load Enabled"},"support_load_level":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Support Load Level"},"support_load_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Support Load Label"},"support_load_webhook_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Support Load Webhook Secret"},"liluvine_alert_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Liluvine Alert Enabled"},"liluvine_alert_threshold":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Liluvine Alert Threshold"},"liluvine_alert_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Liluvine Alert Message"},"liluvine_alert_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Liluvine Alert Label"},"liluvine_remote_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Liluvine Remote Secret"},"liluvine_remote_admin_phones":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Liluvine Remote Admin Phones"},"smtp_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Smtp Host"},"smtp_port":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Smtp Port"},"smtp_user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Smtp User"},"smtp_password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Smtp Password"},"smtp_from_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Smtp From Email"},"smtp_from_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Smtp From Name"},"smtp_use_tls":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Smtp Use Tls"},"kb_ocr_xof_per_page":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Kb Ocr Xof Per Page"},"kb_ocr_xof_monthly_cap":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Kb Ocr Xof Monthly Cap"},"kb_ocr_pdf_max_pages":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Kb Ocr Pdf Max Pages"},"notes_strict_tasks_only":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notes Strict Tasks Only"},"wa_tasks_digest_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Wa Tasks Digest Enabled"},"liluvine_weekly_digest_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Liluvine Weekly Digest Enabled"},"gdpr_auto_anonymize_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Gdpr Auto Anonymize Enabled"},"gdpr_contact_inactive_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Gdpr Contact Inactive Months"},"gdpr_msg_retention_months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Gdpr Msg Retention Months"},"gdpr_log_retention_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Gdpr Log Retention Days"},"google_client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Google Client Id"},"google_client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Google Client Secret"},"google_calendar_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Google Calendar Email"},"google_calendar_password_hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Google Calendar Password Hint"},"business_open_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Open Time"},"business_close_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Close Time"},"descent_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Descent Time"},"business_days":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Business Days"},"slot_duration_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Slot Duration Min"},"company_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Email"},"company_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Phone"},"company_whatsapp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Whatsapp"},"company_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Address"},"company_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company City"},"company_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Country"},"tracking_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Tracking Enabled"},"tracking_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tracking Base Url"},"tracking_endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tracking Endpoint"},"tracking_auth_header":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tracking Auth Header"},"webhook_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Webhook Enabled"},"webhook_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Base Url"},"webhook_auth_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Auth Type"},"webhook_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Token"},"webhook_basic_user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Basic User"},"webhook_basic_pass":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Basic Pass"},"hero_video_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hero Video Enabled"},"hero_video_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hero Video Url"},"hero_video_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hero Video Title"},"hero_video_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hero Video Description"},"hero_video_autoplay":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hero Video Autoplay"},"hero_video_loop":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hero Video Loop"},"hero_video_muted":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Hero Video Muted"},"hero_video_poster_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hero Video Poster Url"},"assistant_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Assistant Enabled"},"assistant_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assistant Url"},"assistant_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assistant Label"},"assistant_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assistant Color"},"show_reports_button":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Reports Button"},"show_suivis_button":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Suivis Button"},"notes_webhook_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notes Webhook Enabled"},"notes_webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes Webhook Url"},"notes_webhook_auth_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes Webhook Auth Type"},"notes_webhook_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes Webhook Token"},"notes_webhook_basic_user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes Webhook Basic User"},"notes_webhook_basic_pass":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes Webhook Basic Pass"},"visits_counter_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Visits Counter Enabled"},"visits_counter_offset":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Visits Counter Offset"},"health_realtime_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Health Realtime Enabled"},"health_weekly_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Health Weekly Enabled"},"health_auth_check_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Health Auth Check Enabled"},"health_uptime_alerts_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Health Uptime Alerts Enabled"},"welcome_unread_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Welcome Unread Mode"},"wa_template_receipt_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Template Receipt Name"},"wa_template_receipt_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Template Receipt Language"},"wa_template_invoice_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Template Invoice Name"},"wa_template_invoice_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Template Invoice Language"},"expense_justification_deadline_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expense Justification Deadline Hours"},"incident_banner_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Incident Banner Enabled"},"incident_banner_severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incident Banner Severity"},"incident_banner_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incident Banner Message"},"incident_banner_link_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incident Banner Link Url"},"incident_banner_link_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incident Banner Link Label"},"wa_business_account_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Business Account Id"},"wa_phone_number_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Phone Number Id"},"wa_access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Access Token"},"wa_app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa App Id"},"wa_verify_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Verify Token"},"wa_default_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Default Language"},"wa_silence_alert_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Wa Silence Alert Enabled"},"wa_silence_alert_threshold":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Wa Silence Alert Threshold"},"wa_silence_alert_window_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Wa Silence Alert Window Hours"},"wa_silence_alert_email_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Silence Alert Email To"},"wa_silence_alert_discord_webhook":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Silence Alert Discord Webhook"},"wa_allow_terminal_media":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Wa Allow Terminal Media"},"wa_voice_transcribe_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Wa Voice Transcribe Enabled"},"wa_watermark_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Wa Watermark Enabled"},"wa_watermark_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Watermark Text"},"wa_qr_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Wa Qr Enabled"},"wa_qr_payload":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Qr Payload"},"wa_template_ticket_open":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Template Ticket Open"},"wa_template_ticket_close":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Template Ticket Close"},"wa_template_ticket_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Template Ticket Language"},"notify_on_ticket_open":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify On Ticket Open"},"notify_on_ticket_close":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify On Ticket Close"},"wa_otp_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Otp Template"},"wa_otp_template_lang":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Otp Template Lang"},"officine_otp_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Officine Otp Template"},"officine_otp_template_lang":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Officine Otp Template Lang"},"officine_otp_template_category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Officine Otp Template Category"},"amm_default_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amm Default Country"},"incidents_webhook_password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incidents Webhook Password"},"incidents_webhook_rotated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incidents Webhook Rotated At"},"incidents_webhook_rotated_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incidents Webhook Rotated By"},"public_app_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public App Url"},"welcome_modal_notes_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Welcome Modal Notes Days"},"health_webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Health Webhook Url"},"health_webhook_auth_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Health Webhook Auth Type"},"health_webhook_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Health Webhook Token"},"health_webhook_basic_user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Health Webhook Basic User"},"health_webhook_basic_pass":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Health Webhook Basic Pass"},"health_email_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Health Email To"},"health_timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Health Timezone"},"contract_overdue_days_default":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Contract Overdue Days Default"},"openai_api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Openai Api Key"},"openai_whisper_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Openai Whisper Model"},"ai_summary_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ai Summary Provider"},"openai_chat_api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Openai Chat Api Key"},"openai_chat_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Openai Chat Model"},"n8n_webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"N8N Webhook Url"},"n8n_webhook_auth_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"N8N Webhook Auth Type"},"n8n_webhook_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"N8N Webhook Token"},"n8n_webhook_basic_user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"N8N Webhook Basic User"},"n8n_webhook_basic_pass":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"N8N Webhook Basic Pass"},"sms_orange_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sms Orange Enabled"},"sms_orange_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Orange Url"},"sms_orange_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Orange Method"},"sms_orange_auth_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Orange Auth Type"},"sms_orange_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Orange Token"},"sms_orange_basic_user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Orange Basic User"},"sms_orange_basic_pass":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Orange Basic Pass"},"sms_orange_header_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Orange Header Name"},"sms_orange_header_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Orange Header Value"},"sms_orange_sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Orange Sender"},"sms_orange_payload_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Orange Payload Template"},"sms_orange_content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Orange Content Type"},"sms_orange_oauth_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Orange Oauth Url"},"sms_orange_client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Orange Client Id"},"sms_orange_client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Orange Client Secret"},"sms_orange_sender_msisdn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Orange Sender Msisdn"},"sms_moov_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sms Moov Enabled"},"sms_moov_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Moov Url"},"sms_moov_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Moov Method"},"sms_moov_auth_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Moov Auth Type"},"sms_moov_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Moov Token"},"sms_moov_basic_user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Moov Basic User"},"sms_moov_basic_pass":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Moov Basic Pass"},"sms_moov_header_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Moov Header Name"},"sms_moov_header_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Moov Header Value"},"sms_moov_sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Moov Sender"},"sms_moov_payload_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Moov Payload Template"},"sms_moov_content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Moov Content Type"},"sms_moov_oauth_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Moov Oauth Url"},"sms_moov_client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Moov Client Id"},"sms_moov_client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Moov Client Secret"},"sms_moov_sender_msisdn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Moov Sender Msisdn"},"sms_telecel_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sms Telecel Enabled"},"sms_telecel_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Telecel Url"},"sms_telecel_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Telecel Method"},"sms_telecel_auth_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Telecel Auth Type"},"sms_telecel_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Telecel Token"},"sms_telecel_basic_user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Telecel Basic User"},"sms_telecel_basic_pass":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Telecel Basic Pass"},"sms_telecel_header_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Telecel Header Name"},"sms_telecel_header_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Telecel Header Value"},"sms_telecel_sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Telecel Sender"},"sms_telecel_payload_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Telecel Payload Template"},"sms_telecel_content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Telecel Content Type"},"sms_telecel_oauth_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Telecel Oauth Url"},"sms_telecel_client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Telecel Client Id"},"sms_telecel_client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Telecel Client Secret"},"sms_telecel_sender_msisdn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Telecel Sender Msisdn"},"sms_default_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Default Provider"},"sms_ovh_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sms Ovh Enabled"},"sms_ovh_endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Ovh Endpoint"},"sms_ovh_application_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Ovh Application Key"},"sms_ovh_application_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Ovh Application Secret"},"sms_ovh_consumer_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Ovh Consumer Key"},"sms_ovh_service_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Ovh Service Name"},"sms_ovh_sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sms Ovh Sender"},"pawapay_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pawapay Enabled"},"pawapay_api_token_sandbox":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pawapay Api Token Sandbox"},"pawapay_api_token_production":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pawapay Api Token Production"},"pawapay_environment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pawapay Environment"},"pawapay_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pawapay Country"},"pawapay_callback_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pawapay Callback Secret"},"pawapay_api_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pawapay Api Token"},"vidal_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Vidal Enabled"},"vidal_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vidal Mode"},"vidal_test_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vidal Test Base Url"},"vidal_test_app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vidal Test App Id"},"vidal_test_app_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vidal Test App Key"},"vidal_prod_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vidal Prod Base Url"},"vidal_prod_app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vidal Prod App Id"},"vidal_prod_app_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vidal Prod App Key"},"vidal_cache_ttl_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Vidal Cache Ttl Hours"},"vidal_quota_per_user_per_day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Vidal Quota Per User Per Day"},"vidal_http_timeout":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Vidal Http Timeout"},"synthese_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Synthese Enabled"},"synthese_email_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Synthese Email To"},"synthese_wa_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Synthese Wa To"},"synthese_hour":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Synthese Hour"},"synthese_prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Synthese Prompt"},"synthese_channels":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Synthese Channels"},"officines_api_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Officines Api Url"},"officines_api_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Officines Api Token"},"officines_api_timeout":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Officines Api Timeout"},"officines_public_quota_per_day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Officines Public Quota Per Day"},"sidebar_bg_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sidebar Bg Image Url"},"sidebar_bg_image_opacity":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sidebar Bg Image Opacity"},"officines_register_hmac_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Officines Register Hmac Secret"},"agenda_n8n_outbound_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Agenda N8N Outbound Enabled"},"agenda_n8n_outbound_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda N8N Outbound Url"},"agenda_n8n_outbound_auth_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda N8N Outbound Auth Type"},"agenda_n8n_outbound_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda N8N Outbound Token"},"agenda_n8n_outbound_basic_user":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda N8N Outbound Basic User"},"agenda_n8n_outbound_basic_pass":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda N8N Outbound Basic Pass"},"agenda_n8n_inbound_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Agenda N8N Inbound Enabled"},"agenda_n8n_inbound_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agenda N8N Inbound Secret"},"internal_domains":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Internal Domains"},"contacts_require_tag":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Contacts Require Tag"},"version_stamp_color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Stamp Color"},"version_stamp_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Stamp Size"},"version_stamp_opacity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version Stamp Opacity"},"version_stamp_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version Stamp Style"},"auto_relance_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Relance Enabled"},"auto_relance_day_of_week":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Relance Day Of Week"},"auto_relance_grace_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Auto Relance Grace Days"},"auto_relance_email_report_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Auto Relance Email Report To"},"weather_widget_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Weather Widget Enabled"},"weather_widget_show_public":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Weather Widget Show Public"},"weather_widget_show_portal":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Weather Widget Show Portal"},"weather_widget_default_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Weather Widget Default City"},"weather_widget_default_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Weather Widget Default Country"},"bird_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Bird Enabled"},"bird_api_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bird Api Base Url"},"bird_workspace_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bird Workspace Id"},"bird_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bird Channel Id"},"bird_access_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bird Access Key"},"bird_webhook_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bird Webhook Secret"},"bird_default_sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bird Default Sender"},"bird_signature":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bird Signature"},"bird_use_liluvine":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Bird Use Liluvine"},"bird_cost_per_sms_xof":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Bird Cost Per Sms Xof"},"bird_cost_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bird Cost Currency"},"officines_inventory_webhook_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Officines Inventory Webhook Token"},"garde_reply_header":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Garde Reply Header"},"garde_reply_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Garde Reply Template"},"garde_reply_footer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Garde Reply Footer"},"garde_reply_site_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Garde Reply Site Url"},"garde_reply_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Garde Reply Image Url"},"garde_reply_image_caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Garde Reply Image Caption"},"integration_health_alerts_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Integration Health Alerts Enabled"},"integration_health_alert_wa_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Integration Health Alert Wa Phone"},"wa_default_cmd_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Default Cmd Image Url"},"wa_default_cmd_image_caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Default Cmd Image Caption"},"garde_page_header":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Garde Page Header"},"garde_page_footer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Garde Page Footer"},"garde_page_image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Garde Page Image Url"},"garde_page_image_caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Garde Page Image Caption"},"garde_rotation_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Garde Rotation Mode"},"google_maps_api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Google Maps Api Key"},"geocode_country_bias":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Geocode Country Bias"},"production_default_margin_pct":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Production Default Margin Pct"}},"additionalProperties":true,"type":"object","title":"SettingsUpdate"},"SmartCommUpdatePayload":{"properties":{"wa_waba_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Waba Id"},"wa_phone_number_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Phone Number Id"},"wa_access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Access Token"},"wa_verify_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Verify Token"},"meta_app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta App Id"},"meta_app_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta App Secret"},"meta_page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta Page Id"},"meta_page_access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Meta Page Access Token"},"instagram_business_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instagram Business Id"},"instagram_access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instagram Access Token"},"x_api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X Api Key"},"x_api_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X Api Secret"},"x_access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X Access Token"},"x_access_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X Access Secret"},"tiktok_client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tiktok Client Id"},"tiktok_client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tiktok Client Secret"},"tiktok_access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tiktok Access Token"},"linkedin_client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Client Id"},"linkedin_client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Client Secret"},"linkedin_access_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Access Token"},"linkedin_organization_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linkedin Organization Id"}},"type":"object","title":"SmartCommUpdatePayload","description":"All fields optional — tenant can partially fill.\nQ3=b : this configuration is a strict OVERRIDE. If empty, the tenant has NO\noutbound communications (no fallback on the global admin settings)."},"SocialAccountManualToken":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"provider":{"type":"string","title":"Provider"},"account_id":{"type":"string","title":"Account Id"},"account_label":{"type":"string","title":"Account Label"},"access_token":{"type":"string","title":"Access Token"},"extra":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Extra"}},"type":"object","required":["tenant_id","provider","account_id","account_label","access_token"],"title":"SocialAccountManualToken","description":"Saisie manuelle d'un token (mode dev, en attendant OAuth flow)."},"StoryAssetUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"}},"type":"object","title":"StoryAssetUpdate"},"StoryGenerateImage":{"properties":{"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"prompt":{"type":"string","maxLength":2000,"minLength":5,"title":"Prompt"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"type":"object","required":["prompt"],"title":"StoryGenerateImage","description":"Génération image (Nano Banana) - format Story 1080x1920."},"StoryGenerateText2Video":{"properties":{"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id"},"engine":{"type":"string","title":"Engine","description":"'sora-2', 'sora-2-pro' ou 'fal'"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"prompt":{"type":"string","maxLength":2000,"minLength":5,"title":"Prompt"},"duration_seconds":{"type":"integer","title":"Duration Seconds","default":8},"size":{"type":"string","title":"Size","default":"1024x1792"},"generate_audio":{"type":"boolean","title":"Generate Audio","default":false},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},"type":"object","required":["engine","prompt"],"title":"StoryGenerateText2Video","description":"Génération vidéo à partir d'un prompt texte."},"StripeCheckoutPayload":{"properties":{"origin_url":{"type":"string","maxLength":500,"minLength":8,"title":"Origin Url"}},"type":"object","required":["origin_url"],"title":"StripeCheckoutPayload"},"SubmissionSave":{"properties":{"data":{"additionalProperties":true,"type":"object","title":"Data"},"geo":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Geo"}},"type":"object","required":["data"],"title":"SubmissionSave"},"SubscriptionCategoryCreate":{"properties":{"label":{"type":"string","title":"Label"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color","default":"#0D6EFD"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position","default":0},"animated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Animated","default":true}},"type":"object","required":["label"],"title":"SubscriptionCategoryCreate"},"SubscriptionCategoryUpdate":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"color":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Color"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"},"animated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Animated"}},"type":"object","title":"SubscriptionCategoryUpdate"},"SubscriptionOrderCreate":{"properties":{"plan_id":{"type":"string","title":"Plan Id"},"period":{"type":"string","title":"Period"},"customer_name":{"type":"string","title":"Customer Name"},"customer_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Email","default":""},"customer_phone":{"type":"string","title":"Customer Phone"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","default":""}},"type":"object","required":["plan_id","period","customer_name","customer_phone"],"title":"SubscriptionOrderCreate"},"SubscriptionPayload":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"active":{"type":"boolean","title":"Active","default":true},"monthly_cost":{"type":"number","minimum":0.0,"title":"Monthly Cost","default":0},"currency":{"type":"string","maxLength":8,"minLength":2,"title":"Currency","default":"USD"},"subscription_date":{"type":"string","maxLength":10,"minLength":10,"title":"Subscription Date"},"period_days":{"type":"integer","maximum":365.0,"minimum":1.0,"title":"Period Days","default":30},"reminder_days_before":{"type":"integer","maximum":90.0,"minimum":0.0,"title":"Reminder Days Before","default":5},"notify_email":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Notify Email"},"notify_whatsapp":{"anyOf":[{"type":"string","maxLength":30},{"type":"null"}],"title":"Notify Whatsapp"},"notes":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Notes","default":""}},"type":"object","required":["name","subscription_date"],"title":"SubscriptionPayload"},"SubscriptionPlanCreate":{"properties":{"name":{"type":"string","title":"Name"},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","default":""},"price_monthly_xof":{"type":"integer","title":"Price Monthly Xof","default":0},"price_annual_xof":{"type":"integer","title":"Price Annual Xof","default":0},"featured":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Featured","default":false},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active","default":true},"automation_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Automation Url","default":""},"whatsapp_notify_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whatsapp Notify To","default":""}},"type":"object","required":["name"],"title":"SubscriptionPlanCreate"},"SubscriptionPlanUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"category_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"price_monthly_xof":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Monthly Xof"},"price_annual_xof":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Price Annual Xof"},"featured":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Featured"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"automation_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Automation Url"},"whatsapp_notify_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whatsapp Notify To"}},"type":"object","title":"SubscriptionPlanUpdate"},"SubscriptionUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":100,"minLength":1},{"type":"null"}],"title":"Name"},"active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Active"},"monthly_cost":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Monthly Cost"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"},"subscription_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Date"},"period_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":1.0},{"type":"null"}],"title":"Period Days"},"reminder_days_before":{"anyOf":[{"type":"integer","maximum":90.0,"minimum":0.0},{"type":"null"}],"title":"Reminder Days Before"},"notify_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notify Email"},"notify_whatsapp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notify Whatsapp"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"SubscriptionUpdate"},"SuggestionVotePayload":{"properties":{"status":{"type":"string","title":"Status"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["status"],"title":"SuggestionVotePayload"},"TaskItem":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"text":{"type":"string","title":"Text"},"done":{"type":"boolean","title":"Done","default":false},"order":{"type":"integer","title":"Order","default":0},"done_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Done At"}},"type":"object","required":["text"],"title":"TaskItem","description":"Iter38r-fix9k — A single checklist item (Google Keep style)."},"TaxDefinitionPayload":{"properties":{"label":{"type":"string","maxLength":80,"minLength":1,"title":"Label"},"calc_type":{"type":"string","pattern":"^(percentage|fixed)$","title":"Calc Type","default":"percentage"},"value":{"type":"number","minimum":0.0,"title":"Value","default":0.0},"applies_to":{"type":"string","pattern":"^(gross|net)$","title":"Applies To","default":"gross"},"active":{"type":"boolean","title":"Active","default":true},"sort_order":{"type":"integer","title":"Sort Order","default":0}},"type":"object","required":["label"],"title":"TaxDefinitionPayload"},"TaxesReplacePayload":{"properties":{"taxes":{"items":{"$ref":"#/components/schemas/TaxDefinitionPayload"},"type":"array","title":"Taxes"}},"type":"object","title":"TaxesReplacePayload","description":"Replace all tenant taxes at once (max 5)."},"TenantCountrySelect":{"properties":{"country_code":{"type":"string","maxLength":4,"minLength":2,"title":"Country Code"}},"type":"object","required":["country_code"],"title":"TenantCountrySelect"},"TenantPaymentCreate":{"properties":{"payment_date":{"type":"string","title":"Payment Date"},"invoice_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Ref"},"amount_due":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount Due"},"amount_paid":{"type":"number","title":"Amount Paid"},"payment_method_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method Id"},"payment_method_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method Label"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"send_confirmation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Send Confirmation","default":true}},"type":"object","required":["payment_date","amount_paid"],"title":"TenantPaymentCreate"},"TenantPublishConfigUpsert":{"properties":{"pricing":{"$ref":"#/components/schemas/TenantPublishPricing"},"currency":{"type":"string","maxLength":8,"minLength":3,"title":"Currency","default":"XOF"},"billing_mode":{"type":"string","pattern":"^(credits_first|invoice_only|credits_only)$","title":"Billing Mode","default":"credits_first"},"monthly_invoice_day":{"type":"integer","maximum":28.0,"minimum":1.0,"title":"Monthly Invoice Day","description":"Jour du mois pour clôturer la facture (1-28)","default":1},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","title":"TenantPublishConfigUpsert"},"TenantPublishPricing":{"properties":{"fb_feed":{"type":"integer","minimum":0.0,"title":"Fb Feed","description":"XOF par publication Facebook Feed","default":200},"ig_story":{"type":"integer","minimum":0.0,"title":"Ig Story","description":"XOF par publication Instagram Story","default":300},"ig_reel":{"type":"integer","minimum":0.0,"title":"Ig Reel","description":"XOF par publication Instagram Reel","default":500},"tiktok":{"type":"integer","minimum":0.0,"title":"Tiktok","description":"XOF par publication TikTok (Phase 4)","default":500}},"type":"object","title":"TenantPublishPricing"},"TicketArchivePayload":{"properties":{"also_unlink":{"type":"boolean","title":"Also Unlink","default":false}},"type":"object","title":"TicketArchivePayload"},"TicketAssignPayload":{"properties":{"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},"type":"object","title":"TicketAssignPayload"},"TicketBulkIdsPayload":{"properties":{"ids":{"items":{"type":"string"},"type":"array","maxItems":5000,"title":"Ids"}},"type":"object","title":"TicketBulkIdsPayload"},"TicketClosePayload":{"properties":{"outcome":{"type":"string","title":"Outcome"},"resolution_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resolution Note"},"notify_contact":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Notify Contact"}},"type":"object","required":["outcome"],"title":"TicketClosePayload"},"TicketMotifTemplatePayload":{"properties":{"label":{"type":"string","title":"Label"},"motif":{"type":"string","title":"Motif"}},"type":"object","required":["label","motif"],"title":"TicketMotifTemplatePayload"},"TicketOpenPayload":{"properties":{"motif":{"type":"string","title":"Motif"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"force_release":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Force Release","default":false}},"type":"object","required":["motif"],"title":"TicketOpenPayload"},"TicketReopenPayload":{"properties":{"motif":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Motif"}},"type":"object","title":"TicketReopenPayload"},"TicketUpdatePayload":{"properties":{"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"motif":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Motif"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"}},"type":"object","title":"TicketUpdatePayload"},"TikTokPostIn":{"properties":{"video_url":{"type":"string","minLength":8,"title":"Video Url"},"caption":{"anyOf":[{"type":"string","maxLength":2200},{"type":"null"}],"title":"Caption","default":""},"privacy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Privacy"}},"type":"object","required":["video_url"],"title":"TikTokPostIn"},"TrackedUserCreate":{"properties":{"client_id":{"type":"string","title":"Client Id"},"name":{"type":"string","title":"Name"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"whatsapp_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whatsapp Number"},"role":{"type":"string","title":"Role","default":"Consultation"},"department":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"last_seen":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen"},"status":{"type":"string","title":"Status","default":"active"},"translator_languages":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Translator Languages"},"translator_rate_per_word":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Translator Rate Per Word"},"force_logout_on_idle":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Force Logout On Idle"},"show_dashboard":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Dashboard"},"show_welcome_modal":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Welcome Modal"},"show_messaging_notifs":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Messaging Notifs"}},"type":"object","required":["client_id","name"],"title":"TrackedUserCreate"},"TrackedUserSetPassword":{"properties":{"password":{"type":"string","title":"Password"}},"type":"object","required":["password"],"title":"TrackedUserSetPassword"},"TrackedUserUpdate":{"properties":{"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"whatsapp_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whatsapp Number"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"department":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Department"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"last_seen":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Seen"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"translator_languages":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Translator Languages"},"translator_rate_per_word":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Translator Rate Per Word"},"force_logout_on_idle":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Force Logout On Idle"},"show_dashboard":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Dashboard"},"show_welcome_modal":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Welcome Modal"},"show_messaging_notifs":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Messaging Notifs"}},"type":"object","title":"TrackedUserUpdate"},"TranslationBulkUpsert":{"properties":{"rows":{"items":{"$ref":"#/components/schemas/TranslationUpsert"},"type":"array","title":"Rows"}},"type":"object","required":["rows"],"title":"TranslationBulkUpsert"},"TranslationUpsert":{"properties":{"key":{"type":"string","maxLength":160,"minLength":1,"pattern":"^[a-zA-Z][a-zA-Z0-9._-]*$","title":"Key"},"fr":{"type":"string","maxLength":4000,"title":"Fr"},"en":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"En","default":""},"ar":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Ar","default":""},"lg1":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Lg1","default":""},"lg2":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}],"title":"Lg2","default":""},"context":{"anyOf":[{"type":"string","maxLength":400},{"type":"null"}],"title":"Context","default":""}},"type":"object","required":["key","fr"],"title":"TranslationUpsert"},"TweetPayload":{"properties":{"text":{"type":"string","title":"Text"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"}},"type":"object","required":["text"],"title":"TweetPayload"},"TwitterConfigPayload":{"properties":{"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Secret"},"redirect_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Uri"}},"type":"object","title":"TwitterConfigPayload"},"UploadPhotoPayload":{"properties":{"image_url":{"type":"string","title":"Image Url"},"caption":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Caption"},"published":{"type":"boolean","title":"Published","default":true}},"type":"object","required":["image_url"],"title":"UploadPhotoPayload"},"UserCreateAdmin":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"full_name":{"type":"string","title":"Full Name"},"password":{"type":"string","title":"Password"},"role":{"type":"string","title":"Role","default":"client"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"client_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Code"},"category_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Slug"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"account_status":{"type":"string","title":"Account Status","default":"active"},"is_primary_client":{"type":"boolean","title":"Is Primary Client","default":false},"whatsapp_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whatsapp Number"},"demo_expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demo Expires At"},"demo_quotas":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Demo Quotas"},"link_to_client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link To Client Id"},"business_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Type"},"contract_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Number"},"contract_signed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Signed At"},"contract_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Contract Amount"},"contract_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Currency"},"last_payment_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Payment At"},"contract_overdue_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Contract Overdue Days"},"payment_confirmation_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Confirmation Template"}},"type":"object","required":["email","full_name","password"],"title":"UserCreateAdmin"},"UserNoteCreate":{"properties":{"title":{"type":"string","title":"Title"},"content_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Html","default":""},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"event_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Date"},"images":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Images"},"is_private":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Private"},"target_user_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Target User Ids"},"voice_note_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Note Url"},"voice_note_transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Note Transcript"},"task_items":{"anyOf":[{"items":{"$ref":"#/components/schemas/TaskItem"},"type":"array"},{"type":"null"}],"title":"Task Items"},"shared_with_tenant":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Shared With Tenant"},"editable_by_tenant":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Editable By Tenant"}},"type":"object","required":["title"],"title":"UserNoteCreate"},"UserNoteUpdate":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"content_html":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Html"},"tags":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Tags"},"client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Id"},"event_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Date"},"images":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Images"},"is_private":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Private"},"target_user_ids":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Target User Ids"},"voice_note_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Note Url"},"voice_note_transcript":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Note Transcript"},"task_items":{"anyOf":[{"items":{"$ref":"#/components/schemas/TaskItem"},"type":"array"},{"type":"null"}],"title":"Task Items"},"shared_with_tenant":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Shared With Tenant"},"editable_by_tenant":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Editable By Tenant"}},"type":"object","title":"UserNoteUpdate"},"UserPublic":{"properties":{"id":{"type":"string","title":"Id"},"email":{"type":"string","format":"email","title":"Email"},"full_name":{"type":"string","title":"Full Name"},"role":{"type":"string","title":"Role"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"account_status":{"type":"string","title":"Account Status","default":"active"},"created_at":{"type":"string","title":"Created At"},"is_primary_client":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Primary Client","default":false},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"tracked_role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tracked Role"},"tracked_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tracked User Id"},"parent_client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parent Client Id"},"can_cash":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Cash","default":false},"business_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Type"},"show_dashboard":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Dashboard"},"show_welcome_modal":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Welcome Modal"},"show_messaging_notifs":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Show Messaging Notifs"},"contract_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Number"},"contract_signed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Signed At"},"contract_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Contract Amount"},"contract_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Currency"},"last_payment_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Payment At"},"contract_overdue_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Contract Overdue Days"},"payment_confirmation_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Confirmation Template"}},"type":"object","required":["id","email","full_name","role","created_at"],"title":"UserPublic"},"UserUpdateAdmin":{"properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Phone"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"client_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Code"},"category_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category Slug"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"account_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Status"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"password":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Password"},"is_primary_client":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Primary Client"},"wa_unit_cost":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wa Unit Cost"},"wa_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wa Currency"},"whatsapp_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Whatsapp Number"},"demo_expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Demo Expires At"},"demo_quotas":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"null"}]},"type":"object"},{"type":"null"}],"title":"Demo Quotas"},"hourly_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hourly Rate"},"flat_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Flat Rate"},"can_cash":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Cash"},"link_to_client_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link To Client Id"},"tenant_sharing_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Sharing Mode"},"business_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Type"},"contract_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Number"},"contract_signed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Signed At"},"contract_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Contract Amount"},"contract_currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Currency"},"last_payment_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Payment At"},"contract_overdue_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Contract Overdue Days"},"payment_confirmation_template":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Confirmation Template"}},"type":"object","title":"UserUpdateAdmin"},"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"},"VidalAction":{"properties":{"id":{"type":"string","maxLength":32,"minLength":2,"pattern":"^[a-z0-9_]+$","title":"Id"},"label":{"type":"string","title":"Label"},"method":{"type":"string","pattern":"^(GET|POST|PUT|DELETE)$","title":"Method"},"path":{"type":"string","title":"Path"},"query_params":{"items":{"$ref":"#/components/schemas/QueryParam"},"type":"array","title":"Query Params","default":[]},"body_template":{"type":"string","title":"Body Template","default":""},"is_public":{"type":"boolean","title":"Is Public","default":true},"exclamation_command":{"type":"string","title":"Exclamation Command","default":""},"portal_button_visible":{"type":"boolean","title":"Portal Button Visible","default":true},"portal_button_label":{"type":"string","title":"Portal Button Label","default":""},"input_label":{"type":"string","title":"Input Label","default":""},"input_param":{"type":"string","title":"Input Param","default":"q"},"example_url":{"type":"string","title":"Example Url","default":""},"order":{"type":"integer","title":"Order","default":99}},"type":"object","required":["id","label","method","path"],"title":"VidalAction"},"VidalActionsPayload":{"properties":{"actions":{"items":{"$ref":"#/components/schemas/VidalAction"},"type":"array","title":"Actions"}},"type":"object","required":["actions"],"title":"VidalActionsPayload"},"VidalConfigPayload":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mode"},"test_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test Base Url"},"test_app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test App Id"},"test_app_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Test App Key"},"prod_base_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prod Base Url"},"prod_app_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prod App Id"},"prod_app_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prod App Key"},"cache_ttl_hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cache Ttl Hours"},"quota_per_user_per_day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quota Per User Per Day"},"http_timeout":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Http Timeout"},"webhook_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Webhook Enabled"},"webhook_outbound_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Outbound Url"},"webhook_timeout_seconds":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Webhook Timeout Seconds"}},"type":"object","title":"VidalConfigPayload"},"VidalWebhookCallbackPayload":{"properties":{"correlation_id":{"type":"string","title":"Correlation Id"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code","default":200},"content_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Type","default":"application/json"},"body":{"anyOf":[{},{"type":"null"}],"title":"Body"},"raw":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Raw"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["correlation_id"],"title":"VidalWebhookCallbackPayload","description":"Payload received on the inbound callback endpoint.\nThe external system MUST include the `correlation_id` returned in the\noriginal outbound POST, plus the VIDAL response body + metadata."},"WaAlertConfigUpdate":{"properties":{"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"threshold":{"anyOf":[{"type":"integer","maximum":1000.0,"minimum":1.0},{"type":"null"}],"title":"Threshold"},"window_minutes":{"anyOf":[{"type":"integer","maximum":1440.0,"minimum":1.0},{"type":"null"}],"title":"Window Minutes"},"cooldown_minutes":{"anyOf":[{"type":"integer","maximum":1440.0,"minimum":1.0},{"type":"null"}],"title":"Cooldown Minutes"},"emails":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Emails"},"wa_phones":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Wa Phones"}},"type":"object","title":"WaAlertConfigUpdate","description":"Admin-editable alert configuration."},"WaImportByPhoneRequest":{"properties":{"phone_digits":{"type":"string","title":"Phone Digits"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","required":["phone_digits"],"title":"WaImportByPhoneRequest"},"WaPendingImportRequest":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"}},"type":"object","title":"WaPendingImportRequest"},"WaTemplateCreate":{"properties":{"name":{"type":"string","title":"Name"},"language":{"type":"string","title":"Language","default":"fr"},"category":{"type":"string","title":"Category","default":"UTILITY"},"body_text":{"type":"string","title":"Body Text"},"body_examples":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Body Examples"},"header_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Header Text"},"footer_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Footer Text"}},"type":"object","required":["name","body_text"],"title":"WaTemplateCreate"},"WaTemplateNoteUpsert":{"properties":{"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_available_for_users":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Available For Users"}},"type":"object","title":"WaTemplateNoteUpsert"},"WalkInCreatePayload":{"properties":{"medecin_id":{"type":"string","title":"Medecin Id","description":"ID du médecin (tracked user role=Médecin)"},"patient":{"type":"string","maxLength":120,"minLength":1,"title":"Patient"},"patient_phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Patient Phone"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date","description":"YYYY-MM-DD — défaut = aujourd'hui"},"motif":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Motif"},"domaine":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Domaine"}},"type":"object","required":["medecin_id","patient"],"title":"WalkInCreatePayload"},"WalkInUpdatePayload":{"properties":{"patient":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Patient"},"patient_phone":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}],"title":"Patient Phone"},"motif":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Motif"},"medecin_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Medecin Id"},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date"},"domaine":{"anyOf":[{"type":"string","maxLength":60},{"type":"null"}],"title":"Domaine"}},"type":"object","title":"WalkInUpdatePayload"},"WebhookConfigPayload":{"properties":{"outbound_url":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Outbound Url"},"outbound_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Outbound Enabled"},"outbound_auto_monthly":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Outbound Auto Monthly"},"rotate_outbound_secret":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Rotate Outbound Secret","default":false},"inbound_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Inbound Enabled"},"rotate_inbound_secret":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Rotate Inbound Secret","default":false}},"type":"object","title":"WebhookConfigPayload"},"WhatsAppSendRequest":{"properties":{"to":{"type":"string","title":"To"},"template_name":{"type":"string","title":"Template Name"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code","default":"fr"},"components":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Components"},"contact_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Id"},"tracked_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tracked User Id"},"template_rendered_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Rendered Body"}},"type":"object","required":["to","template_name"],"title":"WhatsAppSendRequest"},"WhatsAppSendTextRequest":{"properties":{"to":{"type":"string","title":"To"},"text":{"type":"string","title":"Text"},"contact_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact Id"},"tracked_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tracked User Id"},"reply_to_message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply To Message Id"}},"type":"object","required":["to","text"],"title":"WhatsAppSendTextRequest"},"XPostIn":{"properties":{"text":{"type":"string","maxLength":280,"minLength":1,"title":"Text"}},"type":"object","required":["text"],"title":"XPostIn"},"_ModuleAclPayload":{"properties":{"acl":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Acl","default":{}}},"type":"object","title":"_ModuleAclPayload"},"_RealignAllPayload":{"properties":{"confirm":{"type":"boolean","title":"Confirm","default":false},"dry_run":{"type":"boolean","title":"Dry Run","default":false}},"type":"object","title":"_RealignAllPayload"},"_SimulateInboundPayload":{"properties":{"from_phone":{"type":"string","maxLength":30,"minLength":4,"title":"From Phone"},"text":{"type":"string","maxLength":2000,"minLength":1,"title":"Text"},"profile_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Name"}},"type":"object","required":["from_phone","text"],"title":"_SimulateInboundPayload"},"routes__linkedin__CreatePostPayload":{"properties":{"text":{"type":"string","title":"Text"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"author_type":{"type":"string","title":"Author Type","default":"member"},"organization_urn":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Urn"}},"type":"object","required":["text"],"title":"CreatePostPayload"},"routes__meta__CreatePostPayload":{"properties":{"message":{"type":"string","maxLength":63000,"minLength":1,"title":"Message"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link"},"published":{"type":"boolean","title":"Published","default":true}},"type":"object","required":["message"],"title":"CreatePostPayload"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}