{"openapi":"3.1.0","info":{"title":"50 Design Styles API — KoumaLabs","version":"1.0.0","summary":"API publique et sans authentification du carnet « 50 Design Styles » publié par KoumaLabs.","description":"Référence de 50 styles de design (du baroque au vaporwave) : origine, palette hex, typographies et prompt réutilisable pour chaque style.\n\nTrois façons de consommer le contenu :\n- `GET /api/styles.json` — le jeu de données complet en un seul document JSON.\n- `GET /api/markdown/...` — chaque page du site comme `text/markdown`.\n- Négociation de contenu sur les pages elles-mêmes : envoyez `Accept: text/markdown` sur `/` ou `/styles/{slug}` (les réponses portent `Vary: Accept`).\n\nToutes les erreurs machine sont des documents JSON structurés (schéma `Error`). L’index des ressources pour agents est `/llms.txt`.","contact":{"name":"KoumaLabs","url":"https://koumalabs.org"}},"servers":[{"url":"https://design-styles.koumalabs.org","description":"Environnement courant (NEXT_PUBLIC_SITE_URL)."}],"tags":[{"name":"dataset","description":"Le jeu de données complet."},{"name":"markdown","description":"Représentations Markdown des pages."}],"paths":{"/api/styles.json":{"get":{"operationId":"getStylesDataset","tags":["dataset"],"summary":"Le jeu de données complet des 50 styles.","responses":{"200":{"description":"Le jeu de données complet (catégories + 50 styles).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StyleCollection"}}}}}}},"/api/markdown":{"get":{"operationId":"getHomeMarkdown","tags":["markdown"],"summary":"La galerie (accueil) comme Markdown.","responses":{"200":{"description":"Index des 50 planches avec liens vers chaque planche Markdown.","headers":{"Vary":{"schema":{"type":"string"},"description":"Accept, Accept-Encoding"},"Link":{"schema":{"type":"string"},"description":"Annonce la jumelle HTML : `<...>; rel=\"alternate\"; type=\"text/html\"`."}},"content":{"text/markdown":{"schema":{"type":"string"}}}},"404":{"$ref":"#/components/responses/MarkdownNotFound"}}}},"/api/markdown/styles/{slug}":{"get":{"operationId":"getStyleMarkdown","tags":["markdown"],"summary":"Une planche comme Markdown.","parameters":[{"name":"slug","in":"path","required":true,"description":"Slug de la planche.","schema":{"type":"string","enum":["neoclassical","baroque","aurora","ethereal","filigree","acanthus","anthropomorphic","pixel-art","conceptual-sketch","luxury-typography","japandi","memphis","bohemian","shabby-chic","farmhouse-cottagecore","victorian","art-deco","art-nouveau","mystical-western","kitsch","y2k","bauhaus","brutalism","cybercore","synthwave","vaporwave","pop-art","bento-box","graffiti","tenebrism","gothic","pointillism","mixed-media","steampunk","kawaii","coquette","surrealism","utilitarian","mid-century","scrapbook","neo-frutiger-aero","dark-magic-academia","light-academia","wabi-sabi","south-west","nautical","rebus","glassmorphism","modular-typography","neo-brutalism"]}}],"responses":{"200":{"description":"Origine, palette, typographies et prompt du style.","headers":{"Vary":{"schema":{"type":"string"},"description":"Accept, Accept-Encoding"},"Link":{"schema":{"type":"string"},"description":"Annonce la jumelle HTML : `<...>; rel=\"alternate\"; type=\"text/html\"`."}},"content":{"text/markdown":{"schema":{"type":"string"}}}},"404":{"$ref":"#/components/responses/MarkdownNotFound"}}}},"/styles/{slug}":{"get":{"operationId":"getStylePage","summary":"La planche rendue — HTML ou Markdown selon Accept.","description":"`Accept: text/html` (défaut) renvoie la page rendue ; `Accept: text/markdown` sert la variante Markdown ; un en-tête qui ne correspond à aucun type produit donne une erreur 406 structurée (JSON si le client préfère application/json).","parameters":[{"name":"slug","in":"path","required":true,"description":"Slug de la planche.","schema":{"type":"string","enum":["neoclassical","baroque","aurora","ethereal","filigree","acanthus","anthropomorphic","pixel-art","conceptual-sketch","luxury-typography","japandi","memphis","bohemian","shabby-chic","farmhouse-cottagecore","victorian","art-deco","art-nouveau","mystical-western","kitsch","y2k","bauhaus","brutalism","cybercore","synthwave","vaporwave","pop-art","bento-box","graffiti","tenebrism","gothic","pointillism","mixed-media","steampunk","kawaii","coquette","surrealism","utilitarian","mid-century","scrapbook","neo-frutiger-aero","dark-magic-academia","light-academia","wabi-sabi","south-west","nautical","rebus","glassmorphism","modular-typography","neo-brutalism"]}}],"responses":{"200":{"description":"La planche dans le type négocié.","headers":{"Vary":{"schema":{"type":"string"},"description":"Accept, Accept-Encoding"},"Link":{"schema":{"type":"string"},"description":"Annonce la jumelle Markdown : `<...md>; rel=\"alternate\"; type=\"text/markdown\"`."}},"content":{"text/html":{"schema":{"type":"string"}},"text/markdown":{"schema":{"type":"string"}}}},"404":{"$ref":"#/components/responses/PageNotFound"},"406":{"$ref":"#/components/responses/NotAcceptable"}}}}},"components":{"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","status","message","resource"],"properties":{"code":{"type":"string","enum":["not_found","not_acceptable","method_not_allowed","internal_error"],"description":"Identifiant machine stable de l’erreur."},"status":{"type":"integer","description":"Code HTTP reproduit dans le corps."},"message":{"type":"string","description":"Message lisible de l’échec."},"resource":{"type":"string","description":"Chemin demandé."},"hints":{"type":"array","items":{"type":"string"},"description":"Prochaines actions suggérées."},"links":{"type":"array","description":"Liens de récupération absolus.","items":{"type":"object","required":["rel","href"],"properties":{"rel":{"type":"string"},"href":{"type":"string"},"type":{"type":"string"},"title":{"type":"string"}}}}}}}},"StyleEntry":{"type":"object","required":["slug","name","order","category","url"],"properties":{"slug":{"type":"string","enum":["neoclassical","baroque","aurora","ethereal","filigree","acanthus","anthropomorphic","pixel-art","conceptual-sketch","luxury-typography","japandi","memphis","bohemian","shabby-chic","farmhouse-cottagecore","victorian","art-deco","art-nouveau","mystical-western","kitsch","y2k","bauhaus","brutalism","cybercore","synthwave","vaporwave","pop-art","bento-box","graffiti","tenebrism","gothic","pointillism","mixed-media","steampunk","kawaii","coquette","surrealism","utilitarian","mid-century","scrapbook","neo-frutiger-aero","dark-magic-academia","light-academia","wabi-sabi","south-west","nautical","rebus","glassmorphism","modular-typography","neo-brutalism"]},"name":{"type":"string","description":"Nom EN du style."},"order":{"type":"integer","description":"Position 1..50 dans l’article source."},"category":{"type":"string","description":"Identifiant de la famille."},"tagline":{"type":"string"},"description":{"type":"array","items":{"type":"string"}},"keywords":{"type":"array","items":{"type":"string"}},"palette":{"type":"array","items":{"type":"object","required":["hex","name"],"properties":{"hex":{"type":"string","description":"Couleur au format #RRGGBB."},"name":{"type":"string"}}}},"typography":{"type":"object","properties":{"fonts":{"type":"array","items":{"type":"string"}},"note":{"type":"string"}}},"prompt":{"type":"object","required":["template","exampleSubject","example"],"properties":{"template":{"type":"string","description":"Gabarit EN contenant exactement un {{subject}}."},"exampleSubject":{"type":"string"},"example":{"type":"string","description":"Gabarit avec le sujet d’exemple substitué."}}},"related":{"type":"array","items":{"type":"string","enum":["neoclassical","baroque","aurora","ethereal","filigree","acanthus","anthropomorphic","pixel-art","conceptual-sketch","luxury-typography","japandi","memphis","bohemian","shabby-chic","farmhouse-cottagecore","victorian","art-deco","art-nouveau","mystical-western","kitsch","y2k","bauhaus","brutalism","cybercore","synthwave","vaporwave","pop-art","bento-box","graffiti","tenebrism","gothic","pointillism","mixed-media","steampunk","kawaii","coquette","surrealism","utilitarian","mid-century","scrapbook","neo-frutiger-aero","dark-magic-academia","light-academia","wabi-sabi","south-west","nautical","rebus","glassmorphism","modular-typography","neo-brutalism"]}},"url":{"type":"string","format":"uri"},"markdownUrl":{"type":"string","format":"uri"}}},"StyleCollection":{"type":"object","required":["name","publisher","site","categories","styles"],"properties":{"name":{"type":"string","const":"50 Design Styles"},"publisher":{"type":"object","properties":{"name":{"type":"string","const":"KoumaLabs"},"url":{"type":"string","format":"uri"}}},"site":{"type":"string","format":"uri"},"description":{"type":"string"},"categories":{"type":"array","items":{"type":"object","required":["id","label","description"],"properties":{"id":{"type":"string"},"label":{"type":"string"},"description":{"type":"string"}}}},"styles":{"type":"array","items":{"$ref":"#/components/schemas/StyleEntry"}}}}},"responses":{"MarkdownNotFound":{"description":"Aucune page ne correspond à ce chemin. Variante Markdown par défaut (récupération via liens) ; variante JSON (`Error`) si l’en-tête Accept préfère application/json. Porte `Vary: Accept`.","headers":{"Vary":{"schema":{"type":"string"}}},"content":{"text/markdown":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"PageNotFound":{"description":"Slug inconnu : page 404 HTML réelle (statut 404, jamais un 200).","content":{"text/html":{"schema":{"type":"string"}}}},"NotAcceptable":{"description":"Aucun des types demandés n’est produit. JSON (`Error`) si le client préfère application/json, sinon texte brut.","headers":{"Vary":{"schema":{"type":"string"}}},"content":{"text/plain":{"schema":{"type":"string"}},"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}