---
name: site-management
description: Faites vivre un site sur Spaicely une fois construit : envoyer et publier des versions, revenir en arrière, modifier une partie d'une page, mettre le site sur son domaine, gérer le DNS et le transfert de mail, les personnes et les rôles, les validations, les cessions, la formule d'hébergement et le renouvellement des domaines. À utiliser chaque fois que vous travaillez sur un site ou un compte Spaicely existant, pas seulement pour en construire un.
---

# Faire vivre un site sur Spaicely

Comment un site arrive en ligne et y reste. Pour ce que contient un bon site, voyez la skill `site-building` ; pour trouver un nom, `domain-search`. Chaque outil, paramètre et endpoint HTTP est listé sur https://spaicely.com/developers/ et, pour les IA, dans https://spaicely.com/llms-full.txt.

## Pour commencer

- Appelez d'abord `account.whoami`. Il indique pour qui vous agissez, vos scopes et, par site, votre rôle et ce que vous pouvez faire. S'il n'y a pas encore de site, `sites.create` en crée un ; demandez le nom à la personne.
- Vos droits ne sont jamais plus larges que le rôle de la personne. Quand un outil refuse, dites ce qui manque (rôle, scope ou formule) au lieu de chercher un autre chemin.
- Si un outil cité ici n'est pas dans votre liste, votre liste est ancienne : demandez à la personne de reconnecter le connecteur Spaicely (dans claude.ai : Paramètres > Connecteurs ; dans Claude Code : `/mcp`).
- Demandez à la personne avant tout ce qui change ce que voient les visiteurs, coûte de l'argent ou ne peut pas être annulé. Dans Claude Code, certains outils demandent eux-mêmes une validation.
- **Ce que vous pouvez faire vous-même**, la personne le choisit pour chaque type d'action (`ai_permissions` dans `account.whoami`) : `self`, `ask` ou `never`. Par défaut, les achats, les personnes, le courrier, le registre, la suppression et les données de facturation sont sur `ask`. Un tel appel répond par `approval_required` et une `url` : donnez ce lien à la personne et ne répétez pas l'appel. Elle approuve dans Spaicely ; nous exécutons alors l'appel exactement tel que vous l'avez envoyé, et `approvals.status` avec l'identifiant `approval` donne la réponse. Un type sur `never` est refusé ; seule la personne peut le changer, sur https://app.spaicely.com/ai.

## Mettre une version en ligne

Une version est toujours le site entier, jamais un ensemble de modifications. Rien n'est visible tant qu'elle n'est pas publiée.

1. **Envoyer**, de l'une de ces deux façons :
   - `sites.deploy` avec chaque fichier : `path` depuis la racine du site, `sha256` en hexadécimal et `size` en octets. Pour une image déjà sur le web, passez plutôt `source_url` (https, 20 au plus par appel). La réponse liste les fichiers `missing` ; envoyez exactement ceux-là avec `sites.files.put` (50 fichiers et 2 Mo au plus par appel, le texte en `utf8`, le reste en `base64`).
   - Avec le site sous forme de dossier sur le disque : `sites.upload_url`, puis `tar -czf site.tar.gz -C <folder> . && curl -T site.tar.gz <url>`. L'URL fonctionne une fois, pendant 10 minutes ; `index.html` doit être à la racine de l'archive.
2. **Publier** avec `sites.publish` et le numéro de version, après l'accord de la personne. Les visiteurs basculent d'un coup, jamais vers un mélange. Cela prend jusqu'à une demi-minute ; `sites.versions` indique quand c'est en ligne.
3. **Lire le rapport.** `sites.versions` donne pour chaque version les octets économisés et des `hints`, chacun avec un `fix`. Corrigez ce qui s'applique et publiez à nouveau.

Bon à savoir :

- Nous gardons les fichiers exactement tels qu'ils ont été envoyés ; les visiteurs reçoivent une copie optimisée (HTML, CSS et JavaScript minifiés, images recompressées jusqu'à 2560 pixels).
- Tout ce qui se trouve sous `_private/` reste hors du CDN ; seul un formulaire de téléchargement le remet. `_redirects` devient des redirections sur le CDN et n'est pas servi lui-même (voir `site-building`).
- Quelqu'un d'autre a publié après le début de votre version ? Vos modifications sont alors fusionnées avec les siennes et c'est ce résultat qui est mis en ligne. Un conflit revient par chemin : lisez le fichier en ligne avec `sites.files.get`, refaites votre modification dessus et envoyez à nouveau.
- **Revenir à la version précédente** : `sites.publish` avec `rollback: true`. N'importe quelle version plus ancienne : `sites.publish` avec son numéro.
- Avant de modifier une page faite par quelqu'un d'autre, lisez-la avec `sites.files.get` (la version en ligne, ou `deployment` pour une autre) et gardez ce qui s'y trouve. `sites.files.list` montre les fichiers, avec `prefix` pour un seul dossier.

