{
  "openapi": "3.1.0",
  "info": {
    "title": "SARIYA — les textes du Mali",
    "version": "1.0.0",
    "summary": "Les 20 codes juridiques du Mali, article par article.",
    "description": "Interface de LECTURE des textes officiels maliens publiés par SARIYA : 20 codes, 8 023 articles. Chaque article vit à une adresse stable et se sert en HTML ou en Markdown selon l'en-tête Accept (négociation de contenu). SARIYA ne reformule jamais la loi : le texte servi est celui du Journal Officiel de la République du Mali et des codes consolidés du SGG — seul le Journal Officiel fait foi. Un serveur MCP est aussi disponible à https://malisariya.com/mcp (découverte : /.well-known/mcp.json). Index pour agents : https://malisariya.com/llms.txt",
    "contact": { "name": "SARIYA", "email": "contact@malisariya.com", "url": "https://malisariya.com/apropos" }
  },
  "servers": [{ "url": "https://malisariya.com" }],
  "paths": {
    "/{code}/article/{numero}": {
      "get": {
        "operationId": "lireArticle",
        "summary": "Un article, texte officiel intégral",
        "description": "Le texte complet d'un article. Avec « Accept: text/markdown » (sans text/html), la réponse est du Markdown nu — le même contenu que la page, sans l'habillage. La réponse porte « Vary: Accept ».",
        "parameters": [
          { "$ref": "#/components/parameters/code" },
          { "name": "numero", "in": "path", "required": true, "description": "Le numéro de l'article, tel qu'il figure dans le texte (ex. « 113 »).", "schema": { "type": "string", "pattern": "^[\\w-]{1,20}$" } },
          { "$ref": "#/components/parameters/accept" }
        ],
        "responses": {
          "200": {
            "description": "L'article, en HTML (balisage Legislation de schema.org) ou en Markdown selon Accept.",
            "content": {
              "text/html": { "schema": { "type": "string" } },
              "text/markdown": { "schema": { "type": "string" } }
            }
          },
          "404": { "$ref": "#/components/responses/introuvable" }
        }
      }
    },
    "/{code}": {
      "get": {
        "operationId": "lireSommaire",
        "summary": "Le sommaire d'un code",
        "description": "La page d'un code : son plan et les liens vers chacun de ses articles.",
        "parameters": [{ "$ref": "#/components/parameters/code" }],
        "responses": {
          "200": { "description": "Le sommaire, en HTML rendu côté serveur.", "content": { "text/html": { "schema": { "type": "string" } } } },
          "404": { "$ref": "#/components/responses/introuvable" }
        }
      }
    },
    "/api/etat": {
      "get": {
        "operationId": "lireEtat",
        "summary": "L'état du service",
        "description": "Ce que l'application affiche dans son bandeau : quota de questions du visiteur et réglages publics. Lecture seule, sans authentification.",
        "responses": {
          "200": { "description": "L'état courant, en JSON.", "content": { "application/json": { "schema": { "type": "object" } } } }
        }
      }
    },
    "/sitemap.xml": {
      "get": {
        "operationId": "lirePlan",
        "summary": "Le plan du site",
        "description": "L'index des plans par code — un sitemap par texte, tous les articles listés.",
        "responses": { "200": { "description": "Index sitemap XML.", "content": { "application/xml": { "schema": { "type": "string" } } } } }
      }
    }
  },
  "components": {
    "parameters": {
      "code": {
        "name": "code",
        "in": "path",
        "required": true,
        "description": "L'identifiant du texte (ex. « constitution », « cp », « cpp », « famille », « travail »). La liste complète et à jour, avec le nombre d'articles de chaque code, vit dans https://malisariya.com/llms.txt et https://malisariya.com/sitemap.xml.",
        "schema": { "type": "string", "pattern": "^[a-z0-9-]{2,40}$" }
      },
      "accept": {
        "name": "Accept",
        "in": "header",
        "required": false,
        "description": "« text/markdown » (sans text/html) pour recevoir le texte nu en Markdown ; sinon la page HTML.",
        "schema": { "type": "string", "examples": ["text/markdown"] }
      }
    },
    "responses": {
      "introuvable": {
        "description": "Le texte ou l'article n'existe pas (ou a été abrogé). Corps en Markdown pointant vers llms.txt et le plan du site.",
        "content": { "text/markdown": { "schema": { "type": "string" } } }
      }
    }
  }
}
