{"openapi":"3.1.0","info":{"title":"Quilly API","version":"1.0.0","description":"Notes, tâches, prompts, tableaux, Drive et partage — tout Quilly, au nom du titulaire de la clé. Chaque réponse est enveloppée : `{ success, data, meta }` ou `{ success, error, meta }`."},"servers":[{"url":"https://quilly.aelby.com/api/v1"}],"security":[{"bearer":[]}],"tags":[{"name":"Compte","description":"Qui parle, avec quels droits, et combien de place reste."},{"name":"Notes","description":"Écrire, ranger, retrouver. En HTML, en Markdown ou en texte brut."},{"name":"Tâches","description":"Des listes, une échelle de catégories, et la coche qui suit partout — jusque dans Aelby Week."},{"name":"Prompts","description":"La bibliothèque, ses variables `{{…}}`, ses blocs, ses versions — et le remplissage, côté serveur."},{"name":"Tableaux","description":"La toile sans bords : cartes, grilles, médias, formes, liens — et l’app entière, vivante, posée dessus."},{"name":"Drive","description":"Fichiers et notes rapides, rangés en dossiers — partagés ou non. Les octets ne passent jamais par nous pour les gros envois."},{"name":"Partage & contacts","description":"Des liens qui marchent pendant l’envoi, des contacts, et des objets ouverts à plusieurs."},{"name":"Post-its","description":"Le mur de papiers colorés."},{"name":"Atelier & dictées","description":"La feuille d’assemblage, et l’historique de la dictée express."},{"name":"Outils","description":"Chercher partout, corriger sans reformuler."}],"paths":{"/":{"get":{"operationId":"get-index","tags":["Compte"],"summary":"Index de l’API","description":"Vérifie la clé et dit à qui elle appartient, ce qu’elle peut faire, et où se trouve chaque ressource. Le bon premier appel pour tester une intégration.","x-quilly-access":"read","responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"name":"Quilly API","version":"1.0.0","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","key":{"name":"Mon script","permission":"write"},"resources":{"notes":"/api/v1/notes"}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/me":{"get":{"operationId":"get-me","tags":["Compte"],"summary":"Mon compte","description":"Identité, palier, réserve de stockage (et ce qui la remplit), et la clé utilisée.","x-quilly-access":"read","responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"user":{"id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","email":"ada@exemple.fr","display_name":"Ada","avatar":null},"plan":{"key":"free","name":"Libre"},"storage":{"quota_bytes":5368709120,"used_bytes":812000000,"free_bytes":4556709120},"key":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","name":"Mon script","permission":"write"}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"patch-me","tags":["Compte"],"summary":"Changer mon nom ou mon visage","description":"Le nom et la photo que voient mes contacts. Ce qu’on ne donne pas reste tel quel.","x-quilly-access":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"display_name":{"type":["string","null"],"description":"Le prénom affiché (60 caractères au plus)","example":"Ada"},"avatar":{"type":["string","null"],"description":"Une image en data-URI (128 px suffisent), ou null pour le monogramme"}},"required":[],"example":{"display_name":"Ada"}}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"user":{"id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","display_name":"Ada","avatar":null}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/notes":{"get":{"operationId":"get-notes","tags":["Notes"],"summary":"Lister les notes","description":"Les notes, des plus récemment modifiées aux plus anciennes. Par défaut, les miennes hors corbeille ; `scope=shared` rend celles qu’on me partage, rangées selon MES dossiers.","x-quilly-access":"read","parameters":[{"name":"scope","in":"query","required":false,"description":"Les miennes (défaut), ou celles qu’on me partage","schema":{"type":"string","enum":["mine","shared"],"description":"Les miennes (défaut), ou celles qu’on me partage"}},{"name":"folder_id","in":"query","required":false,"description":"Un dossier de notes, ou « none » pour ce qui n'est dans aucun","schema":{"type":"string","description":"Un dossier de notes, ou « none » pour ce qui n'est dans aucun"}},{"name":"pinned","in":"query","required":false,"description":"Seulement les épinglées (ou non)","schema":{"type":"boolean","description":"Seulement les épinglées (ou non)"}},{"name":"archived","in":"query","required":false,"description":"Seulement les archivées (ou non)","schema":{"type":"boolean","description":"Seulement les archivées (ou non)"}},{"name":"trashed","in":"query","required":false,"description":"La corbeille","schema":{"type":"boolean","description":"La corbeille"}},{"name":"q","in":"query","required":false,"description":"Recherche dans le titre et le texte","schema":{"type":"string","description":"Recherche dans le titre et le texte"}},{"name":"sort","in":"query","required":false,"description":"L’ordre (dernière modification par défaut)","schema":{"type":"string","enum":["updated_at","created_at","title"],"description":"L’ordre (dernière modification par défaut)"}},{"name":"order","in":"query","required":false,"description":"Le sens","schema":{"type":"string","enum":["asc","desc"],"description":"Le sens"}},{"name":"limit","in":"query","required":false,"description":"Combien en rendre (50 par défaut, 200 au plus)","schema":{"type":"integer","description":"Combien en rendre (50 par défaut, 200 au plus)"}},{"name":"offset","in":"query","required":false,"description":"Combien en sauter, pour la page suivante","schema":{"type":"integer","description":"Combien en sauter, pour la page suivante"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"notes":[{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","folder_id":null,"title":"Réunion produit","content":"<h2>Décisions</h2><ul><li><p>Lancer la v2 lundi</p></li></ul>","content_preview":"Décisions Lancer la v2 lundi","summary":"Les décisions de la réunion produit","is_pinned":false,"is_archived":false,"is_deleted":false,"deleted_at":null,"created_at":"2026-10-02T09:41:00.000Z","updated_at":"2026-10-02T09:41:00.000Z"}],"pagination":{"limit":50,"offset":0,"total":1,"has_more":false}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-notes","tags":["Notes"],"summary":"Créer une note","description":"Le contenu s’écrit sous UNE des trois formes : `markdown` (converti), `text` (un paragraphe par ligne) ou `content` (le HTML de l’éditeur). La note apparaît aussitôt dans l’application, sur tous les appareils.","x-quilly-access":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Le titre (500 caractères au plus)","example":"Réunion produit"},"markdown":{"type":"string","description":"Le contenu en Markdown : titres, listes, gras, italique, code, citations"},"text":{"type":"string","description":"Le contenu en texte brut"},"content":{"type":"string","description":"Le contenu en HTML"},"folder_id":{"type":["string","null"],"format":"uuid","description":"Le dossier où la ranger"},"is_pinned":{"type":"boolean","description":"L’épingler"},"is_archived":{"type":"boolean","description":"La créer archivée"}},"required":[],"example":{"title":"Réunion produit","markdown":"## Décisions\n\n- Lancer la v2 lundi"}}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"note":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","folder_id":null,"title":"Réunion produit","content":"<h2>Décisions</h2><ul><li><p>Lancer la v2 lundi</p></li></ul>","content_preview":"Décisions Lancer la v2 lundi","summary":"Les décisions de la réunion produit","is_pinned":false,"is_archived":false,"is_deleted":false,"deleted_at":null,"created_at":"2026-10-02T09:41:00.000Z","updated_at":"2026-10-02T09:41:00.000Z","markdown":"## Décisions\n\n- Lancer la v2 lundi","text":"Décisions\nLancer la v2 lundi"}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/notes/{id}":{"get":{"operationId":"get-notes-id","tags":["Notes"],"summary":"Lire une note","description":"Une note — la mienne ou une note partagée —, avec son contenu sous trois formes : `content` (HTML), `markdown` et `text`.","x-quilly-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant de la note","schema":{"type":"string","format":"uuid","description":"Identifiant de la note","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"note":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","folder_id":null,"title":"Réunion produit","content":"<h2>Décisions</h2><ul><li><p>Lancer la v2 lundi</p></li></ul>","content_preview":"Décisions Lancer la v2 lundi","summary":"Les décisions de la réunion produit","is_pinned":false,"is_archived":false,"is_deleted":false,"deleted_at":null,"created_at":"2026-10-02T09:41:00.000Z","updated_at":"2026-10-02T09:41:00.000Z","markdown":"## Décisions\n\n- Lancer la v2 lundi","text":"Décisions\nLancer la v2 lundi"}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"patch-notes-id","tags":["Notes"],"summary":"Modifier une note","description":"N’écrit que les champs donnés. `is_deleted: true` la met à la corbeille, `false` l’en sort.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant de la note","schema":{"type":"string","format":"uuid","description":"Identifiant de la note","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Le titre"},"markdown":{"type":"string","description":"Le nouveau contenu, en Markdown"},"text":{"type":"string","description":"Le nouveau contenu, en texte brut"},"content":{"type":"string","description":"Le nouveau contenu, en HTML"},"folder_id":{"type":["string","null"],"format":"uuid","description":"La ranger ailleurs (null : hors dossier)"},"is_pinned":{"type":"boolean","description":"Épingler"},"is_archived":{"type":"boolean","description":"Archiver"},"is_deleted":{"type":"boolean","description":"Corbeille"}},"required":[],"example":{"is_pinned":true}}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"note":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","folder_id":null,"title":"Réunion produit","content":"<h2>Décisions</h2><ul><li><p>Lancer la v2 lundi</p></li></ul>","content_preview":"Décisions Lancer la v2 lundi","summary":"Les décisions de la réunion produit","is_pinned":true,"is_archived":false,"is_deleted":false,"deleted_at":null,"created_at":"2026-10-02T09:41:00.000Z","updated_at":"2026-10-02T09:41:00.000Z","markdown":"## Décisions\n\n- Lancer la v2 lundi","text":"Décisions\nLancer la v2 lundi"}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"delete-notes-id","tags":["Notes"],"summary":"Supprimer une note","description":"À la corbeille, comme dans l’application. `permanent=true` la supprime pour de bon.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant de la note","schema":{"type":"string","format":"uuid","description":"Identifiant de la note","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},{"name":"permanent","in":"query","required":false,"description":"Supprimer définitivement","schema":{"type":"boolean","description":"Supprimer définitivement"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"note":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","folder_id":null,"title":"Réunion produit","content":"<h2>Décisions</h2><ul><li><p>Lancer la v2 lundi</p></li></ul>","content_preview":"Décisions Lancer la v2 lundi","summary":"Les décisions de la réunion produit","is_pinned":false,"is_archived":false,"is_deleted":true,"deleted_at":"2026-10-02T09:41:00.000Z","created_at":"2026-10-02T09:41:00.000Z","updated_at":"2026-10-02T09:41:00.000Z","markdown":"## Décisions\n\n- Lancer la v2 lundi","text":"Décisions\nLancer la v2 lundi"}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/notes/{id}/append":{"post":{"operationId":"post-notes-id-append","tags":["Notes"],"summary":"Ajouter à la fin","description":"Prolonge une note sans la réécrire — le geste d’un journal, d’un relevé, d’un agent qui consigne. Mêmes formes qu’à la création.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant de la note","schema":{"type":"string","format":"uuid","description":"Identifiant de la note","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"markdown":{"type":"string","description":"Ce qu’on ajoute, en Markdown"},"text":{"type":"string","description":"Ce qu’on ajoute, en texte brut"},"content":{"type":"string","description":"Ce qu’on ajoute, en HTML"}},"required":[],"example":{"markdown":"- 18 h : appel client terminé"}}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"note":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","folder_id":null,"title":"Réunion produit","content":"<h2>Décisions</h2><ul><li><p>Lancer la v2 lundi</p></li></ul>","content_preview":"Décisions Lancer la v2 lundi","summary":"Les décisions de la réunion produit","is_pinned":false,"is_archived":false,"is_deleted":false,"deleted_at":null,"created_at":"2026-10-02T09:41:00.000Z","updated_at":"2026-10-02T09:41:00.000Z","markdown":"## Décisions\n\n- Lancer la v2 lundi","text":"Décisions\nLancer la v2 lundi"}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/notes/{id}/restore":{"post":{"operationId":"post-notes-id-restore","tags":["Notes"],"summary":"Restaurer de la corbeille","description":"Sort une note de la corbeille, là où elle était.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant de la note","schema":{"type":"string","format":"uuid","description":"Identifiant de la note","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"note":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","folder_id":null,"title":"Réunion produit","content":"<h2>Décisions</h2><ul><li><p>Lancer la v2 lundi</p></li></ul>","content_preview":"Décisions Lancer la v2 lundi","summary":"Les décisions de la réunion produit","is_pinned":false,"is_archived":false,"is_deleted":false,"deleted_at":null,"created_at":"2026-10-02T09:41:00.000Z","updated_at":"2026-10-02T09:41:00.000Z","markdown":"## Décisions\n\n- Lancer la v2 lundi","text":"Décisions\nLancer la v2 lundi"}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/notes/{id}/analyze":{"post":{"operationId":"post-notes-id-analyze","tags":["Notes"],"summary":"Résumer en une phrase","description":"L’IA écrit ce que contient la note, en une phrase (`summary`), comme sur sa carte. Le titre et le texte ne sont jamais touchés ; une note inchangée n’est pas réanalysée.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant de la note","schema":{"type":"string","format":"uuid","description":"Identifiant de la note","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"analyzed":true,"note":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","folder_id":null,"title":"Réunion produit","content":"<h2>Décisions</h2><ul><li><p>Lancer la v2 lundi</p></li></ul>","content_preview":"Décisions Lancer la v2 lundi","summary":"Les décisions de la réunion produit","is_pinned":false,"is_archived":false,"is_deleted":false,"deleted_at":null,"created_at":"2026-10-02T09:41:00.000Z","updated_at":"2026-10-02T09:41:00.000Z","markdown":"## Décisions\n\n- Lancer la v2 lundi","text":"Décisions\nLancer la v2 lundi"}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/notes/trash":{"delete":{"operationId":"delete-notes-trash","tags":["Notes"],"summary":"Vider la corbeille","description":"Supprime définitivement toutes les notes de la corbeille, et rend leur place.","x-quilly-access":"write","responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"deleted":4}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/folders":{"get":{"operationId":"get-folders","tags":["Notes"],"summary":"Lister les dossiers","description":"Les dossiers de notes dans leur ordre, chacun avec son nombre de notes (hors archives et corbeille).","x-quilly-access":"read","responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"folders":[{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","name":"Travail","color":"#2563EB","icon":"folder","position":0,"note_count":12}]}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-folders","tags":["Notes"],"summary":"Créer un dossier","description":"Posé à la fin de la liste.","x-quilly-access":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Son nom","example":"Travail"},"color":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","description":"Sa couleur, #RRGGBB","example":"#2563EB"},"icon":{"type":"string","description":"Son icône"}},"required":["name"],"example":{"name":"Travail","color":"#2563EB"}}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"folder":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","name":"Travail","color":"#2563EB","position":3,"note_count":0}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/folders/{id}":{"get":{"operationId":"get-folders-id","tags":["Notes"],"summary":"Lire un dossier","description":"Le dossier et son nombre de notes.","x-quilly-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du dossier","schema":{"type":"string","format":"uuid","description":"Identifiant du dossier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"patch-folders-id","tags":["Notes"],"summary":"Modifier un dossier","description":"Nom, couleur, icône, position.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du dossier","schema":{"type":"string","format":"uuid","description":"Identifiant du dossier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Son nom"},"color":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","description":"Sa couleur"},"icon":{"type":"string","description":"Son icône"},"position":{"type":"integer","description":"Sa place"}},"required":[],"example":{"name":"Travail · 2026"}}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"delete-folders-id","tags":["Notes"],"summary":"Supprimer un dossier","description":"Ses notes ne partent pas : elles quittent simplement le dossier.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du dossier","schema":{"type":"string","format":"uuid","description":"Identifiant du dossier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"deleted":true,"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/folders/order":{"put":{"operationId":"put-folders-order","tags":["Notes"],"summary":"Réordonner les dossiers","description":"Les dossiers nommés d’abord, dans cet ordre ; les autres suivent dans le leur.","x-quilly-access":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Les dossiers, dans l’ordre voulu"}},"required":["ids"],"example":{"ids":["3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30"]}}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/todos":{"get":{"operationId":"get-todos","tags":["Tâches"],"summary":"Lister les tâches","description":"Ce qui n’est pas fait d’abord, puis dans l’ordre de la liste. Par défaut, les miennes ET celles des listes qu’on me partage — la vue « Tout ».","x-quilly-access":"read","parameters":[{"name":"scope","in":"query","required":false,"description":"Toutes (défaut), les miennes, ou celles des listes partagées","schema":{"type":"string","enum":["all","mine","shared"],"description":"Toutes (défaut), les miennes, ou celles des listes partagées"}},{"name":"list_id","in":"query","required":false,"description":"Une liste, ou « none »","schema":{"type":"string","description":"Une liste, ou « none »"}},{"name":"tier_id","in":"query","required":false,"description":"Une catégorie, ou « none » pour « À trier »","schema":{"type":"string","description":"Une catégorie, ou « none » pour « À trier »"}},{"name":"done","in":"query","required":false,"description":"Faites, ou à faire","schema":{"type":"boolean","description":"Faites, ou à faire"}},{"name":"note_id","in":"query","required":false,"description":"Les tâches nées d’une note","schema":{"type":"string","description":"Les tâches nées d’une note"}},{"name":"q","in":"query","required":false,"description":"Recherche dans le titre et les détails","schema":{"type":"string","description":"Recherche dans le titre et les détails"}},{"name":"limit","in":"query","required":false,"description":"Combien en rendre (100 par défaut, 500 au plus)","schema":{"type":"integer","description":"Combien en rendre (100 par défaut, 500 au plus)"}},{"name":"offset","in":"query","required":false,"description":"Combien en sauter, pour la page suivante","schema":{"type":"integer","description":"Combien en sauter, pour la page suivante"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"todos":[{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","list_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","tier_id":null,"note_id":null,"title":"Envoyer le devis","short_title":null,"details":"","done":false,"done_at":null,"done_by":null,"created_by":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","position":-1,"flag":0,"level":2,"week_block_id":null,"week_date":null,"week_done":null,"created_at":"2026-10-02T09:41:00.000Z","updated_at":"2026-10-02T09:41:00.000Z"}],"pagination":{"limit":50,"offset":0,"total":1,"has_more":false}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-todos","tags":["Tâches"],"summary":"Ajouter une tâche","description":"Elle arrive en tête de sa liste (la première si on n’en précise pas), « À trier ». Un titre long reçoit son titre court, résumé par l’IA comme dans l’application.","x-quilly-access":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Ce qu’il faut faire","example":"Envoyer le devis"},"details":{"type":"string","description":"Les détails"},"list_id":{"type":["string","null"],"format":"uuid","description":"La liste (la première par défaut)"},"tier_id":{"type":["string","null"],"format":"uuid","description":"La catégorie (« À trier » par défaut)"},"note_id":{"type":["string","null"],"format":"uuid","description":"La note dont elle sort"},"done":{"type":"boolean","description":"Déjà faite"},"position":{"type":"integer","description":"Sa place (en tête par défaut)"}},"required":["title"],"example":{"title":"Envoyer le devis"}}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"todo":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","list_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","tier_id":null,"note_id":null,"title":"Envoyer le devis","short_title":null,"details":"","done":false,"done_at":null,"done_by":null,"created_by":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","position":-1,"flag":0,"level":2,"week_block_id":null,"week_date":null,"week_done":null,"created_at":"2026-10-02T09:41:00.000Z","updated_at":"2026-10-02T09:41:00.000Z"}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/todos/{id}":{"get":{"operationId":"get-todos-id","tags":["Tâches"],"summary":"Lire une tâche","description":"Une tâche, la mienne ou celle d’une liste partagée.","x-quilly-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant de la tâche","schema":{"type":"string","format":"uuid","description":"Identifiant de la tâche","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"todo":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","list_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","tier_id":null,"note_id":null,"title":"Envoyer le devis","short_title":null,"details":"","done":false,"done_at":null,"done_by":null,"created_by":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","position":-1,"flag":0,"level":2,"week_block_id":null,"week_date":null,"week_done":null,"created_at":"2026-10-02T09:41:00.000Z","updated_at":"2026-10-02T09:41:00.000Z"}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"patch-todos-id","tags":["Tâches"],"summary":"Cocher, renommer, ranger","description":"`done` coche (la date et l’auteur de la coche suivent, et Aelby Week est prévenu si la tâche y a été envoyée). `tier_id` la range sur l’échelle, `list_id` la change de liste, `position` la déplace.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant de la tâche","schema":{"type":"string","format":"uuid","description":"Identifiant de la tâche","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"done":{"type":"boolean","description":"Faite ou non"},"title":{"type":"string","description":"Ce qu’il faut faire"},"details":{"type":"string","description":"Les détails"},"list_id":{"type":["string","null"],"format":"uuid","description":"La liste"},"tier_id":{"type":["string","null"],"format":"uuid","description":"La catégorie (null : « À trier »)"},"note_id":{"type":["string","null"],"format":"uuid","description":"La note liée"},"position":{"type":"integer","description":"Sa place"}},"required":[],"example":{"done":true}}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"todo":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","list_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","tier_id":null,"note_id":null,"title":"Envoyer le devis","short_title":null,"details":"","done":true,"done_at":"2026-10-02T09:41:00.000Z","done_by":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","created_by":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","position":-1,"flag":0,"level":2,"week_block_id":null,"week_date":null,"week_done":null,"created_at":"2026-10-02T09:41:00.000Z","updated_at":"2026-10-02T09:41:00.000Z"}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"delete-todos-id","tags":["Tâches"],"summary":"Supprimer une tâche","description":"Définitif.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant de la tâche","schema":{"type":"string","format":"uuid","description":"Identifiant de la tâche","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"deleted":true,"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/todo-lists":{"get":{"operationId":"get-todo-lists","tags":["Tâches"],"summary":"Lister les listes","description":"Mes listes dans l’ordre du rail, puis celles qu’on me partage (`shared: true`), avec leurs compteurs. `include=todos` joint leurs tâches.","x-quilly-access":"read","parameters":[{"name":"include","in":"query","required":false,"description":"Joindre les tâches de chaque liste","schema":{"type":"string","enum":["todos"],"description":"Joindre les tâches de chaque liste"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"todo_lists":[{"id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","name":"Tâches","position":0,"shared":false,"todo_count":8,"done_count":3}]}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-todo-lists","tags":["Tâches"],"summary":"Créer une liste","description":"Posée au bout du rail.","x-quilly-access":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Son nom","example":"Courses"}},"required":["name"],"example":{"name":"Courses"}}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/todo-lists/{id}":{"get":{"operationId":"get-todo-lists-id","tags":["Tâches"],"summary":"Lire une liste","description":"La liste et toutes ses tâches.","x-quilly-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant de la liste","schema":{"type":"string","format":"uuid","description":"Identifiant de la liste","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"patch-todo-lists-id","tags":["Tâches"],"summary":"Renommer ou déplacer une liste","description":"Son nom, sa place dans le rail.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant de la liste","schema":{"type":"string","format":"uuid","description":"Identifiant de la liste","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Son nom"},"position":{"type":"integer","description":"Sa place"}},"required":[]}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"delete-todo-lists-id","tags":["Tâches"],"summary":"Supprimer une liste","description":"Le sort de ses tâches se décide : par défaut elles rejoignent `move_to` (ou ma première autre liste) ; `todos=delete` les emporte avec elle.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant de la liste","schema":{"type":"string","format":"uuid","description":"Identifiant de la liste","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},{"name":"todos","in":"query","required":false,"description":"Déplacer (défaut) ou supprimer ses tâches","schema":{"type":"string","enum":["move","delete"],"description":"Déplacer (défaut) ou supprimer ses tâches"}},{"name":"move_to","in":"query","required":false,"description":"La liste qui les reçoit","schema":{"type":"string","format":"uuid","description":"La liste qui les reçoit"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"deleted":true,"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","todos":"moved","moved_to":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/todo-lists/order":{"put":{"operationId":"put-todo-lists-order","tags":["Tâches"],"summary":"Réordonner les listes","description":"L’ordre du rail.","x-quilly-access":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Les listes, dans l’ordre voulu"}},"required":["ids"]}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/todo-tiers":{"get":{"operationId":"get-todo-tiers","tags":["Tâches"],"summary":"Lister les catégories","description":"L’échelle, du plus pressant au plus rêvé (« Au plus vite » → « Idées »). Posée au premier appel, comme à la première ouverture des Tâches.","x-quilly-access":"read","responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"todo_tiers":[{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","name":"Au plus vite","color":"red","position":0,"mine":true}]}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-todo-tiers","tags":["Tâches"],"summary":"Créer une catégorie","description":"Posée en bas de l’échelle.","x-quilly-access":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Son nom (60 caractères au plus)","example":"Cette semaine"},"color":{"type":"string","enum":["red","orange","amber","lime","green","teal","sky","blue","violet","pink","slate"],"description":"Sa teinte"}},"required":["name"],"example":{"name":"Cette semaine","color":"amber"}}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/todo-tiers/{id}":{"patch":{"operationId":"patch-todo-tiers-id","tags":["Tâches"],"summary":"Modifier une catégorie","description":"Nom, teinte, place sur l’échelle.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant de la catégorie","schema":{"type":"string","format":"uuid","description":"Identifiant de la catégorie","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Son nom"},"color":{"type":"string","enum":["red","orange","amber","lime","green","teal","sky","blue","violet","pink","slate"],"description":"Sa teinte"},"position":{"type":"integer","description":"Sa place"}},"required":[]}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"delete-todo-tiers-id","tags":["Tâches"],"summary":"Supprimer une catégorie","description":"Ses tâches retournent « À trier » : aucune n’est perdue.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant de la catégorie","schema":{"type":"string","format":"uuid","description":"Identifiant de la catégorie","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"deleted":true,"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/todo-tiers/order":{"put":{"operationId":"put-todo-tiers-order","tags":["Tâches"],"summary":"Réordonner l’échelle","description":"Du plus pressant au plus rêvé.","x-quilly-access":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Les catégories, dans l’ordre voulu"}},"required":["ids"]}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/prompts":{"get":{"operationId":"get-prompts","tags":["Prompts"],"summary":"Lister les prompts","description":"Les épinglés d’abord, puis l’ordre choisi. Chaque prompt arrive avec ses variables lues, ses blocs et son plan. La recherche ignore accents et casse, et lit titres, résumés et textes.","x-quilly-access":"read","parameters":[{"name":"scope","in":"query","required":false,"description":"Les miens (défaut), ceux qu’on me partage, ou tous","schema":{"type":"string","enum":["mine","shared","all"],"description":"Les miens (défaut), ceux qu’on me partage, ou tous"}},{"name":"folder_id","in":"query","required":false,"description":"Un dossier de prompts, ou « none » pour ce qui n'est dans aucun","schema":{"type":"string","description":"Un dossier de prompts, ou « none » pour ce qui n'est dans aucun"}},{"name":"pinned","in":"query","required":false,"description":"Les épinglés","schema":{"type":"boolean","description":"Les épinglés"}},{"name":"used","in":"query","required":false,"description":"Ceux déjà copiés au moins une fois","schema":{"type":"boolean","description":"Ceux déjà copiés au moins une fois"}},{"name":"q","in":"query","required":false,"description":"Recherche dans les titres, résumés et textes","schema":{"type":"string","description":"Recherche dans les titres, résumés et textes"}},{"name":"sort","in":"query","required":false,"description":"L’ordre ; `use_count` classe par usage","schema":{"type":"string","enum":["position","updated_at","created_at","title","use_count","last_used_at"],"description":"L’ordre ; `use_count` classe par usage"}},{"name":"order","in":"query","required":false,"description":"Le sens","schema":{"type":"string","enum":["asc","desc"],"description":"Le sens"}},{"name":"limit","in":"query","required":false,"description":"Combien en rendre (100 par défaut, 500 au plus)","schema":{"type":"integer","description":"Combien en rendre (100 par défaut, 500 au plus)"}},{"name":"offset","in":"query","required":false,"description":"Combien en sauter, pour la page suivante","schema":{"type":"integer","description":"Combien en sauter, pour la page suivante"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"prompts":[{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","folder_id":null,"title":"Traduire un mail","content":"Traduis ce mail en {{langue|anglais|espagnol}}, ton {{ton:cordial}} :\n\n{{mail…}}","summary":"Traduit un mail dans la langue et le ton choisis","position":0,"use_count":12,"last_used_at":"2026-10-02T09:41:00.000Z","pinned_at":null,"pinned":false,"analysis_hash":"a1b2c3","created_at":"2026-10-02T09:41:00.000Z","updated_at":"2026-10-02T09:41:00.000Z","variables":[{"key":"langue","name":"langue","label":"Langue","kind":"choice","options":["anglais","espagnol"],"default":null},{"key":"ton","name":"ton","label":"Ton","kind":"text","options":[],"default":"cordial"},{"key":"mail","name":"mail","label":"Mail","kind":"long","options":[],"default":null}],"includes":[],"sections":[]}],"pagination":{"limit":50,"offset":0,"total":1,"has_more":false}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-prompts","tags":["Prompts"],"summary":"Créer un prompt","description":"Les variables s’écrivent `{{nom}}` (texte court), `{{nom…}}` (texte long), `{{nom|a|b}}` (choix), `{{nom:valeur}}` (valeur d’office), `{{date}}` ; un bloc `{{> Titre}}` insère un autre prompt.","x-quilly-access":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"Le texte du prompt","example":"Résume {{texte…}} en {{nombre:3}} points."},"title":{"type":"string","description":"Son titre","example":"Résumer"},"folder_id":{"type":["string","null"],"format":"uuid","description":"Son dossier"},"pinned":{"type":"boolean","description":"L’épingler"}},"required":["content"],"example":{"title":"Résumer","content":"Résume {{texte…}} en {{nombre:3}} points."}}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/prompts/{id}":{"get":{"operationId":"get-prompts-id","tags":["Prompts"],"summary":"Lire un prompt","description":"Avec ses variables, ses blocs et son plan.","x-quilly-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du prompt","schema":{"type":"string","format":"uuid","description":"Identifiant du prompt","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"prompt":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","folder_id":null,"title":"Traduire un mail","content":"Traduis ce mail en {{langue|anglais|espagnol}}, ton {{ton:cordial}} :\n\n{{mail…}}","summary":"Traduit un mail dans la langue et le ton choisis","position":0,"use_count":12,"last_used_at":"2026-10-02T09:41:00.000Z","pinned_at":null,"pinned":false,"analysis_hash":"a1b2c3","created_at":"2026-10-02T09:41:00.000Z","updated_at":"2026-10-02T09:41:00.000Z","variables":[{"key":"langue","name":"langue","label":"Langue","kind":"choice","options":["anglais","espagnol"],"default":null},{"key":"ton","name":"ton","label":"Ton","kind":"text","options":[],"default":"cordial"},{"key":"mail","name":"mail","label":"Mail","kind":"long","options":[],"default":null}],"includes":[],"sections":[]}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"patch-prompts-id","tags":["Prompts"],"summary":"Modifier un prompt","description":"L’état d’avant est gardé en version par la base (au plus une par quart d’heure d’écriture). Le renommer met à jour les blocs `{{> …}}` qui l’insèrent ailleurs.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du prompt","schema":{"type":"string","format":"uuid","description":"Identifiant du prompt","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Son titre"},"content":{"type":"string","description":"Son texte"},"folder_id":{"type":["string","null"],"format":"uuid","description":"Son dossier"},"pinned":{"type":"boolean","description":"Épinglé"},"position":{"type":"integer","description":"Sa place"}},"required":[],"example":{"pinned":true}}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"delete-prompts-id","tags":["Prompts"],"summary":"Supprimer un prompt","description":"Avec ses versions.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du prompt","schema":{"type":"string","format":"uuid","description":"Identifiant du prompt","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"deleted":true,"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/prompts/{id}/render":{"post":{"operationId":"post-prompts-id-render","tags":["Prompts"],"summary":"Remplir un prompt","description":"Ce que fait la feuille « Remplir » : les blocs sont insérés, chaque variable prend sa valeur — désignée par son nom, sans accents ni casse — ou sa valeur d’office. Une variable laissée vide garde son jeton, et `missing` la nomme. `mark_used: true` le compte comme copié (clé en écriture).","x-quilly-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du prompt","schema":{"type":"string","format":"uuid","description":"Identifiant du prompt","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"values":{"type":"object","additionalProperties":true,"description":"Les valeurs, par nom de variable","example":{"langue":"anglais","mail":"Bonjour…"}},"mark_used":{"type":"boolean","description":"Le compter comme utilisé"}},"required":[],"example":{"values":{"langue":"anglais","mail":"Bonjour Marc, …"}}}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"text":"Traduis ce mail en anglais, ton cordial :\n\nBonjour Marc, …","variables":[{"key":"langue","name":"langue","label":"Langue","kind":"choice","options":["anglais","espagnol"],"default":null},{"key":"ton","name":"ton","label":"Ton","kind":"text","options":[],"default":"cordial"},{"key":"mail","name":"mail","label":"Mail","kind":"long","options":[],"default":null}],"missing":[],"includes":{"used":[],"missing":[],"loops":[]}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/prompts/{id}/use":{"post":{"operationId":"post-prompts-id-use","tags":["Prompts"],"summary":"Marquer comme utilisé","description":"Il remonte dans « Récents » et son compteur d’usage avance — atomiquement, en base.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du prompt","schema":{"type":"string","format":"uuid","description":"Identifiant du prompt","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/prompts/{id}/analyze":{"post":{"operationId":"post-prompts-id-analyze","tags":["Prompts"],"summary":"Analyser avec l’IA","description":"Les variables écrites n’importe comment (`[SUJET]`, `<texte>`, `XXX`…) sont ramenées à la norme `{{…}}`, le résumé de ce que FAIT le prompt est écrit, un titre est trouvé s’il en manque. L’état d’avant reste en version.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du prompt","schema":{"type":"string","format":"uuid","description":"Identifiant du prompt","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"analyzed":true,"prompt":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","folder_id":null,"title":"Traduire un mail","content":"Traduis ce mail en {{langue|anglais|espagnol}}, ton {{ton:cordial}} :\n\n{{mail…}}","summary":"Traduit un mail dans la langue et le ton choisis","position":0,"use_count":12,"last_used_at":"2026-10-02T09:41:00.000Z","pinned_at":null,"pinned":false,"analysis_hash":"a1b2c3","created_at":"2026-10-02T09:41:00.000Z","updated_at":"2026-10-02T09:41:00.000Z","variables":[{"key":"langue","name":"langue","label":"Langue","kind":"choice","options":["anglais","espagnol"],"default":null},{"key":"ton","name":"ton","label":"Ton","kind":"text","options":[],"default":"cordial"},{"key":"mail","name":"mail","label":"Mail","kind":"long","options":[],"default":null}],"includes":[],"sections":[]}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/prompts/{id}/versions":{"get":{"operationId":"get-prompts-id-versions","tags":["Prompts"],"summary":"Lister les versions","description":"Les états qu’il a quittés, du plus récent au plus ancien. `source` : `edit` (avant une séance d’écriture), `ai` (avant une analyse), `restore` (avant un retour).","x-quilly-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du prompt","schema":{"type":"string","format":"uuid","description":"Identifiant du prompt","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"versions":[{"id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","prompt_id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","title":"Traduire un mail","content":"Traduis ce mail en [LANGUE]…","source":"ai","created_at":"2026-10-02T09:41:00.000Z"}]}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/prompts/{id}/versions/{versionId}/restore":{"post":{"operationId":"post-prompts-id-versions-versionid-restore","tags":["Prompts"],"summary":"Revenir à une version","description":"L’état présent devient une version à son tour : rien n’est perdu.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du prompt","schema":{"type":"string","format":"uuid","description":"Identifiant du prompt","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},{"name":"versionId","in":"path","required":true,"description":"Identifiant de la version","schema":{"type":"string","format":"uuid","description":"Identifiant de la version","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/prompt-folders":{"get":{"operationId":"get-prompt-folders","tags":["Prompts"],"summary":"Lister les dossiers","description":"À plat ; `parent_id` dessine l’arborescence. Chacun avec son nombre de prompts.","x-quilly-access":"read","responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-prompt-folders","tags":["Prompts"],"summary":"Créer un dossier","description":"À la racine, ou dans `parent_id`.","x-quilly-access":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Son nom","example":"Écriture"},"color":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","description":"Sa couleur"},"parent_id":{"type":["string","null"],"format":"uuid","description":"Le dossier parent"}},"required":["name"],"example":{"name":"Écriture"}}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/prompt-folders/{id}":{"patch":{"operationId":"patch-prompt-folders-id","tags":["Prompts"],"summary":"Modifier un dossier","description":"Renommer, recolorer, déplacer — jamais sous lui-même.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du dossier","schema":{"type":"string","format":"uuid","description":"Identifiant du dossier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Son nom"},"color":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","description":"Sa couleur"},"parent_id":{"type":["string","null"],"format":"uuid","description":"Le dossier parent"},"position":{"type":"integer","description":"Sa place"}},"required":[]}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"delete-prompt-folders-id","tags":["Prompts"],"summary":"Supprimer un dossier","description":"Ses sous-dossiers partent avec ; ses prompts restent, hors dossier.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du dossier","schema":{"type":"string","format":"uuid","description":"Identifiant du dossier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"deleted":true,"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/boards":{"get":{"operationId":"get-boards","tags":["Tableaux"],"summary":"Lister les tableaux","description":"Avec leur silhouette (`preview`) : de quoi les reconnaître sans rien charger. Les miens et ceux qu’on me partage (`shared: true`).","x-quilly-access":"read","parameters":[{"name":"scope","in":"query","required":false,"description":"Tous (défaut), les miens, ou les partagés","schema":{"type":"string","enum":["all","mine","shared"],"description":"Tous (défaut), les miens, ou les partagés"}},{"name":"folder_id","in":"query","required":false,"description":"Un dossier de tableaux, ou « none » pour ce qui n'est dans aucun","schema":{"type":"string","description":"Un dossier de tableaux, ou « none » pour ce qui n'est dans aucun"}},{"name":"q","in":"query","required":false,"description":"Recherche dans les titres","schema":{"type":"string","description":"Recherche dans les titres"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-boards","tags":["Tableaux"],"summary":"Créer un tableau","description":"Un tableau vide.","x-quilly-access":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Son titre","example":"Lancement v2"},"folder_id":{"type":["string","null"],"format":"uuid","description":"Son dossier"},"grid":{"type":"boolean","description":"Afficher la trame de points"}},"required":[],"example":{"title":"Lancement v2"}}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/boards/{id}":{"get":{"operationId":"get-boards-id","tags":["Tableaux"],"summary":"Lire un tableau","description":"Le tableau, ses éléments (du plan le plus bas au plus haut) et ses liens. `include` pour n’en demander qu’une partie.","x-quilly-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du tableau","schema":{"type":"string","format":"uuid","description":"Identifiant du tableau","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},{"name":"include","in":"query","required":false,"description":"« items », « links », les deux séparés d’une virgule, ou « none »","schema":{"type":"string","description":"« items », « links », les deux séparés d’une virgule, ou « none »"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"patch-boards-id","tags":["Tableaux"],"summary":"Modifier un tableau","description":"Titre, dossier, trame.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du tableau","schema":{"type":"string","format":"uuid","description":"Identifiant du tableau","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Son titre"},"folder_id":{"type":["string","null"],"format":"uuid","description":"Son dossier"},"grid":{"type":"boolean","description":"La trame de points"}},"required":[]}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"delete-boards-id","tags":["Tableaux"],"summary":"Supprimer un tableau","description":"Ses éléments et ses liens partent avec ; les fichiers du Drive, jamais.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du tableau","schema":{"type":"string","format":"uuid","description":"Identifiant du tableau","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"deleted":true,"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/boards/{id}/items":{"get":{"operationId":"get-boards-id-items","tags":["Tableaux"],"summary":"Lister les éléments","description":"Du plus bas au plus haut plan.","x-quilly-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du tableau","schema":{"type":"string","format":"uuid","description":"Identifiant du tableau","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-boards-id-items","tags":["Tableaux"],"summary":"Poser des éléments","description":"Un élément, ou un lot (`items: […]`, 200 au plus) en une écriture. Sans `x`/`y`, il se pose à côté de ce qui existe, sans rien recouvrir. Raccourcis : `text` écrit une carte de texte, `ref` pose un prompt, une note, une liste de tâches ou un dossier du Drive VIVANTS — jamais une copie.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du tableau","schema":{"type":"string","format":"uuid","description":"Identifiant du tableau","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["text","table","image","video","audio","ink","shape","prompt","note","todo_list","drive_folder"],"description":"Ce qu’on pose"},"text":{"type":"string","description":"Carte de texte : son texte, un paragraphe par ligne"},"ref":{"type":"string","format":"uuid","description":"Élément vivant : le prompt, la note, la liste ou le dossier montré"},"transfer_id":{"type":"string","format":"uuid","description":"Média : le fichier du Drive montré"},"x":{"type":"number","description":"Abscisse, en pixels du monde"},"y":{"type":"number","description":"Ordonnée"},"w":{"type":"number","description":"Largeur (selon le genre par défaut)"},"h":{"type":"number","description":"Hauteur"},"z":{"type":"integer","description":"Plan (au-dessus de tout par défaut)"},"content":{"type":"object","additionalProperties":true,"description":"Le contenu brut (document, cellules, trait…)"},"style":{"type":"object","additionalProperties":true,"description":"L’allure : fill, size, align, color…","example":{"fill":"yellow"}},"locked":{"type":"boolean","description":"Verrouillé (décor)"},"items":{"type":"array","items":{"type":"object","additionalProperties":true},"description":"Un lot d’éléments, à la place de ce qui précède"}},"required":["kind"],"example":{"kind":"text","text":"Objectifs du trimestre","style":{"fill":"yellow"}}}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/boards/{id}/items/{itemId}":{"patch":{"operationId":"patch-boards-id-items-itemid","tags":["Tableaux"],"summary":"Modifier un élément","description":"Déplacer, redimensionner, réécrire, restyler, verrouiller. `content` et `style` remplacent l’objet entier.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du tableau","schema":{"type":"string","format":"uuid","description":"Identifiant du tableau","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},{"name":"itemId","in":"path","required":true,"description":"Identifiant de l’élément","schema":{"type":"string","format":"uuid","description":"Identifiant de l’élément","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"x":{"type":"number","description":"Abscisse"},"y":{"type":"number","description":"Ordonnée"},"w":{"type":"number","description":"Largeur"},"h":{"type":"number","description":"Hauteur"},"z":{"type":"integer","description":"Plan"},"text":{"type":"string","description":"Le nouveau texte d’une carte"},"content":{"type":"object","additionalProperties":true,"description":"Le contenu brut"},"style":{"type":"object","additionalProperties":true,"description":"L’allure"},"locked":{"type":"boolean","description":"Verrouillé"}},"required":[],"example":{"x":480,"y":120}}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"delete-boards-id-items-itemid","tags":["Tableaux"],"summary":"Retirer un élément","description":"Ses liens partent avec.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du tableau","schema":{"type":"string","format":"uuid","description":"Identifiant du tableau","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},{"name":"itemId","in":"path","required":true,"description":"Identifiant de l’élément","schema":{"type":"string","format":"uuid","description":"Identifiant de l’élément","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"deleted":true,"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/boards/{id}/links":{"get":{"operationId":"get-boards-id-links","tags":["Tableaux"],"summary":"Lister les liens","description":"Les liens entre éléments du tableau.","x-quilly-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du tableau","schema":{"type":"string","format":"uuid","description":"Identifiant du tableau","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-boards-id-links","tags":["Tableaux"],"summary":"Relier deux éléments","description":"Le lien suit les éléments quand on les déplace.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du tableau","schema":{"type":"string","format":"uuid","description":"Identifiant du tableau","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"from_id":{"type":"string","format":"uuid","description":"L’élément de départ"},"to_id":{"type":"string","format":"uuid","description":"L’élément d’arrivée"},"style":{"type":"object","additionalProperties":true,"description":"color (ink, red, orange, yellow, green, blue, violet, pink), dash, arrow (none, end, both)","example":{"color":"blue","arrow":"end"}}},"required":["from_id","to_id"],"example":{"from_id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","to_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","style":{"arrow":"end"}}}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/boards/{id}/links/{linkId}":{"patch":{"operationId":"patch-boards-id-links-linkid","tags":["Tableaux"],"summary":"Restyler un lien","description":"Son encre, son trait, ses flèches.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du tableau","schema":{"type":"string","format":"uuid","description":"Identifiant du tableau","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},{"name":"linkId","in":"path","required":true,"description":"Identifiant du lien","schema":{"type":"string","format":"uuid","description":"Identifiant du lien","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"style":{"type":"object","additionalProperties":true,"description":"color, dash, arrow"}},"required":["style"]}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"delete-boards-id-links-linkid","tags":["Tableaux"],"summary":"Supprimer un lien","description":"Les éléments restent.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du tableau","schema":{"type":"string","format":"uuid","description":"Identifiant du tableau","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},{"name":"linkId","in":"path","required":true,"description":"Identifiant du lien","schema":{"type":"string","format":"uuid","description":"Identifiant du lien","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"deleted":true,"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/board-folders":{"get":{"operationId":"get-board-folders","tags":["Tableaux"],"summary":"Lister les dossiers","description":"À plat ; `parent_id` dessine l’arborescence.","x-quilly-access":"read","responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-board-folders","tags":["Tableaux"],"summary":"Créer un dossier","description":"À la racine, ou dans `parent_id`.","x-quilly-access":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Son nom","example":"Clients"},"color":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","description":"Sa couleur"},"parent_id":{"type":["string","null"],"format":"uuid","description":"Le dossier parent"}},"required":["name"],"example":{"name":"Clients"}}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/board-folders/{id}":{"patch":{"operationId":"patch-board-folders-id","tags":["Tableaux"],"summary":"Modifier un dossier","description":"Les cycles sont refusés par la base.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du dossier","schema":{"type":"string","format":"uuid","description":"Identifiant du dossier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Son nom"},"color":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","description":"Sa couleur"},"parent_id":{"type":["string","null"],"format":"uuid","description":"Le dossier parent"}},"required":[]}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"delete-board-folders-id","tags":["Tableaux"],"summary":"Supprimer un dossier","description":"Sans rien perdre : son contenu remonte d’un cran, puis il s’en va.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du dossier","schema":{"type":"string","format":"uuid","description":"Identifiant du dossier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"deleted":true,"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","moved_to":null}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/files":{"get":{"operationId":"get-files","tags":["Drive"],"summary":"Lister les fichiers","description":"Le Drive et le fil Transfert : les fichiers ET les notes rapides (`kind: text`), du plus récent au plus ancien. Ceux des dossiers partagés dont je suis membre en font partie.","x-quilly-access":"read","parameters":[{"name":"folder_id","in":"query","required":false,"description":"Un dossier du Drive, ou « none » pour ce qui n'est dans aucun","schema":{"type":"string","description":"Un dossier du Drive, ou « none » pour ce qui n'est dans aucun"}},{"name":"kind","in":"query","required":false,"description":"Fichiers ou notes rapides","schema":{"type":"string","enum":["file","text"],"description":"Fichiers ou notes rapides"}},{"name":"type","in":"query","required":false,"description":"Une famille de fichiers","schema":{"type":"string","enum":["image","video","audio","text","pdf"],"description":"Une famille de fichiers"}},{"name":"starred","in":"query","required":false,"description":"Les favoris","schema":{"type":"boolean","description":"Les favoris"}},{"name":"temporary","in":"query","required":false,"description":"Ceux déposés pour un lien, qui partiront avec lui","schema":{"type":"boolean","description":"Ceux déposés pour un lien, qui partiront avec lui"}},{"name":"q","in":"query","required":false,"description":"Recherche dans les noms et les notes rapides","schema":{"type":"string","description":"Recherche dans les noms et les notes rapides"}},{"name":"limit","in":"query","required":false,"description":"Combien en rendre (50 par défaut, 500 au plus)","schema":{"type":"integer","description":"Combien en rendre (50 par défaut, 500 au plus)"}},{"name":"offset","in":"query","required":false,"description":"Combien en sauter, pour la page suivante","schema":{"type":"integer","description":"Combien en sauter, pour la page suivante"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"files":[{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","kind":"file","file_name":"devis-octobre.pdf","mime_type":"application/pdf","size_bytes":248310,"text_content":null,"folder_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","starred":false,"source_device":"API","expires_at":null,"share_id":null,"created_at":"2026-10-02T09:41:00.000Z","shared":false,"temporary":false}],"pagination":{"limit":50,"offset":0,"total":1,"has_more":false}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-files","tags":["Drive"],"summary":"Déposer un fichier ou une note rapide","description":"En JSON, `text` crée une note rapide dans le fil — ce que fait le presse-papier partagé. En `multipart/form-data`, le champ `file` dépose un fichier (4 Mo au plus par cet appel ; au-delà, l’envoi en trois temps). La place est vérifiée avant le premier octet.","x-quilly-access":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Le fichier (multipart)"},"name":{"type":"string","description":"Son nom, s’il diffère de celui du fichier (multipart)"},"text":{"type":"string","description":"Une note rapide (JSON)"},"folder_id":{"type":["string","null"],"format":"uuid","description":"Le dossier du Drive où le ranger"}},"required":[],"example":{"text":"Code wifi du bureau : quilly-2026"}}},"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Le fichier (multipart)"},"name":{"type":"string","description":"Son nom, s’il diffère de celui du fichier (multipart)"},"text":{"type":"string","description":"Une note rapide (JSON)"},"folder_id":{"type":["string","null"],"format":"uuid","description":"Le dossier du Drive où le ranger"}},"required":[],"example":{"text":"Code wifi du bureau : quilly-2026"}}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"file":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","kind":"text","file_name":null,"mime_type":null,"size_bytes":248310,"text_content":"Code wifi du bureau : quilly-2026","folder_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","starred":false,"source_device":"API","expires_at":null,"share_id":null,"created_at":"2026-10-02T09:41:00.000Z","shared":false,"temporary":false}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/files/{id}":{"get":{"operationId":"get-files-id","tags":["Drive"],"summary":"Lire un fichier","description":"Sa fiche : nom, type, poids, dossier, favori, échéance.","x-quilly-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du fichier","schema":{"type":"string","format":"uuid","description":"Identifiant du fichier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"file":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","kind":"file","file_name":"devis-octobre.pdf","mime_type":"application/pdf","size_bytes":248310,"text_content":null,"folder_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","starred":false,"source_device":"API","expires_at":null,"share_id":null,"created_at":"2026-10-02T09:41:00.000Z","shared":false,"temporary":false}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"patch-files-id","tags":["Drive"],"summary":"Renommer, ranger, marquer","description":"Renommer ne touche que le nom : les octets ne bougent pas, rien n’est recopié. `folder_id: null` le remet dans « Non rangés ».","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du fichier","schema":{"type":"string","format":"uuid","description":"Identifiant du fichier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"file_name":{"type":"string","description":"Son nom"},"folder_id":{"type":["string","null"],"format":"uuid","description":"Son dossier"},"starred":{"type":"boolean","description":"Favori"},"text_content":{"type":"string","description":"Le texte d’une note rapide"}},"required":[],"example":{"starred":true}}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"delete-files-id","tags":["Drive"],"summary":"Supprimer un fichier","description":"La ligne et ses octets — sauf ceux qu’une autre ligne référence encore.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du fichier","schema":{"type":"string","format":"uuid","description":"Identifiant du fichier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"deleted":true,"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/files/{id}/download":{"get":{"operationId":"get-files-id-download","tags":["Drive"],"summary":"Télécharger","description":"Une URL signée, valable une heure. `disposition=inline` pour l’afficher plutôt que le télécharger ; `redirect=true` pour y être envoyé directement.","x-quilly-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du fichier","schema":{"type":"string","format":"uuid","description":"Identifiant du fichier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},{"name":"disposition","in":"query","required":false,"description":"Télécharger (défaut) ou afficher","schema":{"type":"string","enum":["attachment","inline"],"description":"Télécharger (défaut) ou afficher"}},{"name":"redirect","in":"query","required":false,"description":"Répondre par une redirection 302","schema":{"type":"boolean","description":"Répondre par une redirection 302"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"url":"https://…r2.cloudflarestorage.com/o/…","expires_in":3600,"file_name":"devis-octobre.pdf","mime_type":"application/pdf","size_bytes":248310}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/files/{id}/content":{"get":{"operationId":"get-files-id-content","tags":["Drive"],"summary":"Lire un fichier texte","description":"Le texte d’un fichier du Drive (Markdown, CSV, JSON, code…), décodé en UTF-8. Une note rapide rend son texte.","x-quilly-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du fichier","schema":{"type":"string","format":"uuid","description":"Identifiant du fichier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","file_name":"idées.md","mime_type":"text/markdown","content":"# Idées\n\n- …"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"put":{"operationId":"put-files-id-content","tags":["Drive"],"summary":"Réécrire un fichier texte","description":"La place est vérifiée sur la différence de poids. Dans un dossier partagé, il faut que personne d’autre ne tienne le stylo (sinon 409, qui nomme la personne).","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du fichier","schema":{"type":"string","format":"uuid","description":"Identifiant du fichier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"Le nouveau texte (5 Mo au plus)"}},"required":["content"],"example":{"content":"# Idées\n\n- Une API complète"}}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/files/uploads":{"post":{"operationId":"post-files-uploads","tags":["Drive"],"summary":"1. Réserver","description":"La place est vérifiée et mise de côté. Jusqu’à 64 Mo, la réponse donne UNE URL où envoyer le fichier en `PUT` ; au-delà, un envoi en morceaux (`multipart`), dont on demande les URL à l’étape suivante. Les octets vont directement au stockage.","x-quilly-access":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Le nom du fichier","example":"tournage.mov"},"size":{"type":"integer","description":"Son poids, en octets","example":734003200},"mime":{"type":"string","description":"Son type MIME","example":"video/quicktime"}},"required":["name","size"],"example":{"name":"tournage.mov","size":734003200,"mime":"video/quicktime"}}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"upload":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","key":"o/6b1f…","url":null,"multipart":{"part_size":67108864,"part_count":11},"method":"PUT","headers":{"Content-Type":"video/quicktime"}}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/files/uploads/{uploadId}/parts":{"post":{"operationId":"post-files-uploads-uploadid-parts","tags":["Drive"],"summary":"2. Signer des morceaux","description":"Les URL d’un lot de morceaux (numérotés à partir de 1), chacune valable quinze minutes : on les demande au fil de l’envoi, et on y envoie chaque morceau en `PUT`.","x-quilly-access":"write","parameters":[{"name":"uploadId","in":"path","required":true,"description":"Identifiant de l’envoi","schema":{"type":"string","format":"uuid","description":"Identifiant de l’envoi","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"parts":{"type":"array","items":{"type":"integer"},"description":"Les numéros des morceaux (100 au plus par appel)","example":[1,2,3]}},"required":["parts"],"example":{"parts":[1,2,3]}}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"urls":{"1":"https://…","2":"https://…","3":"https://…"}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/files/uploads/{uploadId}/complete":{"post":{"operationId":"post-files-uploads-uploadid-complete","tags":["Drive"],"summary":"3. Valider","description":"Les morceaux sont assemblés, le poids RÉEL est mesuré sur l’objet déposé, et le fichier naît dans le Drive.","x-quilly-access":"write","parameters":[{"name":"uploadId","in":"path","required":true,"description":"Identifiant de l’envoi","schema":{"type":"string","format":"uuid","description":"Identifiant de l’envoi","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string","description":"La clé rendue à la réservation"},"name":{"type":"string","description":"Le nom du fichier"},"mime":{"type":"string","description":"Son type MIME"},"folder_id":{"type":["string","null"],"format":"uuid","description":"Le dossier où le ranger"}},"required":["key","name"]}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"file":{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","kind":"file","file_name":"devis-octobre.pdf","mime_type":"application/pdf","size_bytes":248310,"text_content":null,"folder_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","starred":false,"source_device":"API","expires_at":null,"share_id":null,"created_at":"2026-10-02T09:41:00.000Z","shared":false,"temporary":false}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/files/uploads/{uploadId}":{"delete":{"operationId":"delete-files-uploads-uploadid","tags":["Drive"],"summary":"Abandonner un envoi","description":"La place est rendue, les morceaux déjà déposés effacés.","x-quilly-access":"write","parameters":[{"name":"uploadId","in":"path","required":true,"description":"Identifiant de l’envoi","schema":{"type":"string","format":"uuid","description":"Identifiant de l’envoi","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"key":{"type":"string","description":"La clé rendue à la réservation"}},"required":[]}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/drive-folders":{"get":{"operationId":"get-drive-folders","tags":["Drive"],"summary":"Lister les dossiers","description":"L’arborescence entière, à plat (`parent_id` la dessine), avec le nombre d’entrées de chacun. Les dossiers des espaces partagés en font partie (`shared: true`).","x-quilly-access":"read","responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-drive-folders","tags":["Drive"],"summary":"Créer un dossier","description":"Dans un dossier partagé, il naît partagé.","x-quilly-access":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Son nom","example":"Factures 2026"},"color":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","description":"Sa couleur"},"parent_id":{"type":["string","null"],"format":"uuid","description":"Le dossier parent"}},"required":["name"],"example":{"name":"Factures 2026"}}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/drive-folders/{id}":{"get":{"operationId":"get-drive-folders-id","tags":["Drive"],"summary":"Ouvrir un dossier","description":"Le dossier, ses sous-dossiers et ses fichiers (paginés).","x-quilly-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du dossier","schema":{"type":"string","format":"uuid","description":"Identifiant du dossier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},{"name":"limit","in":"query","required":false,"description":"Combien en rendre (100 par défaut, 500 au plus)","schema":{"type":"integer","description":"Combien en rendre (100 par défaut, 500 au plus)"}},{"name":"offset","in":"query","required":false,"description":"Combien en sauter, pour la page suivante","schema":{"type":"integer","description":"Combien en sauter, pour la page suivante"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"patch-drive-folders-id","tags":["Drive"],"summary":"Renommer ou déplacer","description":"Nom, couleur, et place dans l’arborescence — jamais sous lui-même.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du dossier","schema":{"type":"string","format":"uuid","description":"Identifiant du dossier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Son nom"},"color":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","description":"Sa couleur"},"parent_id":{"type":["string","null"],"format":"uuid","description":"Le dossier parent"}},"required":[]}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"delete-drive-folders-id","tags":["Drive"],"summary":"Supprimer un dossier","description":"Ses sous-dossiers partent ; aucun fichier n’est détruit — ils retournent dans « Non rangés ».","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du dossier","schema":{"type":"string","format":"uuid","description":"Identifiant du dossier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"deleted":true,"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/drive-folders/{id}/share":{"get":{"operationId":"get-drive-folders-id-share","tags":["Drive"],"summary":"Voir le partage d’un dossier","description":"L’espace et ses membres, avec leurs visages.","x-quilly-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du dossier","schema":{"type":"string","format":"uuid","description":"Identifiant du dossier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"put":{"operationId":"put-drive-folders-id-share","tags":["Drive"],"summary":"Partager un dossier","description":"La liste EXACTE des membres, parmi mes contacts. Un dossier privé devient partagé ; un membre absent de la liste perd l’accès. Rien n’est copié.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du dossier","schema":{"type":"string","format":"uuid","description":"Identifiant du dossier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"member_ids":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Les contacts qui y ont accès"}},"required":["member_ids"],"example":{"member_ids":["8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30"]}}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"delete-drive-folders-id-share","tags":["Drive"],"summary":"Arrêter ou quitter","description":"Propriétaire : le dossier redevient privé, il ne disparaît pas. Membre : je quitte l’espace.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du dossier","schema":{"type":"string","format":"uuid","description":"Identifiant du dossier","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/share-links":{"get":{"operationId":"get-share-links","tags":["Partage & contacts"],"summary":"Lister mes liens","description":"Avec leur adresse publique et leur état (`ready`, `uploading`, `revoked`, `expired`…).","x-quilly-access":"read","parameters":[{"name":"active","in":"query","required":false,"description":"Ceux qui s’ouvrent encore","schema":{"type":"boolean","description":"Ceux qui s’ouvrent encore"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-share-links","tags":["Partage & contacts"],"summary":"Créer un lien","description":"Un lien vers un fichier du Drive, prêt tout de suite. Le fichier survit au lien.","x-quilly-access":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"file_id":{"type":"string","format":"uuid","description":"Le fichier partagé"},"ttl_hours":{"type":"integer","description":"Sa durée de vie, en heures (24 par défaut)","example":168}},"required":["file_id"],"example":{"file_id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","ttl_hours":168}}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"share_link":{"id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","token":"xK9…","url":"https://quilly.aelby.com/f/xK9…","status":"ready","state":"ready","ttl_hours":168,"expires_at":"2026-10-02T09:41:00.000Z","download_count":0}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/share-links/{id}":{"get":{"operationId":"get-share-links-id","tags":["Partage & contacts"],"summary":"Lire un lien","description":"Son état, ses téléchargements, son échéance.","x-quilly-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du lien","schema":{"type":"string","format":"uuid","description":"Identifiant du lien","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"patch-share-links-id","tags":["Partage & contacts"],"summary":"Couper, rouvrir, prolonger","description":"`revoked` coupe ou rouvre (tant que l’heure n’est pas passée), `ttl_hours` change la durée, `keep_file` décide si le fichier survit au lien. La base vérifie les limites d’envoi.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du lien","schema":{"type":"string","format":"uuid","description":"Identifiant du lien","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"revoked":{"type":"boolean","description":"Coupé"},"ttl_hours":{"type":"integer","description":"Nouvelle durée"},"keep_file":{"type":"boolean","description":"Garder le fichier dans le Drive"}},"required":[],"example":{"revoked":true}}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"delete-share-links-id","tags":["Partage & contacts"],"summary":"Supprimer un lien","description":"Le lien seulement : le fichier garde sa propre date de fin.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du lien","schema":{"type":"string","format":"uuid","description":"Identifiant du lien","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"deleted":true,"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/share-links/{id}/recipients":{"get":{"operationId":"get-share-links-id-recipients","tags":["Partage & contacts"],"summary":"Où en sont les destinataires","description":"Qui l’a reçu, vu, téléchargé, enregistré.","x-quilly-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du lien","schema":{"type":"string","format":"uuid","description":"Identifiant du lien","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"put":{"operationId":"put-share-links-id-recipients","tags":["Partage & contacts"],"summary":"Envoyer à des contacts","description":"La liste EXACTE des contacts qui le reçoivent dans leur fil, en direct. Retiré de la liste, on perd l’accès.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du lien","schema":{"type":"string","format":"uuid","description":"Identifiant du lien","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"user_ids":{"type":"array","items":{"type":"string","format":"uuid"},"description":"Les contacts destinataires"}},"required":["user_ids"],"example":{"user_ids":["8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30"]}}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/friends":{"get":{"operationId":"get-friends","tags":["Partage & contacts"],"summary":"Lister mes contacts","description":"Triés par dernier envoi. Ceux que j’ai bloqués y figurent (`status: blocked`).","x-quilly-access":"read","responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"friends":[{"user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","display_name":"Marc","avatar":null,"status":"accepted","since":"2026-10-02T09:41:00.000Z","last_sent_at":"2026-10-02T09:41:00.000Z"}]}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/friends/{userId}":{"delete":{"operationId":"delete-friends-userid","tags":["Partage & contacts"],"summary":"Retirer un contact","description":"Les deux côtés perdent le lien.","x-quilly-access":"write","parameters":[{"name":"userId","in":"path","required":true,"description":"Identifiant du contact","schema":{"type":"string","format":"uuid","description":"Identifiant du contact","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/friends/{userId}/block":{"post":{"operationId":"post-friends-userid-block","tags":["Partage & contacts"],"summary":"Bloquer","description":"Coupe aussi les envois en cours vers cette personne.","x-quilly-access":"write","parameters":[{"name":"userId","in":"path","required":true,"description":"Identifiant du contact","schema":{"type":"string","format":"uuid","description":"Identifiant du contact","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"delete-friends-userid-block","tags":["Partage & contacts"],"summary":"Débloquer","description":"Lève le blocage.","x-quilly-access":"write","parameters":[{"name":"userId","in":"path","required":true,"description":"Identifiant du contact","schema":{"type":"string","format":"uuid","description":"Identifiant du contact","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/friends/invite":{"get":{"operationId":"get-friends-invite","tags":["Partage & contacts"],"summary":"Mon lien d’invitation","description":"L’ouvrir, c’est devenir contact : le lien EST le consentement des deux côtés.","x-quilly-access":"read","responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"token":"q7Lm…","url":"https://quilly.aelby.com/ami/q7Lm…"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-friends-invite","tags":["Partage & contacts"],"summary":"Renouveler le lien","description":"Un nouveau lien ; l’ancien meurt sur-le-champ.","x-quilly-access":"write","responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/friends/invite/accept":{"post":{"operationId":"post-friends-invite-accept","tags":["Partage & contacts"],"summary":"Accepter une invitation","description":"Le jeton d’un lien `/ami/…`, ou le lien entier.","x-quilly-access":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string","description":"Le jeton ou le lien"}},"required":["token"]}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/inbox":{"get":{"operationId":"get-inbox","tags":["Partage & contacts"],"summary":"Ce qu’on m’a envoyé","description":"Chaque envoi reçu, sa progression (il peut monter encore), son compte à rebours, et si je l’ai vu.","x-quilly-access":"read","responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-inbox","tags":["Partage & contacts"],"summary":"Marquer comme vu","description":"L’expéditeur saura que son envoi n’est pas parti dans le vide.","x-quilly-access":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"tokens":{"type":"array","items":{"type":"string"},"description":"Les jetons des envois vus"}},"required":["tokens"]}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/shares":{"get":{"operationId":"get-shares","tags":["Partage & contacts"],"summary":"Lister mes partages","description":"Notes, tableaux, prompts et listes de tâches partagés, dans les deux sens : ceux que j’ouvre (`role: owner`) et ceux qu’on m’ouvre. Chaque membre porte son nom et son visage.","x-quilly-access":"read","parameters":[{"name":"kind","in":"query","required":false,"description":"Un seul genre","schema":{"type":"string","enum":["note","board","prompt","todo_list"],"description":"Un seul genre"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-shares","tags":["Partage & contacts"],"summary":"Partager avec un contact","description":"Le partage naît au premier visage ; le refaire change le rôle. Rien n’est copié. Un tableau et une liste de tâches se font à plusieurs : leurs membres écrivent.","x-quilly-access":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"kind":{"type":"string","enum":["note","board","prompt","todo_list"],"description":"Ce qu’on partage"},"item_id":{"type":"string","format":"uuid","description":"L’objet partagé"},"user_id":{"type":"string","format":"uuid","description":"Le contact"},"role":{"type":"string","enum":["editor","viewer"],"description":"Écrire (défaut) ou lire"}},"required":["kind","item_id","user_id"],"example":{"kind":"note","item_id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","role":"editor"}}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"share_id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/shares/{id}":{"patch":{"operationId":"patch-shares-id","tags":["Partage & contacts"],"summary":"Ranger chez moi","description":"Ce qui est À MOI dans un partage qu’on m’a ouvert : où je le range, s’il est épinglé ou archivé chez moi, s’il est vu.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du partage","schema":{"type":"string","format":"uuid","description":"Identifiant du partage","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"folder_id":{"type":["string","null"],"format":"uuid","description":"Mon dossier pour lui"},"pinned":{"type":"boolean","description":"Épinglé chez moi"},"archived":{"type":"boolean","description":"Archivé chez moi"},"seen":{"type":"boolean","description":"Retirer la pastille « Nouveau »"}},"required":[]}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"delete-shares-id","tags":["Partage & contacts"],"summary":"Arrêter un partage","description":"L’objet redevient privé ; il ne disparaît pas.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du partage","schema":{"type":"string","format":"uuid","description":"Identifiant du partage","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/shares/{id}/leave":{"post":{"operationId":"post-shares-id-leave","tags":["Partage & contacts"],"summary":"Quitter un partage","description":"L’objet disparaît de chez moi, pas de chez les autres.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du partage","schema":{"type":"string","format":"uuid","description":"Identifiant du partage","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/shares/{id}/members/{userId}":{"delete":{"operationId":"delete-shares-id-members-userid","tags":["Partage & contacts"],"summary":"Retirer un membre","description":"Il perd l’accès sur-le-champ.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du partage","schema":{"type":"string","format":"uuid","description":"Identifiant du partage","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},{"name":"userId","in":"path","required":true,"description":"Identifiant du membre","schema":{"type":"string","format":"uuid","description":"Identifiant du membre","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/postits":{"get":{"operationId":"get-postits","tags":["Post-its"],"summary":"Lister les post-its","description":"Dans l’ordre du mur.","x-quilly-access":"read","responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"postits":[{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","title":"Appeler","content":"Le plombier, avant jeudi","color":"#FEF08A","position":0}]}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-postits","tags":["Post-its"],"summary":"Coller un post-it","description":"Au bout du mur. Jaune par défaut.","x-quilly-access":"write","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Son titre","example":"Appeler"},"content":{"type":"string","description":"Son texte","example":"Le plombier, avant jeudi"},"color":{"type":"string","enum":["#FEF08A","#FED7AA","#FBCFE8","#BBF7D0","#BFDBFE","#DDD6FE"],"description":"Son papier"}},"required":[],"example":{"title":"Appeler","content":"Le plombier, avant jeudi"}}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/postits/{id}":{"get":{"operationId":"get-postits-id","tags":["Post-its"],"summary":"Lire un post-it","description":"Son titre, son texte, son papier.","x-quilly-access":"read","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du post-it","schema":{"type":"string","format":"uuid","description":"Identifiant du post-it","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"patch":{"operationId":"patch-postits-id","tags":["Post-its"],"summary":"Modifier un post-it","description":"Titre, texte, papier, place.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du post-it","schema":{"type":"string","format":"uuid","description":"Identifiant du post-it","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","description":"Son titre"},"content":{"type":"string","description":"Son texte"},"color":{"type":"string","enum":["#FEF08A","#FED7AA","#FBCFE8","#BBF7D0","#BFDBFE","#DDD6FE"],"description":"Son papier"},"position":{"type":"integer","description":"Sa place"}},"required":[]}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"delete":{"operationId":"delete-postits-id","tags":["Post-its"],"summary":"Décoller un post-it","description":"Définitif.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant du post-it","schema":{"type":"string","format":"uuid","description":"Identifiant du post-it","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"deleted":true,"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/sandbox":{"get":{"operationId":"get-sandbox","tags":["Atelier & dictées"],"summary":"Lire l’atelier","description":"La feuille d’assemblage — vide si elle n’a jamais servi.","x-quilly-access":"read","responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"sandbox":{"user_id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","content":"Brouillon du mail…","updated_at":"2026-10-02T09:41:00.000Z"}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"put":{"operationId":"put-sandbox","tags":["Atelier & dictées"],"summary":"Écrire dans l’atelier","description":"Réécrit la feuille ; `append: true` ajoute à la fin, sur une nouvelle ligne.","x-quilly-access":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"content":{"type":"string","description":"Le texte"},"append":{"type":"boolean","description":"Ajouter plutôt que remplacer"}},"required":["content"],"example":{"content":"Une idée de plus","append":true}}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/dictations":{"get":{"operationId":"get-dictations","tags":["Atelier & dictées"],"summary":"Lister les dictées","description":"Du plus récent au plus ancien. Le texte seulement : l’audio ne quitte jamais l’appareil.","x-quilly-access":"read","parameters":[{"name":"limit","in":"query","required":false,"description":"Combien en rendre (50 par défaut, 200 au plus)","schema":{"type":"integer","description":"Combien en rendre (50 par défaut, 200 au plus)"}},{"name":"offset","in":"query","required":false,"description":"Combien en sauter, pour la page suivante","schema":{"type":"integer","description":"Combien en sauter, pour la page suivante"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}},"post":{"operationId":"post-dictations","tags":["Atelier & dictées"],"summary":"Consigner une dictée","description":"Un texte dicté ailleurs, rangé dans l’historique.","x-quilly-access":"write","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"Le texte"},"duration_seconds":{"type":"integer","description":"La durée de l’enregistrement"},"context":{"type":"string","description":"D’où il vient (« api » par défaut)"}},"required":["text"],"example":{"text":"Penser à rappeler Julie demain matin","duration_seconds":4}}}}},"responses":{"201":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/dictations/{id}":{"delete":{"operationId":"delete-dictations-id","tags":["Atelier & dictées"],"summary":"Supprimer une dictée","description":"Définitif.","x-quilly-access":"write","parameters":[{"name":"id","in":"path","required":true,"description":"Identifiant de la dictée","schema":{"type":"string","format":"uuid","description":"Identifiant de la dictée","example":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"deleted":true,"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71"}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/search":{"get":{"operationId":"get-search","tags":["Outils"],"summary":"Chercher partout","description":"Comme la palette ⌘K : notes, prompts, tâches, fichiers, tableaux et post-its en une requête, sans accents ni casse.","x-quilly-access":"read","parameters":[{"name":"q","in":"query","required":true,"description":"Ce qu’on cherche","schema":{"type":"string","description":"Ce qu’on cherche","example":"devis"}},{"name":"types","in":"query","required":false,"description":"Les familles, séparées d’une virgule : notes, prompts, todos, files, boards, postits","schema":{"type":"string","description":"Les familles, séparées d’une virgule : notes, prompts, todos, files, boards, postits"}},{"name":"limit","in":"query","required":false,"description":"Par famille (10 par défaut, 50 au plus)","schema":{"type":"integer","description":"Par famille (10 par défaut, 50 au plus)"}}],"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"query":"devis","total":2,"results":{"notes":[{"id":"3f2b8c1e-9a4d-4c7e-b1f0-6d2a5e8c9b71","title":"Devis client","snippet":"…le devis signé…"}],"todos":[{"id":"8a1c4e2f-5b3d-4f6a-9c8e-1d7b2a4f6e30","title":"Envoyer le devis","done":false}],"prompts":[],"files":[],"boards":[],"postits":[]}}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}},"/correct":{"post":{"operationId":"post-correct","tags":["Outils"],"summary":"Corriger un texte","description":"Le correcteur de l’application : orthographe, grammaire, ponctuation — SANS reformulation, retours à la ligne intacts. Ne modifie rien dans le compte.","x-quilly-access":"read","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","description":"Le texte (20 000 caractères au plus)","example":"Je vous envoit le devis demain, comme convenus."}},"required":["text"],"example":{"text":"Je vous envoit le devis demain, comme convenus."}}}}},"responses":{"200":{"description":"Réussite","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","const":true},"data":{"type":"object","example":{"text":"Je vous envoie le devis demain, comme convenu.","changed":true,"warning":null}},"meta":{"$ref":"#/components/schemas/Meta"}}}}}},"default":{"$ref":"#/components/responses/Error"}}}}},"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Une clé `aelby_sk_…`, créée dans Mon compte → Clés API"}},"schemas":{"Meta":{"type":"object","properties":{"request_id":{"type":"string","format":"uuid"},"timestamp":{"type":"string","format":"date-time"}}},"Error":{"type":"object","properties":{"success":{"type":"boolean","const":false},"error":{"type":"object","properties":{"code":{"type":"string","enum":["unauthorized","invalid_api_key","api_key_inactive","api_key_expired","insufficient_permission","forbidden","resource_not_found","conflict","payload_too_large","validation_failed","invalid_request","rate_limit_exceeded","insufficient_storage","not_configured","upstream_error","internal_error"]},"message":{"type":"string"},"details":{}}},"meta":{"$ref":"#/components/schemas/Meta"}}}},"responses":{"Error":{"description":"Erreur — `error.code` est stable, `error.message` est fait pour être lu","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}