{"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":["Public"],"summary":"Get Version","description":"Renvoie la version du build en cours + l'horodatage du dernier redémarrage.\n\nIter34i: The minor version auto-bumps from the count of delivered\nroadmap actions stored in `db.roadmap_actions`. Manual major releases\ncan be forced via the APP_VERSION env var (then we append the action\ncount as a build number). Result format: `1.<N>` or `<APP_VERSION>.<N>`.","operationId":"get_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.\nAdmin/superviseur see everything. RGPD: anonymizes customer fields per\nparent-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 de l'utilisateur appelant. Admin/superviseur voient tout.\nPlain users see only their own (privacy : amounts can be sensitive).","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","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/documents":{"get":{"tags":["Portail Client"],"summary":"Me Documents","description":"RGPD: anonymizes uploaded_by_email/name for non-privileged roles.","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.","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/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}/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","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","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","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}":{"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__get","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"}}}}}},"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__get","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}":{"get":{"tags":["Public"],"summary":"Serve File","operationId":"serve_file_api_files__file_id__get","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"}}}}}},"head":{"tags":["Public"],"summary":"Serve File","operationId":"serve_file_api_files__file_id__get","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/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/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_get","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_get","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_get","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_get","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/ContactCreate"}}},"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/ContactUpdate"}}}},"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/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/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/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/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.","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/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/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/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/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/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/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":{"type":"string","pattern":"^(product|package|ucd|vmp|all-packages)$","default":"product","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…).","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/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/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":"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"}}}}}}},"/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.","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. Stocke le fichier sous /uploads/officines/.\nLe champ `logo_url` est mis à jour sur la fiche.","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/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/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-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/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/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"},"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"},"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"}},"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"},"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}},"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"}},"type":"object","title":"AutomationUpdate"},"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"}},"type":"object","title":"AutoreplyConfigPayload"},"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_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_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"},"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"},"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":"ContactCreate"},"ContactUpdate":{"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":"ContactUpdate"},"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"},"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"},"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"},"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"}},"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"}},"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"},"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"}},"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"}},"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"}},"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"}},"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"},"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|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"},"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"},"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"},"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"},"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"},"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"},"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"},"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"},"PrescriptionAnalysisPayload":{"properties":{"patient":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Patient"},"prescriptions":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Prescriptions"},"allergies":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Allergies"},"pathologies":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Pathologies"}},"type":"object","required":["prescriptions"],"title":"PrescriptionAnalysisPayload","description":"Mirror of the VIDAL `/alerts/full` body, simplified."},"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"},"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"},"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"},"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"},"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"},"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"},"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"}},"type":"object","title":"SettingsUpdate"},"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"},"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"},"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"},"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"}},"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"}},"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"},"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"}},"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}},"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"}},"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"},"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"}},"type":"object","title":"VidalConfigPayload"},"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"},"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"},"_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"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}