Facturation et abonnement
État de l'abonnement et factures, souscription par Stripe Checkout, portail client, résiliation, reprise, et liaison Novadesko via l'API.
Les paiements sont gérés par Stripe. L'API ne manipule jamais de numéro de carte : elle renvoie des liens vers les pages sécurisées de Stripe (Checkout pour souscrire, portail client pour gérer le moyen de paiement et les factures). L'état de l'abonnement est ensuite mis à jour par les webhooks Stripe.
Les formules et leurs limites :
| Gratuit | Site | Site + Novadesko | Sur mesure | |
|---|---|---|---|---|
| Prix mensuel (TTC) | 0 € / mois | 9 € / mois | 24 € / mois | Sur devis |
| Prix annuel (TTC) | Gratuit | 90 € / an | 240 € / an | Sur devis |
| Sites | 1 | 1 | 3 | Selon le projet |
| Pages par site | 5 | 30 | 100 | Selon le projet |
| Domaine personnalisé | Non | Oui | Oui | Selon le projet |
| Mention « Créé avec Monsiteo » | Affichée | Retirée | Retirée | Selon le projet |
| Générations IA par mois | 3 | 50 | 200 | Selon le projet |
| Stockage des images | 200 Mo | 2 Go | 10 Go | Selon le projet |
| Novadesko (facturation) | Non | Non | Inclus | Selon le projet |
État de l'abonnement#
GET /v1/billing · Jeton
curl https://api.monsiteo.com/v1/billing \
-H "Accept: application/json" \
-H "Authorization: Bearer 1|AbCdEfGhIjKlMnOpQrStUvWxYz0123456789abcd"
{
"plan": "site",
"limits": { "name": "Site", "formula": 1, "monthly": 9, "yearly": 90, "stripe_monthly": "price_...", "stripe_yearly": "price_...", "sites": 1, "pages": 30, "custom_domain": true, "branding": false, "ai_generations": 50, "storage_mb": 2048, "novadesko": false },
"trial_eligible": false,
"subscription": {
"id": 12,
"plan": "site",
"interval": "month",
"status": "active",
"on_trial": false,
"trial_ends_at": "2026-10-24T14:02:11+00:00",
"current_period_end": "2026-11-24T14:02:11+00:00",
"cancel_at_period_end": false,
"ends_at": null
},
"payments": [
{
"id": 55,
"number": "MS-2026-0042",
"status": "paid",
"amount": 9,
"currency": "EUR",
"description": "Abonnement Monsiteo Site",
"pdf_url": "https://pay.stripe.com/invoice/acct_.../pdf",
"date": "2026-10-24T14:05:37+00:00"
}
]
}
| Champ | Description |
|---|---|
plan |
Formule effective (free sans abonnement valide). |
limits |
Limites de la formule effective. |
trial_eligible |
true si le compte n'a jamais eu d'abonnement : la prochaine souscription commencera par 14 jours d'essai gratuit. Un seul essai par compte. |
subscription |
Abonnement en cours (essai, actif ou impayé), ou null. |
subscription.interval |
month ou year. |
subscription.status |
trialing (essai), active, past_due (paiement en échec, relances en cours). Les statuts canceled et expired ne sont jamais renvoyés ici (l'abonnement n'est plus « en cours »). |
subscription.cancel_at_period_end |
Résiliation demandée : l'abonnement s'arrêtera à ends_at. |
payments |
Les 50 derniers paiements, du plus récent au plus ancien : status vaut paid ou failed, amount en euros TTC, pdf_url mène à la facture Stripe. |
Bon à savoir Pendant un impayé (
past_due), les fonctions payantes restent accessibles le temps des relances automatiques de Stripe. Si le paiement n'aboutit pas après la dernière relance, Stripe met fin à l'abonnement (selon les réglages de relance du compte Stripe) et le compte repasse en Gratuit.
Souscrire (Checkout)#
POST /v1/billing/checkout · Jeton
Renvoie l'URL d'une session Stripe Checkout. Redirigez l'utilisateur vers cette URL : il y saisit son moyen de paiement, son adresse de facturation (obligatoire) et éventuellement son numéro de TVA et un code promo. Il revient ensuite sur https://app.monsiteo.com/#/billing?checkout=success (ou checkout=cancel s'il abandonne).
| Paramètre | Type | Obligatoire | Règles |
|---|---|---|---|
plan |
chaîne | oui | site ou site_novadesko |
interval |
chaîne | non | month (par défaut) ou year |
curl -X POST https://api.monsiteo.com/v1/billing/checkout \
-H "Accept: application/json" -H "Content-Type: application/json" \
-H "Authorization: Bearer 1|AbCdEfGhIjKlMnOpQrStUvWxYz0123456789abcd" \
-d '{"plan":"site","interval":"year"}'
{ "url": "https://checkout.stripe.com/c/pay/cs_test_a1B2c3D4..." }
Si le compte est éligible, l'abonnement démarre par 14 jours d'essai : aucun montant n'est prélevé avant la fin de l'essai. La formule est appliquée dès que Stripe confirme la souscription par webhook, en général quelques secondes après le retour.
Erreurs : 422 si plan ou interval est invalide, ou « Formule inconnue ou non configurée dans Stripe. ».
Attention Pour changer de formule ou de rythme de paiement quand un abonnement est déjà en cours, passez par le portail client plutôt que par une nouvelle session Checkout, afin de ne pas créer un second abonnement chez Stripe.
Portail client Stripe#
POST /v1/billing/portal · Jeton
Renvoie l'URL du portail client Stripe : moyen de paiement, adresse et numéro de TVA, historique et téléchargement des factures, et selon la configuration du portail, changement de formule. Retour vers https://app.monsiteo.com/#/billing.
curl -X POST https://api.monsiteo.com/v1/billing/portal \
-H "Accept: application/json" \
-H "Authorization: Bearer 1|AbCdEfGhIjKlMnOpQrStUvWxYz0123456789abcd"
{ "url": "https://billing.stripe.com/p/session/test_YWNjdF8x..." }
Résilier#
POST /v1/billing/cancel · Jeton
Demande l'arrêt de l'abonnement à la fin de la période en cours (ou à la fin de l'essai). Les fonctions payantes restent disponibles jusque-là, puis le compte repasse en Gratuit : les sites restent en ligne sur leur adresse .monsiteo.com, avec les limites de la formule Gratuit.
curl -X POST https://api.monsiteo.com/v1/billing/cancel \
-H "Accept: application/json" \
-H "Authorization: Bearer 1|AbCdEfGhIjKlMnOpQrStUvWxYz0123456789abcd"
{ "ok": true, "ends_at": "2026-11-24T14:02:11+00:00" }
Sans abonnement en cours : {"ok": false, "ends_at": null}.
Annuler la résiliation#
POST /v1/billing/resume · Jeton
Tant que la date de fin n'est pas atteinte, annule la résiliation : l'abonnement continue normalement.
curl -X POST https://api.monsiteo.com/v1/billing/resume \
-H "Accept: application/json" \
-H "Authorization: Bearer 1|AbCdEfGhIjKlMnOpQrStUvWxYz0123456789abcd"
{ "ok": true }
Novadesko#
La formule Site + Novadesko inclut un compte Novadesko (logiciel de facturation) relié au compte Monsiteo. La liaison est lancée automatiquement à la souscription ; ces routes permettent de suivre son état ou de la relancer.
Lire l'état de la liaison#
GET /v1/novadesko · Jeton
{ "included": true, "status": "linked", "company_id": "8812", "login_url": "https://app.novadesko.com" }
| Champ | Description |
|---|---|
included |
La formule actuelle inclut-elle Novadesko ? |
status |
none (jamais demandé), pending (en cours, traité par l'équipe si besoin), linked (relié), failed (échec, l'équipe est prévenue). |
company_id |
Identifiant de la société côté Novadesko, une fois relié. |
login_url |
Adresse de connexion à Novadesko. |
Relancer la liaison#
POST /v1/novadesko/link · Jeton
curl -X POST https://api.monsiteo.com/v1/novadesko/link \
-H "Accept: application/json" \
-H "Authorization: Bearer 1|AbCdEfGhIjKlMnOpQrStUvWxYz0123456789abcd"
{ "status": "linked", "message": null }
message contient la dernière erreur éventuelle quand status vaut pending ou failed. Erreur 402 si la formule n'inclut pas Novadesko : « Novadesko est inclus dans la formule Site + Novadesko. ».
Mis à jour le 26 octobre 2026