{"openapi":"3.0.3","info":{"title":"RGNR Email Templates — Worker API","version":"2.0.0","description":"Cloudflare Worker qui envoie des emails pré-rendus via Cloudflare Email Sending. Les templates sont compilés au build (Maizzle) et les tokens `[[propName]]` sont remplacés à l'exécution."},"servers":[{"url":"https://email-templates.rgnr.xyz","description":"Production"},{"url":"https://email-templates-staging.rgnr.xyz","description":"Staging"},{"url":"https://email-templates-dev.rgnr.xyz","description":"Dev"},{"url":"http://localhost:8787","description":"Local (wrangler dev)"}],"tags":[{"name":"Email","description":"Envoi d'emails"},{"name":"System","description":"Health & documentation"}],"paths":{"/render":{"post":{"tags":["Email"],"summary":"Rendre un email sans l’envoyer","description":"Remplace les tokens `[[propName]]` dans le template pré-compilé et retourne le sujet + HTML. Aucun email n’est envoyé.","security":[{"RenderBearerAuth":[]},{"SendBearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderRequest"},"examples":{"welcome":{"summary":"Rendu de bienvenue","value":{"template":"auth/welcome","props":{"fullname":"Jean Dupont","account_url":"https://horizon-v4.rgnr.xyz/home","platform_url":"https://horizon-v4.rgnr.xyz","support_email":"contact@rgnr.tv"},"locale":"fr"}}}}}},"responses":{"200":{"description":"Template rendu avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenderSuccess"}}}},"400":{"description":"Paramètres manquants ou template inconnu"},"401":{"description":"Token Bearer absent ou invalide"}}}},"/send":{"post":{"tags":["Email"],"summary":"Envoyer un email","description":"Remplace les tokens `[[propName]]` dans le template pré-compilé et envoie l'email via Cloudflare Email Sending. Pour récupérer le HTML sans envoyer, utiliser `/render`.","security":[{"SendBearerAuth":[]}],"parameters":[{"name":"preview","in":"query","required":false,"description":"Si présent, retourne le HTML rendu sans envoyer l'email (utile pour debug).","schema":{"type":"boolean"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendRequest"},"examples":{"welcome":{"summary":"Email de bienvenue","value":{"to":"user@example.com","template":"auth/welcome","props":{"fullname":"Jean Dupont","account_url":"https://horizon-v4.rgnr.xyz/home","platform_url":"https://horizon-v4.rgnr.xyz","support_email":"contact@rgnr.tv"},"locale":"fr"}},"orderReceived":{"summary":"Confirmation de commande WooCommerce","value":{"to":"client@example.com","subject":"Merci pour votre commande","template":"woo/order-received","props":{"fullname":"Louise Marand","order_number":"42246","order_date":"22/06/2026","items":[{"label":"Séjour bien-être","qty":1,"price":"850,00 €"}],"subtotal":"850,00 €","total":"850,00 €","payment_method":"Carte de crédit"},"locale":"fr"}}}}}},"responses":{"200":{"description":"Email envoyé avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendSuccess"}}}},"400":{"description":"Paramètres manquants ou template inconnu"},"401":{"description":"Token Bearer absent ou invalide"}}}},"/health":{"get":{"tags":["System"],"summary":"Health check","responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"templates":{"type":"integer","example":52}}}}}}}}}},"components":{"schemas":{"RenderRequest":{"type":"object","required":["template"],"properties":{"subject":{"type":"string","description":"Sujet (optionnel — déduit du template si absent)"},"template":{"type":"string","description":"Identifiant du template","enum":["onboarding/free-gesture-chosen","onboarding/free-gesture-observation","onboarding/free-gesture-rotation","onboarding/free-gesture-monthly","onboarding/distress-alert","auth/welcome","auth/magic-link","auth/reset-password","auth/set-password","auth/email-change-confirm","auth/email-change-notice","auth/email-change-approve","admin/billing-dispute","billing/invoice","billing/order-failed","billing/order-received","billing/order-processing","billing/order-fulfilled","billing/payment-action-required","billing/payment-failed","billing/payment-receipt","billing/refund-partial","billing/refund","shop/order-received","vendor/new-order","contact/contact-form","gamification/streak-reminder","gamification/badge-reward","gamification/support-coupon-grant","newsletter/subscription-confirmed","retreats/retreat-confirmation","retreats/retreat-full","retreats/retreat-low-stock","retreats/retreat-new-registration","retreats/retreat-weekly-report","subscription/cancelled","subscription/cancellation-requested","subscription/confirmed","subscription/ended","subscription/expiring","subscription/renewal-reminder","subscription/renewed","subscription/resumed","subscription/trial-started","subscription/trial-ending","subscription/trial-ended","woo/new-account-admin","woo/new-account","woo/order-failed","woo/order-received","woo/payment-action-admin","woo/refund-partial"]},"props":{"type":"object","description":"Valeurs des tokens [[propName]] du template. Toutes les valeurs sont échappées HTML ; les props `*_url` et les valeurs placées dans un `href`/`src` doivent utiliser http(s), mailto ou tel (sinon `#`). Props globales optionnelles : `platform_url` (URL du front, sans slash final — repli sur la variable `PLATFORM_URL` du Worker), `support_email` (repli sur `SUPPORT_EMAIL`, puis contact@rgnr.tv), `unsubscribe_url` (affiche le bloc de désabonnement dans le pied de page).","additionalProperties":true},"locale":{"type":"string","enum":["fr","en"],"default":"fr"}}},"SendRequest":{"type":"object","required":["to","template"],"properties":{"to":{"type":"string","format":"email","description":"Adresse du destinataire"},"subject":{"type":"string","description":"Sujet (optionnel — déduit du template si absent)"},"template":{"type":"string","description":"Identifiant du template","enum":["onboarding/free-gesture-chosen","onboarding/free-gesture-observation","onboarding/free-gesture-rotation","onboarding/free-gesture-monthly","onboarding/distress-alert","auth/welcome","auth/magic-link","auth/reset-password","auth/set-password","auth/email-change-confirm","auth/email-change-notice","auth/email-change-approve","admin/billing-dispute","billing/invoice","billing/order-failed","billing/order-received","billing/order-processing","billing/order-fulfilled","billing/payment-action-required","billing/payment-failed","billing/payment-receipt","billing/refund-partial","billing/refund","shop/order-received","vendor/new-order","contact/contact-form","gamification/streak-reminder","gamification/badge-reward","gamification/support-coupon-grant","newsletter/subscription-confirmed","retreats/retreat-confirmation","retreats/retreat-full","retreats/retreat-low-stock","retreats/retreat-new-registration","retreats/retreat-weekly-report","subscription/cancelled","subscription/cancellation-requested","subscription/confirmed","subscription/ended","subscription/expiring","subscription/renewal-reminder","subscription/renewed","subscription/resumed","subscription/trial-started","subscription/trial-ending","subscription/trial-ended","woo/new-account-admin","woo/new-account","woo/order-failed","woo/order-received","woo/payment-action-admin","woo/refund-partial"]},"props":{"type":"object","description":"Valeurs des tokens [[propName]] du template. Toutes les valeurs sont échappées HTML ; les props `*_url` et les valeurs placées dans un `href`/`src` doivent utiliser http(s), mailto ou tel (sinon `#`). Props globales optionnelles : `platform_url` (URL du front, sans slash final — repli sur la variable `PLATFORM_URL` du Worker), `support_email` (repli sur `SUPPORT_EMAIL`, puis contact@rgnr.tv), `unsubscribe_url` (affiche le bloc de désabonnement dans le pied de page).","additionalProperties":true},"locale":{"type":"string","enum":["fr","en"],"default":"fr"}}},"SendSuccess":{"type":"object","properties":{"success":{"type":"boolean","example":true},"template":{"type":"string","example":"auth/welcome"},"to":{"type":"string","example":"user@example.com"}}},"RenderSuccess":{"type":"object","properties":{"html":{"type":"string"},"subject":{"type":"string","example":"Bienvenue sur Regenere"},"template":{"type":"string","example":"auth/welcome"},"locale":{"type":"string","example":"fr"}}}},"securitySchemes":{"RenderBearerAuth":{"type":"http","scheme":"bearer","description":"Secret configuré via `wrangler secret put RENDER_ONLY_API_SECRET`. Autorise uniquement `/render`."},"SendBearerAuth":{"type":"http","scheme":"bearer","description":"Secret configuré via `wrangler secret put RENDER_API_SECRET`. Autorise `/send` et `/render`."}}}}