## Modifier une partie d'une page

Une page peut marquer des blocs qu'un rôle peut modifier seul :

```html
<!-- spaicely:edit news -->
<p>Ouvert le dimanche à partir du 1er novembre.</p>
<!-- /spaicely:edit -->

<!-- spaicely:append agenda -->
<li>12 novembre : dégustation</li>
<!-- /spaicely:append -->
```

- `edit` peut être changé entièrement ; `append` n'accepte que des ajouts avant ou après ce qui s'y trouve. Noms : lettres minuscules, chiffres, `-` et `_`. Les blocs ne s'imbriquent pas.
- `sites.files.list` liste les blocs par page. `sites.region.update` avec `path`, `region` et `content` crée une nouvelle version qui ne diffère de la version en ligne que dans ce bloc (`mode` replace, prepend ou append ; `index` quand un nom apparaît plusieurs fois). Ensuite, publiez.
- Placez ces marqueurs là où la personne s'attend à ce que d'autres tiennent les choses à jour (actualités, horaires d'ouverture, agenda), pour qu'un rédacteur n'ait jamais besoin de la page entière.

## Personnes et rôles

- **Sur tout le compte** : `account.members`. Les propriétaires s'occupent du paiement, des domaines et des personnes ; les membres travaillent sur tous les sites. L'invitation se fait par e-mail (le lien fonctionne 7 jours).
- **Sur un seul site** : `access.list` montre qui a quel rôle ; `access.update` en donne un, le change ou (`role: "none"`) le retire. Réservé au propriétaire. La personne a besoin d'un compte Spaicely avec cette adresse.
- Rôles : `admin` (tout sauf ce qui revient au propriétaire), `maintainer` (tous les fichiers, formulaires et le DNS), `designer` et `editor` (seulement ce que leurs `rules` permettent), `viewer` (lecture). `can_publish` permet à un maintainer ou un editor de publier.
- Les règles limitent un designer ou un editor à des actions sur des chemins, éventuellement à des blocs marqués : `[{"actions": ["update"], "paths": ["blog/**", "index.html"], "regions": ["news"]}]`.
- **Validation** (formules Pro et Boutique) : quelqu'un qui peut modifier des fichiers mais pas publier appelle `sites.review.request` avec une `note`. Ceux qui peuvent publier reçoivent un mail ; valider, c'est `sites.publish`, renvoyer, c'est `sites.review.reject` avec une note. Avec la formule Site, la personne demande à quelqu'un qui peut publier.

## Un domaine pour le site

- Enregistrer ou transférer un domaine : voyez `domain-search` (`domains.register`, `domains.transfer` ; un partenaire en propose un au client avec `domains.propose`). Le client est toujours le titulaire.
- **Relier** : `sites.domains.connect` avec le domaine lui-même, sans www. Spaicely lit les enregistrements que le domaine a maintenant ; rappelez après environ une demi-minute pour obtenir `records_to_confirm`. Montrez-les à la personne : les enregistrements conservés (mail, vérifications) suivent, ceux avec la raison `site` sont remplacés, la raison `certificate` désigne un enregistrement CAA qui bloquerait le certificat. Appelez ensuite avec `confirm: true` (`skip` avec les index à laisser de côté).
- La personne règle ensuite chez son registrar les serveurs de noms sur les deux de la réponse (`kiki.bunny.net` et `coco.bunny.net`). Les domaines enregistrés chez Spaicely les ont déjà. DNSSEC doit d'abord être désactivé chez l'ancien fournisseur. Nous vérifions toutes les cinq minutes, puis nous obtenons le certificat et envoyons un mail à la personne ; `www` renvoie les visiteurs vers le domaine lui-même.
- `domains.status` montre où on en est : enregistrements à confirmer, serveurs de noms, DNSSEC, certificat et les enregistrements que nous servons.
- **Enregistrements DNS** : `domains.dns.update` ajoute ou supprime des A, AAAA, CNAME, TXT, MX, SRV et CAA (`name` relatif au domaine, `@` pour le domaine lui-même ; suppression par id depuis `domains.status`). Là où pointent le domaine et www reste l'affaire du site. Un domaine du compte qui n'est sur aucun site reçoit aussi le DNS de Spaicely de cette façon.
- Les clés de signature de mail (DKIM) d'un service peu courant peuvent échapper à la liaison : la personne envoie un mail depuis une adresse du domaine à `dkim@spaicely.com`, avec en objet le code de `dkim_mail`.
- `sites.domains.disconnect` fait que le site ne répond plus sur le domaine ; les enregistrements de mail restent.

## Transfert de mail

Le mail envoyé à `info@<domaine>` peut être transféré vers une boîte que la personne a déjà, comme son Gmail. Répondre en tant que `info@` n'est pas encore possible.

1. `mail.forward.enable` sur un domaine relié à un site payé. Il règle MX, vérification, DKIM, SPF et DMARC. Si le domaine reçoit déjà du mail ailleurs, cela s'arrête : l'appel refuse sans `replace_existing_mail: true`, donc demandez d'abord.
2. `mail.forward.add` avec `address` (`info`, ou `*` pour chaque adresse qui n'a pas la sienne) et jusqu'à 5 `destinations`. Chaque nouvelle destination reçoit un mail de confirmation ; rien n'y part avant le clic.
3. `mail.forward.status` montre les adresses, l'état de chaque destination et le mail retenu comme spam possible au cours des 30 derniers jours ; `mail.forward.release` en envoie un malgré tout, seulement quand la personne le reconnaît.

Chaque adresse coûte 1,50 euro par mois hors TVA sur la formule du site ; Site en permet 1, Pro 5, Boutique 10. `mail.forward.remove` et `mail.forward.disable` y mettent fin.

## Formule, facturation et renouvellements

- **Hébergement** : `sites.subscription` montre la formule, le statut et la date de renouvellement. Avec `plan` (`site`, `pro` ou `shop` ; 9, 19 et 39 euros par mois hors TVA), il démarre l'hébergement en donnant une `checkout_url` pour la personne, ou change de formule immédiatement. Sans formule, un nouveau site est supprimé après 14 jours. Carte, factures et résiliation se trouvent à `portal_url`. Réservé aux propriétaires du compte qui paie.
- **Coordonnées de facturation** : `account.billing` (entreprise ou non, numéro de TVA, adresse). Chaque achat en a besoin ; un numéro de TVA est vérifié avec VIES. `account.invoices` liste nos factures, chacune avec un lien.
- **Consommateurs** (un compte qui n'est pas une entreprise) : ils doivent accepter qu'une commande commence immédiatement, ce qui limite leur droit de rétractation. Ne passez `start_now: true` que s'ils l'ont dit eux-mêmes.
- **Domaines** : le renouvellement est automatique par défaut, prélevé 14 jours avant l'expiration sur la carte ou le mandat avec lequel le domaine a été payé (`domains.auto_renew` ; sans moyen de paiement enregistré, la réponse contient une `setup_url`). `domains.renew` donne un lien de paiement pour renouveler maintenant.
- Également pour les propriétaires du compte titulaire : `domains.holder` (coordonnées du titulaire ; un autre nom ou une autre organisation passe par notre équipe), `domains.lock` (verrou de transfert), `domains.nameservers` (`ours: true`, ou d'autres pour un domaine qui n'est sur aucun site) et `domains.transfer_code` (le code part par mail à la personne et au titulaire, jamais à vous).

## Partenaires

- Un partenaire (un webdesigner ou une agence) construit sur son propre compte partenaire, ou travaille sur le site du client avec un rôle.
- `sites.handover` envoie au client un lien (14 jours) pour reprendre un site terminé sur son propre compte ; `role` est ce que le partenaire garde, `payer` qui paie à partir de là. `sites.handover.revoke` l'annule avant l'acceptation.
- `domains.propose` propose un domaine pour le site d'un client ; le client vérifie d'abord les coordonnées du titulaire et donne son accord par mail.

## Garder un œil dessus

- `sites.stats` donne les requêtes, les octets, `not_found` et les régions du CDN par jour, sur 7, 30 ou 90 jours, sans cookies. Beaucoup de `not_found` signifie des liens cassés : trouvez-les et ajoutez une redirection ou corrigez le lien.
- `scripts.list` montre l'état de chaque formulaire ; `shop.orders` les dernières commandes.
- Supprimer un site (`sites.delete`, réservé au propriétaire, avec le nom que la personne a tapé) met hors ligne pour de bon chaque version, chaque formulaire et la boutique. Les domaines restent à la personne.

## Sans MCP

La CLI de Spaicely fait la même chose depuis un terminal ou une CI : `spaicely login`, `spaicely deploy` (différence avec la version en ligne, envoi, publication en option), `spaicely publish`, `spaicely rollback`, `spaicely versions`, `spaicely domains ...`, `spaicely dns ...`, et `spaicely call <tool>` pour tous les autres outils. Installation et exemples : https://spaicely.com/developers/#command-line.
