{
  "openapi": "3.1.0",
  "info": {
    "title": "API de WoWDB des Défias",
    "version": "1.0.0",
    "summary": "Base de données de World of Warcraft (Vanilla, TBC, WotLK) en français, en lecture seule.",
    "description": "API publique et gratuite de WoWDB des Défias : objets, sorts, quêtes, PNJ, objets du monde, ensembles, réputations, donjons et raids des versions Vanilla (1.12.1), The Burning Crusade (2.4.3) et Wrath of the Lich King (3.3.5a), avec les textes du jeu en français. Lecture seule, sans clé, CORS ouvert. Pagination par curseur (limit de 1 à 100, 20 par défaut). Limite : 120 requêtes par minute et 3000 par heure par adresse IP. Publiée le 2026-10-01. Données du jeu © Blizzard Entertainment.",
    "contact": {
      "name": "L’Assemblée des Défias",
      "url": "https://forum.assemblee-defias.fr/"
    },
    "termsOfService": "https://docs.wowdb.assemblee-defias.fr/conditions"
  },
  "externalDocs": {
    "description": "Documentation complète",
    "url": "https://docs.wowdb.assemblee-defias.fr"
  },
  "servers": [
    {
      "url": "https://api.wowdb.assemblee-defias.fr/v1",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "index",
      "externalDocs": {
        "url": "https://docs.wowdb.assemblee-defias.fr"
      }
    },
    {
      "name": "versions",
      "externalDocs": {
        "url": "https://docs.wowdb.assemblee-defias.fr/versions"
      }
    },
    {
      "name": "stats",
      "externalDocs": {
        "url": "https://docs.wowdb.assemblee-defias.fr/stats"
      }
    },
    {
      "name": "search",
      "externalDocs": {
        "url": "https://docs.wowdb.assemblee-defias.fr/search"
      }
    },
    {
      "name": "items",
      "externalDocs": {
        "url": "https://docs.wowdb.assemblee-defias.fr/items"
      }
    },
    {
      "name": "spells",
      "externalDocs": {
        "url": "https://docs.wowdb.assemblee-defias.fr/spells"
      }
    },
    {
      "name": "quests",
      "externalDocs": {
        "url": "https://docs.wowdb.assemblee-defias.fr/quests"
      }
    },
    {
      "name": "npcs",
      "externalDocs": {
        "url": "https://docs.wowdb.assemblee-defias.fr/npcs"
      }
    },
    {
      "name": "game-objects",
      "externalDocs": {
        "url": "https://docs.wowdb.assemblee-defias.fr/game-objects"
      }
    },
    {
      "name": "item-sets",
      "externalDocs": {
        "url": "https://docs.wowdb.assemblee-defias.fr/item-sets"
      }
    },
    {
      "name": "factions",
      "externalDocs": {
        "url": "https://docs.wowdb.assemblee-defias.fr/factions"
      }
    },
    {
      "name": "instances",
      "externalDocs": {
        "url": "https://docs.wowdb.assemblee-defias.fr/instances"
      }
    },
    {
      "name": "openapi",
      "externalDocs": {
        "url": "https://docs.wowdb.assemblee-defias.fr/openapi"
      }
    }
  ],
  "paths": {
    "/": {
      "get": {
        "operationId": "root",
        "summary": "Racine de l’API",
        "description": "Point d’entrée : version de l’API, liens vers la documentation, la spécification OpenAPI et chaque ressource.\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr",
        "tags": [
          "index"
        ],
        "parameters": [
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Api"
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/versions": {
      "get": {
        "operationId": "versionsList",
        "summary": "Lister les versions du jeu",
        "description": "Les trois versions de World of Warcraft couvertes, avec le nombre de fiches de chacune.\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/versions",
        "tags": [
          "versions"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Nombre d’éléments par page, de 1 à 100 (20 par défaut).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_total",
            "in": "query",
            "required": false,
            "description": "true : ajoute total_count, le nombre total d’éléments avec ces filtres.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "Adresse de la page suivante (rel=\"next\"), quand il y en a une.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/List"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Version"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/versions/{version}": {
      "get": {
        "operationId": "versionsRetrieve",
        "summary": "Obtenir une version",
        "description": "Une version du jeu et ses effectifs.\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/versions",
        "tags": [
          "versions"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Version"
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/stats": {
      "get": {
        "operationId": "stats",
        "summary": "Obtenir les statistiques",
        "description": "Nombre de fiches par version et par ressource, fiches utiles au voleur, date des données.\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/stats",
        "tags": [
          "stats"
        ],
        "parameters": [
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Stats"
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/search": {
      "get": {
        "operationId": "search",
        "summary": "Rechercher",
        "description": "Recherche plein texte dans toute la base : noms et infobulles, toutes versions et tous types confondus (sauf filtres). Résultats par pertinence : nom exact d’abord, puis début du nom, puis score du texte. Un numéro du jeu trouve la fiche de ce numéro dans chaque type et chaque version. Chaque résultat est l’objet résumé de son type (champ object).\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/search",
        "tags": [
          "search"
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "Texte à chercher : nom, mot de l’infobulle, ou numéro du jeu. Obligatoire, 120 caractères au plus.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "version",
            "in": "query",
            "required": false,
            "description": "Versions où chercher, séparées par des virgules (toutes par défaut).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "classic",
                  "tbc",
                  "wotlk"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Types de fiches, séparés par des virgules : item, spell, quest, npc, game_object, item_set, faction (tous par défaut).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "item",
                  "spell",
                  "quest",
                  "npc",
                  "game_object",
                  "item_set",
                  "faction"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "rogue",
            "in": "query",
            "required": false,
            "description": "true : seulement les objets, quêtes et objets du monde utiles au voleur ; false : seulement les autres. Absent : tout (par défaut).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Nombre d’éléments par page, de 1 à 100 (20 par défaut).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_total",
            "in": "query",
            "required": false,
            "description": "true : ajoute total_count, le nombre total d’éléments avec ces filtres.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "Adresse de la page suivante (rel=\"next\"), quand il y en a une.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/List"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/SearchResult"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/items": {
      "get": {
        "operationId": "itemsList",
        "summary": "Lister les objets",
        "description": "Tous les objets d’une version (internes exclus), triés par nom par défaut. Le filtre rogue=true garde ceux qui servent au voleur.\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/items",
        "tags": [
          "items"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Filtre sur le nom : chaque mot doit commencer un mot du nom (« lame om » trouve « Lame de l’ombre »). Sans accent ni majuscule nécessaires.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "quality",
            "in": "query",
            "required": false,
            "description": "Qualités. Plusieurs valeurs séparées par des virgules.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "poor",
                  "common",
                  "uncommon",
                  "rare",
                  "epic",
                  "legendary",
                  "artifact",
                  "heirloom"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "slot",
            "in": "query",
            "required": false,
            "description": "Emplacements. Plusieurs valeurs séparées par des virgules.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "one_hand",
                  "two_hand",
                  "main_hand",
                  "off_hand",
                  "held_in_off_hand",
                  "ranged",
                  "thrown",
                  "projectile",
                  "relic",
                  "head",
                  "neck",
                  "shoulder",
                  "back",
                  "chest",
                  "shirt",
                  "tabard",
                  "wrist",
                  "hands",
                  "waist",
                  "legs",
                  "feet",
                  "finger",
                  "trinket",
                  "bag"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Types d’objet. Plusieurs valeurs séparées par des virgules.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "dagger",
                  "sword",
                  "mace",
                  "axe",
                  "fist_weapon",
                  "polearm",
                  "staff",
                  "bow",
                  "crossbow",
                  "gun",
                  "thrown",
                  "wand",
                  "fishing_pole",
                  "misc_weapon",
                  "cloth",
                  "leather",
                  "mail",
                  "plate",
                  "shield",
                  "libram",
                  "idol",
                  "totem",
                  "sigil",
                  "misc_armor",
                  "consumable",
                  "container",
                  "gem",
                  "glyph",
                  "recipe",
                  "trade_goods",
                  "reagent",
                  "projectile",
                  "quiver",
                  "quest",
                  "key",
                  "misc"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "min_level",
            "in": "query",
            "required": false,
            "description": "Niveau requis minimum (1 à 100).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "max_level",
            "in": "query",
            "required": false,
            "description": "Niveau requis maximum (1 à 100).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "min_item_level",
            "in": "query",
            "required": false,
            "description": "Niveau d’objet minimum.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "max_item_level",
            "in": "query",
            "required": false,
            "description": "Niveau d’objet maximum.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "rogue",
            "in": "query",
            "required": false,
            "description": "true : seulement les objets utiles au voleur ; false : seulement les autres. Absent : tout (par défaut).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Ordre : name, item_level, required_level, quality ; « - » devant inverse l’ordre (-item_level : du plus haut au plus bas). Valeurs vides en fin de liste. Par défaut : name.",
            "schema": {
              "type": "string",
              "enum": [
                "name",
                "-name",
                "item_level",
                "-item_level",
                "required_level",
                "-required_level",
                "quality",
                "-quality"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Nombre d’éléments par page, de 1 à 100 (20 par défaut).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_total",
            "in": "query",
            "required": false,
            "description": "true : ajoute total_count, le nombre total d’éléments avec ces filtres.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "Adresse de la page suivante (rel=\"next\"), quand il y en a une.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/List"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Item"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/items/{id}": {
      "get": {
        "operationId": "itemsRetrieve",
        "summary": "Obtenir un objet",
        "description": "La fiche complète de l’objet : les champs de la liste, plus ceux marqués « fiche seulement ».\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/items",
        "tags": [
          "items"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identifiant du jeu de l’objet.",
            "schema": {
              "type": "integer"
            },
            "example": 5191
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ItemDetail"
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/spells": {
      "get": {
        "operationId": "spellsList",
        "summary": "Lister les sorts",
        "description": "Les sorts et talents du voleur cités par les guides, avec tous leurs rangs.\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/spells",
        "tags": [
          "spells"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Filtre sur le nom : chaque mot doit commencer un mot du nom (« lame om » trouve « Lame de l’ombre »). Sans accent ni majuscule nécessaires.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "talent",
            "in": "query",
            "required": false,
            "description": "true : talents seulement ; false : sorts seulement.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "min_level",
            "in": "query",
            "required": false,
            "description": "Niveau requis minimum (1 à 100).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "max_level",
            "in": "query",
            "required": false,
            "description": "Niveau requis maximum (1 à 100).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Ordre : name, required_level ; « - » devant inverse l’ordre (-item_level : du plus haut au plus bas). Valeurs vides en fin de liste. Par défaut : name.",
            "schema": {
              "type": "string",
              "enum": [
                "name",
                "-name",
                "required_level",
                "-required_level"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Nombre d’éléments par page, de 1 à 100 (20 par défaut).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_total",
            "in": "query",
            "required": false,
            "description": "true : ajoute total_count, le nombre total d’éléments avec ces filtres.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "Adresse de la page suivante (rel=\"next\"), quand il y en a une.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/List"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Spell"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/spells/{id}": {
      "get": {
        "operationId": "spellsRetrieve",
        "summary": "Obtenir un sort",
        "description": "La fiche complète du sort : les champs de la liste, plus ceux marqués « fiche seulement ».\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/spells",
        "tags": [
          "spells"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identifiant du jeu du sort.",
            "schema": {
              "type": "integer"
            },
            "example": 1784
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SpellDetail"
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/quests": {
      "get": {
        "operationId": "questsList",
        "summary": "Lister les quêtes",
        "description": "Toutes les quêtes d’une version (quêtes internes exclues), avec leurs récompenses résumées.\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/quests",
        "tags": [
          "quests"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Filtre sur le nom : chaque mot doit commencer un mot du nom (« lame om » trouve « Lame de l’ombre »). Sans accent ni majuscule nécessaires.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "side",
            "in": "query",
            "required": false,
            "description": "Camps. Plusieurs valeurs séparées par des virgules.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "alliance",
                  "horde",
                  "both"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Types de quête ; daily, weekly et repeatable filtrent les quêtes journalières, hebdomadaires et répétables. Plusieurs valeurs séparées par des virgules.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "group",
                  "elite",
                  "dungeon",
                  "raid",
                  "heroic",
                  "pvp",
                  "escort",
                  "legendary",
                  "world_event",
                  "life",
                  "other",
                  "daily",
                  "weekly",
                  "repeatable"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "zone",
            "in": "query",
            "required": false,
            "description": "Numéro de la zone du journal de quêtes (category.id ; 1581 : Les Mortemines).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "min_level",
            "in": "query",
            "required": false,
            "description": "Niveau de la quête minimum (1 à 100).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "max_level",
            "in": "query",
            "required": false,
            "description": "Niveau de la quête maximum (1 à 100).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "rogue",
            "in": "query",
            "required": false,
            "description": "true : seulement les quêtes utiles au voleur ; false : seulement les autres. Absent : tout (par défaut).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Ordre : name, level, xp ; « - » devant inverse l’ordre (-item_level : du plus haut au plus bas). Valeurs vides en fin de liste. Par défaut : name.",
            "schema": {
              "type": "string",
              "enum": [
                "name",
                "-name",
                "level",
                "-level",
                "xp",
                "-xp"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Nombre d’éléments par page, de 1 à 100 (20 par défaut).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_total",
            "in": "query",
            "required": false,
            "description": "true : ajoute total_count, le nombre total d’éléments avec ces filtres.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "Adresse de la page suivante (rel=\"next\"), quand il y en a une.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/List"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Quest"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/quests/{id}": {
      "get": {
        "operationId": "questsRetrieve",
        "summary": "Obtenir une quête",
        "description": "La fiche complète de la quête : les champs de la liste, plus ceux marqués « fiche seulement ».\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/quests",
        "tags": [
          "quests"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identifiant du jeu de la quête.",
            "schema": {
              "type": "integer"
            },
            "example": 166
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/QuestDetail"
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/npcs": {
      "get": {
        "operationId": "npcsList",
        "summary": "Lister les PNJ",
        "description": "Tous les PNJ d’une version (PNJ techniques et variantes de difficulté exclus).\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/npcs",
        "tags": [
          "npcs"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Filtre sur le nom : chaque mot doit commencer un mot du nom (« lame om » trouve « Lame de l’ombre »). Sans accent ni majuscule nécessaires.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Types de créature. Plusieurs valeurs séparées par des virgules.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "humanoid",
                  "beast",
                  "demon",
                  "dragonkin",
                  "elemental",
                  "giant",
                  "undead",
                  "mechanical",
                  "critter",
                  "totem",
                  "non_combat_pet",
                  "gas_cloud",
                  "not_specified",
                  "none"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "rank",
            "in": "query",
            "required": false,
            "description": "Rangs. Plusieurs valeurs séparées par des virgules.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "normal",
                  "elite",
                  "rare_elite",
                  "boss",
                  "rare"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "family",
            "in": "query",
            "required": false,
            "description": "Familles de bêtes et de démons. Plusieurs valeurs séparées par des virgules.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "wolf",
                  "cat",
                  "spider",
                  "bear",
                  "boar",
                  "crocolisk",
                  "carrion_bird",
                  "crab",
                  "gorilla",
                  "raptor",
                  "tallstrider",
                  "felhunter",
                  "voidwalker",
                  "succubus",
                  "doomguard",
                  "scorpid",
                  "turtle",
                  "imp",
                  "bat",
                  "hyena",
                  "bird_of_prey",
                  "wind_serpent",
                  "felguard",
                  "dragonhawk",
                  "ravager",
                  "warp_stalker",
                  "sporebat",
                  "nether_ray",
                  "serpent",
                  "moth",
                  "chimaera",
                  "devilsaur",
                  "ghoul",
                  "silithid",
                  "worm",
                  "rhino",
                  "wasp",
                  "core_hound",
                  "spirit_beast"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "min_level",
            "in": "query",
            "required": false,
            "description": "Niveau (le plus haut) minimum (1 à 100).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "max_level",
            "in": "query",
            "required": false,
            "description": "Niveau (le plus haut) maximum (1 à 100).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Ordre : name, level ; « - » devant inverse l’ordre (-item_level : du plus haut au plus bas). Valeurs vides en fin de liste. Par défaut : name.",
            "schema": {
              "type": "string",
              "enum": [
                "name",
                "-name",
                "level",
                "-level"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Nombre d’éléments par page, de 1 à 100 (20 par défaut).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_total",
            "in": "query",
            "required": false,
            "description": "true : ajoute total_count, le nombre total d’éléments avec ces filtres.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "Adresse de la page suivante (rel=\"next\"), quand il y en a une.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/List"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Npc"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/npcs/{id}": {
      "get": {
        "operationId": "npcsRetrieve",
        "summary": "Obtenir un PNJ",
        "description": "La fiche complète du PNJ : les champs de la liste, plus ceux marqués « fiche seulement ».\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/npcs",
        "tags": [
          "npcs"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identifiant du jeu du PNJ.",
            "schema": {
              "type": "integer"
            },
            "example": 639
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NpcDetail"
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/game-objects": {
      "get": {
        "operationId": "gameObjectsList",
        "summary": "Lister les objets du monde",
        "description": "Coffres, coffres verrouillés, objets de quête, gisements et herbes d’une version. rogue=true : ceux qui demandent du Crochetage.\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/game-objects",
        "tags": [
          "game-objects"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Filtre sur le nom : chaque mot doit commencer un mot du nom (« lame om » trouve « Lame de l’ombre »). Sans accent ni majuscule nécessaires.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Types d’objet du monde. Plusieurs valeurs séparées par des virgules.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "chest",
                  "locked_chest",
                  "quest_object",
                  "ore",
                  "herb"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "skill",
            "in": "query",
            "required": false,
            "description": "Compétences requises. Plusieurs valeurs séparées par des virgules.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "lockpicking",
                  "mining",
                  "herbalism"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "min_skill",
            "in": "query",
            "required": false,
            "description": "Niveau de compétence minimum (0 à 450).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "max_skill",
            "in": "query",
            "required": false,
            "description": "Niveau de compétence maximum.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "rogue",
            "in": "query",
            "required": false,
            "description": "true : seulement les coffres à crocheter utiles au voleur ; false : seulement les autres. Absent : tout (par défaut).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Ordre : name, skill ; « - » devant inverse l’ordre (-item_level : du plus haut au plus bas). Valeurs vides en fin de liste. Par défaut : name.",
            "schema": {
              "type": "string",
              "enum": [
                "name",
                "-name",
                "skill",
                "-skill"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Nombre d’éléments par page, de 1 à 100 (20 par défaut).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_total",
            "in": "query",
            "required": false,
            "description": "true : ajoute total_count, le nombre total d’éléments avec ces filtres.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "Adresse de la page suivante (rel=\"next\"), quand il y en a une.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/List"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/GameObject"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/game-objects/{id}": {
      "get": {
        "operationId": "gameObjectsRetrieve",
        "summary": "Obtenir un objet du monde",
        "description": "La fiche complète de l’objet du monde : les champs de la liste, plus ceux marqués « fiche seulement ».\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/game-objects",
        "tags": [
          "game-objects"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identifiant du jeu de l’objet du monde.",
            "schema": {
              "type": "integer"
            },
            "example": 179498
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GameObjectDetail"
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/item-sets": {
      "get": {
        "operationId": "itemSetsList",
        "summary": "Lister les ensembles",
        "description": "Les ensembles d’armure cités par les guides (TBC).\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/item-sets",
        "tags": [
          "item-sets"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Filtre sur le nom : chaque mot doit commencer un mot du nom (« lame om » trouve « Lame de l’ombre »). Sans accent ni majuscule nécessaires.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Ordre : name ; « - » devant inverse l’ordre (-item_level : du plus haut au plus bas). Valeurs vides en fin de liste. Par défaut : name.",
            "schema": {
              "type": "string",
              "enum": [
                "name",
                "-name"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Nombre d’éléments par page, de 1 à 100 (20 par défaut).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_total",
            "in": "query",
            "required": false,
            "description": "true : ajoute total_count, le nombre total d’éléments avec ces filtres.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "Adresse de la page suivante (rel=\"next\"), quand il y en a une.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/List"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/ItemSet"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/item-sets/{id}": {
      "get": {
        "operationId": "itemSetsRetrieve",
        "summary": "Obtenir un ensemble",
        "description": "La fiche complète de l’ensemble : les champs de la liste, plus ceux marqués « fiche seulement ».\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/item-sets",
        "tags": [
          "item-sets"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identifiant du jeu de l’ensemble.",
            "schema": {
              "type": "integer"
            },
            "example": 184
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ItemSetDetail"
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/factions": {
      "get": {
        "operationId": "factionsList",
        "summary": "Lister les réputations",
        "description": "Les réputations d’une version, groupes compris.\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/factions",
        "tags": [
          "factions"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Filtre sur le nom : chaque mot doit commencer un mot du nom (« lame om » trouve « Lame de l’ombre »). Sans accent ni majuscule nécessaires.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "side",
            "in": "query",
            "required": false,
            "description": "Camps. Plusieurs valeurs séparées par des virgules.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "alliance",
                  "horde",
                  "both"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Ordre : name ; « - » devant inverse l’ordre (-item_level : du plus haut au plus bas). Valeurs vides en fin de liste. Par défaut : name.",
            "schema": {
              "type": "string",
              "enum": [
                "name",
                "-name"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Nombre d’éléments par page, de 1 à 100 (20 par défaut).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_total",
            "in": "query",
            "required": false,
            "description": "true : ajoute total_count, le nombre total d’éléments avec ces filtres.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "Adresse de la page suivante (rel=\"next\"), quand il y en a une.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/List"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Faction"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/factions/{id}": {
      "get": {
        "operationId": "factionsRetrieve",
        "summary": "Obtenir une réputation",
        "description": "La fiche complète de la réputation : les champs de la liste, plus ceux marqués « fiche seulement ».\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/factions",
        "tags": [
          "factions"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identifiant du jeu de la réputation.",
            "schema": {
              "type": "integer"
            },
            "example": 349
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FactionDetail"
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/instances": {
      "get": {
        "operationId": "instancesList",
        "summary": "Lister les donjons et raids",
        "description": "Les donjons puis les raids d’une version qui ont du butin, par nom. Identifiant : numéro de carte du jeu.\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/instances",
        "tags": [
          "instances"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Donjon ou raid. Plusieurs valeurs séparées par des virgules.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "dungeon",
                  "raid"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "rogue",
            "in": "query",
            "required": false,
            "description": "true : seulement les donjons qui ont du butin utiles au voleur ; false : seulement les autres. Absent : tout (par défaut).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Nombre d’éléments par page, de 1 à 100 (20 par défaut).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_total",
            "in": "query",
            "required": false,
            "description": "true : ajoute total_count, le nombre total d’éléments avec ces filtres.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "Adresse de la page suivante (rel=\"next\"), quand il y en a une.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/List"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Instance"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/instances/{id}": {
      "get": {
        "operationId": "instancesRetrieve",
        "summary": "Obtenir un donjon ou raid",
        "description": "La fiche complète du donjon : les champs de la liste, plus ceux marqués « fiche seulement ».\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/instances",
        "tags": [
          "instances"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identifiant du jeu du donjon.",
            "schema": {
              "type": "integer"
            },
            "example": 36
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InstanceDetail"
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/npcs/{id}/loot": {
      "get": {
        "operationId": "npcsLoot",
        "summary": "Lister le butin d’un PNJ",
        "description": "Tout le butin du PNJ, une ligne par objet (difficultés réunies), la meilleure qualité puis la meilleure chance d’abord.\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/npcs",
        "tags": [
          "npcs"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identifiant du jeu du PNJ.",
            "schema": {
              "type": "integer"
            },
            "example": 639
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Nombre d’éléments par page, de 1 à 100 (20 par défaut).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_total",
            "in": "query",
            "required": false,
            "description": "true : ajoute total_count, le nombre total d’éléments avec ces filtres.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "Adresse de la page suivante (rel=\"next\"), quand il y en a une.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/List"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Loot"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/npcs/{id}/sells": {
      "get": {
        "operationId": "npcsSells",
        "summary": "Lister les objets vendus par un PNJ",
        "description": "Les objets qu’un marchand vend, par nom.\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/npcs",
        "tags": [
          "npcs"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identifiant du jeu du PNJ.",
            "schema": {
              "type": "integer"
            },
            "example": 3090
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Nombre d’éléments par page, de 1 à 100 (20 par défaut).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_total",
            "in": "query",
            "required": false,
            "description": "true : ajoute total_count, le nombre total d’éléments avec ces filtres.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "Adresse de la page suivante (rel=\"next\"), quand il y en a une.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/List"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/VendorItem"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/npcs/{id}/quests": {
      "get": {
        "operationId": "npcsQuests",
        "summary": "Lister les quêtes d’un PNJ",
        "description": "Les quêtes que le PNJ donne (starts) et reprend (ends), par niveau.\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/npcs",
        "tags": [
          "npcs"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identifiant du jeu du PNJ.",
            "schema": {
              "type": "integer"
            },
            "example": 234
          },
          {
            "name": "role",
            "in": "query",
            "required": false,
            "description": "starts, ends ou les deux (par défaut).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "starts",
                  "ends"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Nombre d’éléments par page, de 1 à 100 (20 par défaut).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_total",
            "in": "query",
            "required": false,
            "description": "true : ajoute total_count, le nombre total d’éléments avec ces filtres.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "Adresse de la page suivante (rel=\"next\"), quand il y en a une.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/List"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/NpcQuest"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/npcs/{id}/locations": {
      "get": {
        "operationId": "npcsLocations",
        "summary": "Lister les emplacements d’un PNJ",
        "description": "Ses emplacements, groupés par fond de carte du jeu (zone ou étage de donjon), en pour cent de la carte.\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/npcs",
        "tags": [
          "npcs"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identifiant du jeu du PNJ.",
            "schema": {
              "type": "integer"
            },
            "example": 639
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Nombre d’éléments par page, de 1 à 100 (20 par défaut).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_total",
            "in": "query",
            "required": false,
            "description": "true : ajoute total_count, le nombre total d’éléments avec ces filtres.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "Adresse de la page suivante (rel=\"next\"), quand il y en a une.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/List"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Map"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/game-objects/{id}/loot": {
      "get": {
        "operationId": "gameObjectsLoot",
        "summary": "Lister le butin d’un objet du monde",
        "description": "Le contenu d’un coffre ou d’un gisement, de la meilleure chance à la plus faible.\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/game-objects",
        "tags": [
          "game-objects"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identifiant du jeu de l’objet du monde.",
            "schema": {
              "type": "integer"
            },
            "example": 179498
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Nombre d’éléments par page, de 1 à 100 (20 par défaut).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_total",
            "in": "query",
            "required": false,
            "description": "true : ajoute total_count, le nombre total d’éléments avec ces filtres.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "Adresse de la page suivante (rel=\"next\"), quand il y en a une.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/List"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Loot"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/game-objects/{id}/locations": {
      "get": {
        "operationId": "gameObjectsLocations",
        "summary": "Lister les emplacements d’un objet du monde",
        "description": "Où le trouver, par fond de carte.\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/game-objects",
        "tags": [
          "game-objects"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identifiant du jeu de l’objet du monde.",
            "schema": {
              "type": "integer"
            },
            "example": 179498
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Nombre d’éléments par page, de 1 à 100 (20 par défaut).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_total",
            "in": "query",
            "required": false,
            "description": "true : ajoute total_count, le nombre total d’éléments avec ces filtres.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "Adresse de la page suivante (rel=\"next\"), quand il y en a une.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/List"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Map"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/{version}/instances/{id}/loot": {
      "get": {
        "operationId": "instancesLoot",
        "summary": "Lister le butin d’un donjon",
        "description": "Tout le butin du donjon ou du raid : une ligne par objet, source et difficulté, rencontres d’abord, dans l’ordre du jeu.\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/instances",
        "tags": [
          "instances"
        ],
        "parameters": [
          {
            "name": "version",
            "in": "path",
            "required": true,
            "description": "Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a).",
            "schema": {
              "type": "string",
              "enum": [
                "classic",
                "tbc",
                "wotlk"
              ]
            }
          },
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identifiant du jeu du donjon (numéro de carte).",
            "schema": {
              "type": "integer"
            },
            "example": 36
          },
          {
            "name": "encounter",
            "in": "query",
            "required": false,
            "description": "Identifiant du PNJ d’une rencontre (encounters[].npc.id ou une de ses variantes) : son butin seulement.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "difficulty",
            "in": "query",
            "required": false,
            "description": "Difficultés.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "normal",
                  "heroic",
                  "10_player",
                  "25_player",
                  "10_player_heroic",
                  "25_player_heroic"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "quality",
            "in": "query",
            "required": false,
            "description": "Qualités.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "poor",
                  "common",
                  "uncommon",
                  "rare",
                  "epic",
                  "legendary",
                  "artifact",
                  "heirloom"
                ]
              }
            },
            "style": "form",
            "explode": false
          },
          {
            "name": "rogue",
            "in": "query",
            "required": false,
            "description": "true : seulement les objets utiles au voleur ; false : seulement les autres. Absent : tout (par défaut).",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Nombre d’éléments par page, de 1 à 100 (20 par défaut).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "include_total",
            "in": "query",
            "required": false,
            "description": "true : ajoute total_count, le nombre total d’éléments avec ces filtres.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              },
              "Link": {
                "description": "Adresse de la page suivante (rel=\"next\"), quand il y en a une.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/List"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/InstanceLoot"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/openapi.json": {
      "get": {
        "operationId": "openapi",
        "summary": "Obtenir la spécification OpenAPI",
        "description": "La spécification OpenAPI 3.1 complète de l’API, en JSON.\n\nDocumentation : https://docs.wowdb.assemblee-defias.fr/openapi",
        "tags": [
          "openapi"
        ],
        "parameters": [
          {
            "name": "If-None-Match",
            "in": "header",
            "required": false,
            "description": "ETag d’une réponse précédente : 304 sans corps si rien n’a changé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Réussite.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "ETag": {
                "description": "Empreinte de la réponse, à renvoyer dans If-None-Match.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "description": "Durée de cache conseillée.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "Ce document."
                }
              }
            }
          },
          "304": {
            "description": "Pas modifié depuis l’ETag donné dans If-None-Match."
          },
          "400": {
            "description": "Requête invalide (paramètre inconnu ou mal formé, curseur invalide).",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Fiche, version ou route introuvable.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Trop de requêtes : attendre Retry-After secondes.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requêtes permises dans la fenêtre qui s’applique.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Remaining": {
                "description": "Requêtes restantes.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Reset": {
                "description": "Secondes avant que la fenêtre ne libère une place.",
                "schema": {
                  "type": "integer"
                }
              },
              "RateLimit-Policy": {
                "description": "Fenêtres : 120;w=60, 3000;w=3600.",
                "schema": {
                  "type": "string"
                }
              },
              "X-Request-Id": {
                "description": "Identifiant de la requête, à citer pour signaler un problème.",
                "schema": {
                  "type": "string"
                }
              },
              "Retry-After": {
                "description": "Secondes à attendre.",
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Ref": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "enum": [
              "item",
              "spell",
              "quest",
              "npc",
              "game_object",
              "item_set",
              "faction"
            ],
            "description": "Type de la fiche visée."
          },
          "id": {
            "type": "integer",
            "description": "Identifiant du jeu."
          },
          "version": {
            "type": "string",
            "enum": [
              "classic",
              "tbc",
              "wotlk"
            ],
            "description": "Version du jeu."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom français."
          },
          "quality": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "poor",
              "common",
              "uncommon",
              "rare",
              "epic",
              "legendary",
              "artifact",
              "heirloom",
              null
            ],
            "description": "Qualité, pour un objet (objectifs de quête)."
          },
          "icon": {
            "type": [
              "string",
              "null"
            ],
            "description": "Icône, pour un objet (objectifs de quête)."
          },
          "url": {
            "type": "string",
            "description": "Adresse publique de la fiche sur WoWDB (page HTML, à donner à vos lecteurs)."
          },
          "api_url": {
            "type": "string",
            "description": "Adresse de la fiche dans l’API."
          }
        },
        "required": [
          "object",
          "id",
          "version",
          "name",
          "url",
          "api_url"
        ],
        "title": "Référence",
        "description": "Référence courte vers une autre fiche (objet, sort, quête, PNJ, objet du monde, ensemble, réputation). Suivez api_url pour la fiche complète."
      },
      "ItemRef": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "item",
            "description": "Toujours « item »."
          },
          "id": {
            "type": "integer",
            "description": "Identifiant du jeu."
          },
          "version": {
            "type": "string",
            "enum": [
              "classic",
              "tbc",
              "wotlk"
            ],
            "description": "Version du jeu."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom français."
          },
          "quality": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "poor",
              "common",
              "uncommon",
              "rare",
              "epic",
              "legendary",
              "artifact",
              "heirloom",
              null
            ],
            "description": "Qualité (couleur du nom)."
          },
          "icon": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse absolue de l’icône du jeu (WebP, JPEG ou PNG), servie par WoWDB ; null si la fiche n’en a pas."
          },
          "item_level": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Niveau d’objet (butin seulement)."
          },
          "slot_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Emplacement, libellé du jeu (butin et ventes seulement)."
          },
          "type_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Type d’objet, libellé français (butin et ventes seulement)."
          },
          "url": {
            "type": "string",
            "description": "Adresse publique de la fiche sur WoWDB (page HTML, à donner à vos lecteurs)."
          },
          "api_url": {
            "type": "string",
            "description": "Adresse de l’objet dans l’API."
          }
        },
        "required": [
          "object",
          "id",
          "version",
          "name",
          "quality",
          "icon",
          "url",
          "api_url"
        ],
        "title": "Référence d’objet",
        "description": "Référence vers un objet, avec sa qualité et son icône (et, dans le butin, son niveau, son emplacement et son type)."
      },
      "InstanceRef": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "instance",
            "description": "Toujours « instance »."
          },
          "id": {
            "type": "integer",
            "description": "Numéro de carte du jeu (36 : Mortemines)."
          },
          "version": {
            "type": "string",
            "enum": [
              "classic",
              "tbc",
              "wotlk"
            ],
            "description": "Version du jeu."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom français."
          },
          "type": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "dungeon",
              "raid",
              null
            ],
            "description": "Donjon ou raid."
          },
          "url": {
            "type": "string",
            "description": "Page du donjon sur WoWDB."
          },
          "api_url": {
            "type": "string",
            "description": "Adresse du donjon dans l’API."
          }
        },
        "required": [
          "object",
          "id",
          "version",
          "name",
          "type",
          "url",
          "api_url"
        ],
        "title": "Référence de donjon",
        "description": "Référence vers un donjon ou un raid."
      },
      "List": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "list",
            "description": "Toujours « list »."
          },
          "data": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Les éléments de cette page (objets du type de la liste)."
          },
          "has_more": {
            "type": "boolean",
            "description": "Vrai s’il reste des éléments après cette page."
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Curseur de la page suivante, à passer tel quel dans cursor ; null en fin de liste."
          },
          "url": {
            "type": "string",
            "description": "Adresse de la liste dans l’API, filtres compris (sans cursor ni limit)."
          },
          "total_count": {
            "type": "integer",
            "description": "Nombre total d’éléments avec ces filtres ; seulement avec include_total=true."
          }
        },
        "required": [
          "object",
          "data",
          "has_more",
          "next_cursor",
          "url"
        ],
        "title": "Liste",
        "description": "Enveloppe de toutes les listes, paginées par curseur."
      },
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "description": "Famille : invalid_request_error (requête à corriger), rate_limit_error (trop de requêtes), api_error (erreur de WoWDB)."
              },
              "code": {
                "type": "string",
                "description": "Code précis et stable, à tester dans votre code (parameter_invalid, resource_missing…)."
              },
              "message": {
                "type": "string",
                "description": "Explication en français, lisible par un humain."
              },
              "param": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Paramètre en cause, s’il y en a un."
              },
              "doc_url": {
                "type": "string",
                "description": "Section de la documentation qui explique cette erreur."
              }
            },
            "required": [
              "type",
              "code",
              "message",
              "param",
              "doc_url"
            ],
            "description": "L’erreur."
          }
        },
        "required": [
          "error"
        ],
        "title": "Erreur",
        "description": "Corps de toutes les réponses en erreur (4xx, 5xx)."
      },
      "Item": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "item",
            "description": "Type d’objet, toujours « item »."
          },
          "id": {
            "type": "integer",
            "description": "Identifiant de l’objet : son numéro dans le jeu (entrée de la base du jeu), le même dans les trois versions quand l’objet y existe."
          },
          "key": {
            "type": "string",
            "description": "Clé WoWDB, unique dans toute la base : « <version>:<type>:<id> » (classic:item:5191)."
          },
          "version": {
            "type": "string",
            "enum": [
              "classic",
              "tbc",
              "wotlk"
            ],
            "description": "Version du jeu de cette fiche."
          },
          "name": {
            "type": "string",
            "description": "Nom français, comme en jeu."
          },
          "quality": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "poor",
              "common",
              "uncommon",
              "rare",
              "epic",
              "legendary",
              "artifact",
              "heirloom",
              null
            ],
            "description": "Qualité de l’objet (couleur du nom en jeu)."
          },
          "quality_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Qualité, libellé français."
          },
          "icon": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse absolue de l’icône du jeu (WebP, JPEG ou PNG), servie par WoWDB ; null si la fiche n’en a pas."
          },
          "item_level": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Niveau d’objet."
          },
          "required_level": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Niveau requis pour l’équiper ou l’utiliser."
          },
          "slot": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "one_hand",
              "two_hand",
              "main_hand",
              "off_hand",
              "held_in_off_hand",
              "ranged",
              "thrown",
              "projectile",
              "relic",
              "head",
              "neck",
              "shoulder",
              "back",
              "chest",
              "shirt",
              "tabard",
              "wrist",
              "hands",
              "waist",
              "legs",
              "feet",
              "finger",
              "trinket",
              "bag",
              null
            ],
            "description": "Emplacement d’équipement ; null si l’objet ne se porte pas."
          },
          "slot_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Emplacement, libellé du jeu (« À une main »)."
          },
          "type": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "dagger",
              "sword",
              "mace",
              "axe",
              "fist_weapon",
              "polearm",
              "staff",
              "bow",
              "crossbow",
              "gun",
              "thrown",
              "wand",
              "fishing_pole",
              "misc_weapon",
              "cloth",
              "leather",
              "mail",
              "plate",
              "shield",
              "libram",
              "idol",
              "totem",
              "sigil",
              "misc_armor",
              "consumable",
              "container",
              "gem",
              "glyph",
              "recipe",
              "trade_goods",
              "reagent",
              "projectile",
              "quiver",
              "quest",
              "key",
              "misc",
              null
            ],
            "description": "Type d’objet : sous-classe pour les armes et armures (dague, cuir…), classe pour les autres."
          },
          "type_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Type, libellé français."
          },
          "weapon": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "damage_min": {
                "type": "integer",
                "description": "Dégâts minimum."
              },
              "damage_max": {
                "type": "integer",
                "description": "Dégâts maximum."
              },
              "speed": {
                "type": "number",
                "description": "Vitesse d’attaque en secondes."
              },
              "dps": {
                "type": "number",
                "description": "Dégâts par seconde."
              }
            },
            "required": [
              "damage_min",
              "damage_max",
              "speed",
              "dps"
            ],
            "description": "Caractéristiques d’arme lues dans l’infobulle ; null hors des armes."
          },
          "sell_price": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Prix de vente à un marchand, en pièces de cuivre (10 000 = 1 pièce d’or) ; null si invendable."
          },
          "rogue": {
            "type": "boolean",
            "description": "Utile au voleur : arme ou armure qu’il porte, objet qui lui est réservé, fourniture (poisons, crochets, poudres), objet cité par un guide."
          },
          "internal": {
            "type": "boolean",
            "description": "Objet interne du jeu (test, doublon, jamais sorti) : absent des listes et de la recherche, mais joignable par son identifiant."
          },
          "tooltip": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Infobulle du jeu, ligne par ligne, en français (sans le prix de vente, donné par sell_price)."
          },
          "url": {
            "type": "string",
            "description": "Adresse publique de la fiche sur WoWDB (page HTML, à donner à vos lecteurs)."
          },
          "api_url": {
            "type": "string",
            "description": "Adresse de l’objet dans l’API."
          }
        },
        "required": [
          "object",
          "id",
          "key",
          "version",
          "name",
          "quality",
          "quality_name",
          "icon",
          "item_level",
          "required_level",
          "slot",
          "slot_name",
          "type",
          "type_name",
          "weapon",
          "sell_price",
          "rogue",
          "internal",
          "tooltip",
          "url",
          "api_url"
        ],
        "title": "Objet",
        "description": "Objet (résumé, tel que dans les listes et la recherche). Documentation : https://docs.wowdb.assemblee-defias.fr/items"
      },
      "ItemDetail": {
        "title": "Objet (fiche complète)",
        "description": "Fiche complète : le résumé Item, plus les champs de détail.",
        "allOf": [
          {
            "$ref": "#/components/schemas/Item"
          },
          {
            "type": "object",
            "properties": {
              "required_reputation": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "faction": {
                    "anyOf": [
                      {
                        "$ref": "#/components/schemas/Ref"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "La réputation, quand elle a une fiche."
                  },
                  "name": {
                    "type": "string",
                    "description": "Nom de la faction."
                  },
                  "rank": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "enum": [
                      "hated",
                      "hostile",
                      "unfriendly",
                      "neutral",
                      "friendly",
                      "honored",
                      "revered",
                      "exalted",
                      null
                    ],
                    "description": "Rang requis."
                  },
                  "rank_name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Rang requis, libellé du jeu."
                  }
                },
                "required": [
                  "faction",
                  "name",
                  "rank",
                  "rank_name"
                ],
                "description": "Réputation requise pour l’acheter ou l’utiliser."
              },
              "dropped_by": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "source_type": {
                      "type": "string",
                      "description": "« npc » (créature) ou « game_object » (coffre)."
                    },
                    "name": {
                      "type": "string",
                      "description": "Nom de la source."
                    },
                    "npc": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/Ref"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Fiche du PNJ, quand elle existe."
                    },
                    "boss": {
                      "type": "boolean",
                      "description": "Vrai pour un boss."
                    },
                    "instance": {
                      "$ref": "#/components/schemas/InstanceRef",
                      "description": "Le donjon ou raid."
                    },
                    "difficulty": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "enum": [
                        "normal",
                        "heroic",
                        "10_player",
                        "25_player",
                        "10_player_heroic",
                        "25_player_heroic",
                        null
                      ],
                      "description": "Difficulté."
                    },
                    "difficulty_name": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Difficulté, libellé français."
                    },
                    "chance": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "description": "Chance de butin en pour cent."
                    }
                  },
                  "required": [
                    "source_type",
                    "name",
                    "npc",
                    "boss",
                    "instance",
                    "difficulty",
                    "difficulty_name",
                    "chance"
                  ]
                },
                "description": "Où il tombe dans les donjons et raids : monstres, boss et coffres, par difficulté."
              },
              "rewarded_by": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "quest": {
                      "$ref": "#/components/schemas/Ref",
                      "description": "La quête."
                    },
                    "choice": {
                      "type": "boolean",
                      "description": "Vrai si c’est une récompense au choix."
                    }
                  },
                  "required": [
                    "quest",
                    "choice"
                  ]
                },
                "description": "Quêtes qui le donnent en récompense."
              },
              "summons": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "type": {
                    "type": "string",
                    "description": "« mount », « companion » ou « other »."
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Nom de la créature."
                  },
                  "npc": {
                    "anyOf": [
                      {
                        "$ref": "#/components/schemas/Ref"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "Fiche de la créature."
                  }
                },
                "required": [
                  "type",
                  "name",
                  "npc"
                ],
                "description": "Monture ou compagnon que l’objet invoque."
              },
              "other_names": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Autres noms : nom anglais, anciens noms français."
              },
              "versions": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Ref"
                },
                "description": "La même fiche dans chaque version du jeu où elle existe (elle comprise)."
              },
              "guides": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string",
                      "description": "Titre du guide."
                    },
                    "url": {
                      "type": "string",
                      "description": "Adresse du guide sur assemblee-defias.fr."
                    }
                  },
                  "required": [
                    "title",
                    "url"
                  ]
                },
                "description": "Guides de L’Assemblée des Défias qui citent cette fiche."
              }
            },
            "required": [
              "required_reputation",
              "dropped_by",
              "rewarded_by",
              "summons",
              "other_names",
              "versions",
              "guides"
            ]
          }
        ]
      },
      "Spell": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "spell",
            "description": "Type d’objet, toujours « spell »."
          },
          "id": {
            "type": "integer",
            "description": "Identifiant de le sort : son numéro dans le jeu (entrée de la base du jeu), le même dans les trois versions quand le sort y existe."
          },
          "key": {
            "type": "string",
            "description": "Clé WoWDB, unique dans toute la base : « <version>:<type>:<id> » (classic:spell:1784)."
          },
          "version": {
            "type": "string",
            "enum": [
              "classic",
              "tbc",
              "wotlk"
            ],
            "description": "Version du jeu de cette fiche."
          },
          "name": {
            "type": "string",
            "description": "Nom français, comme en jeu."
          },
          "icon": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse absolue de l’icône du jeu (WebP, JPEG ou PNG), servie par WoWDB ; null si la fiche n’en a pas."
          },
          "rank": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Rang du sort ; null pour un sort sans rang."
          },
          "required_level": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Niveau requis."
          },
          "talent": {
            "type": "boolean",
            "description": "Vrai pour un talent."
          },
          "tooltip": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Infobulle du jeu, ligne par ligne, en français (sans le prix de vente, donné par sell_price)."
          },
          "url": {
            "type": "string",
            "description": "Adresse publique de la fiche sur WoWDB (page HTML, à donner à vos lecteurs)."
          },
          "api_url": {
            "type": "string",
            "description": "Adresse de le sort dans l’API."
          }
        },
        "required": [
          "object",
          "id",
          "key",
          "version",
          "name",
          "icon",
          "rank",
          "required_level",
          "talent",
          "tooltip",
          "url",
          "api_url"
        ],
        "title": "Sort",
        "description": "Sort (résumé, tel que dans les listes et la recherche). Documentation : https://docs.wowdb.assemblee-defias.fr/spells"
      },
      "SpellDetail": {
        "title": "Sort (fiche complète)",
        "description": "Fiche complète : le résumé Spell, plus les champs de détail.",
        "allOf": [
          {
            "$ref": "#/components/schemas/Spell"
          },
          {
            "type": "object",
            "properties": {
              "ranks": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "rank": {
                      "type": "integer",
                      "description": "Rang."
                    },
                    "required_level": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Niveau requis."
                    },
                    "spell": {
                      "$ref": "#/components/schemas/Ref",
                      "description": "Fiche du rang."
                    }
                  },
                  "required": [
                    "rank",
                    "required_level",
                    "spell"
                  ]
                },
                "description": "Tous les rangs de ce sort dans la même version."
              },
              "versions": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Ref"
                },
                "description": "La même fiche dans chaque version du jeu où elle existe (elle comprise)."
              },
              "guides": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string",
                      "description": "Titre du guide."
                    },
                    "url": {
                      "type": "string",
                      "description": "Adresse du guide sur assemblee-defias.fr."
                    }
                  },
                  "required": [
                    "title",
                    "url"
                  ]
                },
                "description": "Guides de L’Assemblée des Défias qui citent cette fiche."
              }
            },
            "required": [
              "ranks",
              "versions",
              "guides"
            ]
          }
        ]
      },
      "Quest": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "quest",
            "description": "Type d’objet, toujours « quest »."
          },
          "id": {
            "type": "integer",
            "description": "Identifiant de la quête : son numéro dans le jeu (entrée de la base du jeu), le même dans les trois versions quand la quête y existe."
          },
          "key": {
            "type": "string",
            "description": "Clé WoWDB, unique dans toute la base : « <version>:<type>:<id> » (classic:quest:166)."
          },
          "version": {
            "type": "string",
            "enum": [
              "classic",
              "tbc",
              "wotlk"
            ],
            "description": "Version du jeu de cette fiche."
          },
          "name": {
            "type": "string",
            "description": "Nom français, comme en jeu."
          },
          "icon": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse absolue de l’icône du jeu (WebP, JPEG ou PNG), servie par WoWDB ; null si la fiche n’en a pas."
          },
          "level": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Niveau de la quête."
          },
          "required_level": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Niveau requis pour la prendre."
          },
          "side": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "alliance",
              "horde",
              "both",
              null
            ],
            "description": "Camp qui peut la faire."
          },
          "side_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Camp, libellé français."
          },
          "type": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "group",
              "elite",
              "dungeon",
              "raid",
              "heroic",
              "pvp",
              "escort",
              "legendary",
              "world_event",
              "life",
              "other",
              null
            ],
            "description": "Type de quête du jeu (groupe, donjon, raid…) ; null pour une quête normale."
          },
          "type_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Type, libellé français."
          },
          "daily": {
            "type": "boolean",
            "description": "Quête journalière."
          },
          "weekly": {
            "type": "boolean",
            "description": "Quête hebdomadaire."
          },
          "repeatable": {
            "type": "boolean",
            "description": "Quête répétable."
          },
          "category": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "type": {
                "type": "string",
                "description": "« zone » ou « sort » (catégorie du jeu)."
              },
              "id": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Numéro de la zone ou de la catégorie (filtre zone des listes)."
              },
              "name": {
                "type": "string",
                "description": "Nom français."
              }
            },
            "required": [
              "type",
              "id",
              "name"
            ],
            "description": "Catégorie du journal de quêtes : une zone ou une catégorie du jeu (classe, métier, événement)."
          },
          "instance": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/InstanceRef"
              },
              {
                "type": "null"
              }
            ],
            "description": "Donjon ou raid de la quête."
          },
          "xp": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Expérience gagnée."
          },
          "money": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Argent gagné, en cuivre."
          },
          "reward_items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "item": {
                  "$ref": "#/components/schemas/ItemRef",
                  "description": "L’objet."
                },
                "choice": {
                  "type": "boolean",
                  "description": "Vrai si c’est une récompense au choix."
                }
              },
              "required": [
                "item",
                "choice"
              ]
            },
            "description": "Objets de récompense, donnés ou au choix."
          },
          "rogue": {
            "type": "boolean",
            "description": "Utile au voleur (récompense ou objectif qui le concerne, quête de classe)."
          },
          "internal": {
            "type": "boolean",
            "description": "Quête interne du jeu (jamais sortie) : absente des listes et de la recherche."
          },
          "url": {
            "type": "string",
            "description": "Adresse publique de la fiche sur WoWDB (page HTML, à donner à vos lecteurs)."
          },
          "api_url": {
            "type": "string",
            "description": "Adresse de la quête dans l’API."
          }
        },
        "required": [
          "object",
          "id",
          "key",
          "version",
          "name",
          "icon",
          "level",
          "required_level",
          "side",
          "side_name",
          "type",
          "type_name",
          "daily",
          "weekly",
          "repeatable",
          "category",
          "instance",
          "xp",
          "money",
          "reward_items",
          "rogue",
          "internal",
          "url",
          "api_url"
        ],
        "title": "Quête",
        "description": "Quête (résumé, tel que dans les listes et la recherche). Documentation : https://docs.wowdb.assemblee-defias.fr/quests"
      },
      "QuestDetail": {
        "title": "Quête (fiche complète)",
        "description": "Fiche complète : le résumé Quest, plus les champs de détail.",
        "allOf": [
          {
            "$ref": "#/components/schemas/Quest"
          },
          {
            "type": "object",
            "properties": {
              "max_level": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Niveau maximum pour la prendre."
              },
              "players": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Nombre de joueurs conseillé."
              },
              "shareable": {
                "type": [
                  "boolean",
                  "null"
                ],
                "description": "Partageable avec le groupe."
              },
              "time_limit_text": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Temps limité, en clair (« 15 min »)."
              },
              "races": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Races qui peuvent la prendre, en clair ; null pour toutes."
              },
              "classes": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Classes qui peuvent la prendre, en clair ; null pour toutes."
              },
              "skill": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Métier."
                  },
                  "level": {
                    "type": "integer",
                    "description": "Niveau de métier."
                  }
                },
                "required": [
                  "name",
                  "level"
                ],
                "description": "Métier requis."
              },
              "objectives": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Objectifs, texte du jeu."
              },
              "description": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Description, texte du jeu."
              },
              "progress": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Texte de progression (quête pas encore finie)."
              },
              "completion": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Texte de fin."
              },
              "requirements": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "description": "item (objet à rapporter), creature, object (objet du monde), money, reputation, players, explore ou text."
                    },
                    "name": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Nom de l’objectif."
                    },
                    "quantity": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Quantité."
                    },
                    "record": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/Ref"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Fiche de l’objet, de la créature ou de la réputation."
                    },
                    "money": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Argent demandé, en cuivre (kind money)."
                    },
                    "rank_name": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Rang à atteindre (kind reputation)."
                    },
                    "value": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Valeur de réputation (kind reputation)."
                    },
                    "zones": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Zones de l’objectif."
                    },
                    "instance": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/InstanceRef"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Donjon de l’objectif."
                    },
                    "text": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Libellé du jeu, quand il diffère du nom."
                    }
                  },
                  "required": [
                    "kind",
                    "name",
                    "quantity",
                    "record"
                  ]
                },
                "description": "Ce qu’il faut faire ou rapporter."
              },
              "rewards": {
                "type": "object",
                "properties": {
                  "items": {
                    "type": "array",
                    "items": {
                      "type": "object"
                    },
                    "description": "Objets donnés : item (ItemRef ou null), name, quantity."
                  },
                  "choices": {
                    "type": "array",
                    "items": {
                      "type": "object"
                    },
                    "description": "Objets au choix : item, name, quantity."
                  },
                  "money": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Argent, en cuivre."
                  },
                  "money_max_level": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Argent au niveau maximum, en cuivre."
                  },
                  "xp": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Expérience."
                  },
                  "spell": {
                    "type": [
                      "object",
                      "null"
                    ],
                    "description": "Sort appris : name et spell (Ref ou null)."
                  },
                  "title": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Titre obtenu."
                  },
                  "honor": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Points d’honneur."
                  },
                  "arena": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Points d’arène."
                  },
                  "talents": {
                    "type": [
                      "integer",
                      "null"
                    ],
                    "description": "Points de talent."
                  },
                  "reputation": {
                    "type": "array",
                    "items": {
                      "type": "object"
                    },
                    "description": "Réputation gagnée : faction (Ref ou null), name, value."
                  }
                },
                "required": [
                  "items",
                  "choices",
                  "money",
                  "money_max_level",
                  "xp",
                  "spell",
                  "title",
                  "honor",
                  "arena",
                  "talents",
                  "reputation"
                ],
                "description": "Récompenses."
              },
              "starts": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "description": "npc, item (objet qui commence la quête) ou game_object."
                    },
                    "name": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Nom."
                    },
                    "record": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/Ref"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Sa fiche."
                    },
                    "zones": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Zones où le trouver."
                    },
                    "instance": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/InstanceRef"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Donjon où le trouver."
                    }
                  },
                  "required": [
                    "type",
                    "name",
                    "record",
                    "zones",
                    "instance"
                  ]
                },
                "description": "Qui donne la quête."
              },
              "ends": {
                "type": "array",
                "items": {
                  "type": "object"
                },
                "description": "Qui reprend la quête (mêmes champs que starts)."
              },
              "chain": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "previous": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Ref"
                    },
                    "description": "À faire avant."
                  },
                  "follows": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Ref"
                    },
                    "description": "Quête dont elle est la suite directe."
                  },
                  "next": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Ref"
                    },
                    "description": "Quêtes ouvertes ensuite."
                  },
                  "direct": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Ref"
                    },
                    "description": "Suite directe, proposée aussitôt."
                  },
                  "exclusive": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Ref"
                    },
                    "description": "Quêtes exclusives : une seule possible."
                  },
                  "group": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Ref"
                    },
                    "description": "Quêtes du même ensemble."
                  },
                  "opened_by": {
                    "anyOf": [
                      {
                        "$ref": "#/components/schemas/ItemRef"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "Objet qui ouvre la quête."
                  }
                },
                "required": [
                  "previous",
                  "follows",
                  "next",
                  "direct",
                  "exclusive",
                  "group",
                  "opened_by"
                ],
                "description": "Suite de quêtes."
              },
              "versions": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Ref"
                },
                "description": "La même fiche dans chaque version du jeu où elle existe (elle comprise)."
              },
              "guides": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string",
                      "description": "Titre du guide."
                    },
                    "url": {
                      "type": "string",
                      "description": "Adresse du guide sur assemblee-defias.fr."
                    }
                  },
                  "required": [
                    "title",
                    "url"
                  ]
                },
                "description": "Guides de L’Assemblée des Défias qui citent cette fiche."
              }
            },
            "required": [
              "max_level",
              "players",
              "shareable",
              "time_limit_text",
              "races",
              "classes",
              "skill",
              "objectives",
              "description",
              "progress",
              "completion",
              "requirements",
              "rewards",
              "starts",
              "ends",
              "chain",
              "versions",
              "guides"
            ]
          }
        ]
      },
      "Npc": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "npc",
            "description": "Type d’objet, toujours « npc »."
          },
          "id": {
            "type": "integer",
            "description": "Identifiant de le PNJ : son numéro dans le jeu (entrée de la base du jeu), le même dans les trois versions quand le PNJ y existe."
          },
          "key": {
            "type": "string",
            "description": "Clé WoWDB, unique dans toute la base : « <version>:<type>:<id> » (classic:npc:639)."
          },
          "version": {
            "type": "string",
            "enum": [
              "classic",
              "tbc",
              "wotlk"
            ],
            "description": "Version du jeu de cette fiche."
          },
          "name": {
            "type": "string",
            "description": "Nom français, comme en jeu."
          },
          "icon": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse absolue de l’icône du jeu (WebP, JPEG ou PNG), servie par WoWDB ; null si la fiche n’en a pas."
          },
          "subtitle": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sous-titre (« Caïd défias »)."
          },
          "level_min": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Niveau minimum ; null si inconnu (« ?? » des boss)."
          },
          "level_max": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Niveau maximum."
          },
          "type": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "humanoid",
              "beast",
              "demon",
              "dragonkin",
              "elemental",
              "giant",
              "undead",
              "mechanical",
              "critter",
              "totem",
              "non_combat_pet",
              "gas_cloud",
              "not_specified",
              "none",
              null
            ],
            "description": "Type de créature."
          },
          "type_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Type, libellé français."
          },
          "family": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "wolf",
              "cat",
              "spider",
              "bear",
              "boar",
              "crocolisk",
              "carrion_bird",
              "crab",
              "gorilla",
              "raptor",
              "tallstrider",
              "felhunter",
              "voidwalker",
              "succubus",
              "doomguard",
              "scorpid",
              "turtle",
              "imp",
              "bat",
              "hyena",
              "bird_of_prey",
              "wind_serpent",
              "felguard",
              "dragonhawk",
              "ravager",
              "warp_stalker",
              "sporebat",
              "nether_ray",
              "serpent",
              "moth",
              "chimaera",
              "devilsaur",
              "ghoul",
              "silithid",
              "worm",
              "rhino",
              "wasp",
              "core_hound",
              "spirit_beast",
              null
            ],
            "description": "Famille des bêtes et des démons."
          },
          "family_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Famille, libellé français."
          },
          "rank": {
            "type": "string",
            "enum": [
              "normal",
              "elite",
              "rare_elite",
              "boss",
              "rare"
            ],
            "description": "Rang : normal, élite, élite rare, boss, rare."
          },
          "rank_name": {
            "type": "string",
            "description": "Rang, libellé français."
          },
          "boss": {
            "type": "boolean",
            "description": "Vrai pour un boss (rang boss)."
          },
          "internal": {
            "type": "boolean",
            "description": "PNJ technique ou variante de difficulté : absent des listes et de la recherche."
          },
          "url": {
            "type": "string",
            "description": "Adresse publique de la fiche sur WoWDB (page HTML, à donner à vos lecteurs)."
          },
          "api_url": {
            "type": "string",
            "description": "Adresse de le PNJ dans l’API."
          }
        },
        "required": [
          "object",
          "id",
          "key",
          "version",
          "name",
          "icon",
          "subtitle",
          "level_min",
          "level_max",
          "type",
          "type_name",
          "family",
          "family_name",
          "rank",
          "rank_name",
          "boss",
          "internal",
          "url",
          "api_url"
        ],
        "title": "PNJ",
        "description": "PNJ (résumé, tel que dans les listes et la recherche). Documentation : https://docs.wowdb.assemblee-defias.fr/npcs"
      },
      "NpcDetail": {
        "title": "PNJ (fiche complète)",
        "description": "Fiche complète : le résumé Npc, plus les champs de détail.",
        "allOf": [
          {
            "$ref": "#/components/schemas/Npc"
          },
          {
            "type": "object",
            "properties": {
              "english_name": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Nom anglais."
              },
              "faction": {
                "type": [
                  "object",
                  "null"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Nom de la faction."
                  },
                  "faction": {
                    "anyOf": [
                      {
                        "$ref": "#/components/schemas/Ref"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "Réputation liée, quand elle a une fiche."
                  }
                },
                "required": [
                  "name",
                  "faction"
                ],
                "description": "Faction du PNJ."
              },
              "base_npc": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/Ref"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "PNJ de base, pour une variante de difficulté."
              },
              "zones": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Nom de la zone ou du donjon."
                    },
                    "positions": {
                      "type": "integer",
                      "description": "Nombre d’emplacements connus dans ce lieu."
                    },
                    "instance": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/InstanceRef"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Le donjon ou raid, quand le lieu en est un."
                    }
                  },
                  "required": [
                    "name",
                    "positions",
                    "instance"
                  ]
                },
                "description": "Lieux où il apparaît, du plus fréquent au plus rare."
              },
              "encounter": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/Encounter"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Rencontre de boss : place du PNJ dans son donjon ou raid ; null hors des rencontres."
              },
              "loot": {
                "$ref": "#/components/schemas/List",
                "description": "Butin : les 10 premiers objets (Loot), puis /npcs/{id}/loot."
              },
              "sells": {
                "$ref": "#/components/schemas/List",
                "description": "Objets vendus : les 10 premiers (VendorItem), puis /npcs/{id}/sells."
              },
              "quests": {
                "type": "object",
                "properties": {
                  "starts": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Ref"
                    },
                    "description": "Quêtes données."
                  },
                  "ends": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/Ref"
                    },
                    "description": "Quêtes reprises."
                  }
                },
                "required": [
                  "starts",
                  "ends"
                ],
                "description": "Quêtes qu’il donne et reprend."
              },
              "reputation": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "faction": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/Ref"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "La réputation."
                    },
                    "name": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Nom de la faction."
                    },
                    "value": {
                      "type": "integer",
                      "description": "Points gagnés."
                    },
                    "until_rank_name": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Jusqu’à quel rang."
                    }
                  },
                  "required": [
                    "faction",
                    "name",
                    "value",
                    "until_rank_name"
                  ]
                },
                "description": "Réputation gagnée en le tuant."
              },
              "summoned_by": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "item": {
                      "$ref": "#/components/schemas/ItemRef",
                      "description": "L’objet."
                    },
                    "type": {
                      "type": "string",
                      "description": "mount, companion ou other."
                    }
                  },
                  "required": [
                    "item",
                    "type"
                  ]
                },
                "description": "Objets qui l’invoquent (monture, compagnon)."
              },
              "locations_url": {
                "type": "string",
                "description": "Ses emplacements sur les cartes : /npcs/{id}/locations."
              },
              "versions": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Ref"
                },
                "description": "La même fiche dans chaque version du jeu où elle existe (elle comprise)."
              },
              "guides": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string",
                      "description": "Titre du guide."
                    },
                    "url": {
                      "type": "string",
                      "description": "Adresse du guide sur assemblee-defias.fr."
                    }
                  },
                  "required": [
                    "title",
                    "url"
                  ]
                },
                "description": "Guides de L’Assemblée des Défias qui citent cette fiche."
              }
            },
            "required": [
              "english_name",
              "faction",
              "base_npc",
              "zones",
              "encounter",
              "loot",
              "sells",
              "quests",
              "reputation",
              "summoned_by",
              "locations_url",
              "versions",
              "guides"
            ]
          }
        ]
      },
      "GameObject": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "game_object",
            "description": "Type d’objet, toujours « game_object »."
          },
          "id": {
            "type": "integer",
            "description": "Identifiant de l’objet du monde : son numéro dans le jeu (entrée de la base du jeu), le même dans les trois versions quand l’objet du monde y existe."
          },
          "key": {
            "type": "string",
            "description": "Clé WoWDB, unique dans toute la base : « <version>:<type>:<id> » (tbc:object:179498)."
          },
          "version": {
            "type": "string",
            "enum": [
              "classic",
              "tbc",
              "wotlk"
            ],
            "description": "Version du jeu de cette fiche."
          },
          "name": {
            "type": "string",
            "description": "Nom français, comme en jeu."
          },
          "icon": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse absolue de l’icône du jeu (WebP, JPEG ou PNG), servie par WoWDB ; null si la fiche n’en a pas."
          },
          "type": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "chest",
              "locked_chest",
              "quest_object",
              "ore",
              "herb",
              null
            ],
            "description": "Type : coffre, coffre verrouillé, objet de quête, gisement de minerai, herbe."
          },
          "type_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Type, libellé français."
          },
          "skill": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "skill": {
                "type": "string",
                "enum": [
                  "lockpicking",
                  "mining",
                  "herbalism"
                ],
                "description": "Compétence."
              },
              "name": {
                "type": "string",
                "description": "Compétence, libellé français."
              },
              "level": {
                "type": "integer",
                "description": "Niveau requis (Crochetage 250)."
              }
            },
            "required": [
              "skill",
              "name",
              "level"
            ],
            "description": "Compétence requise pour l’ouvrir ou le récolter."
          },
          "zone": {
            "type": [
              "string",
              "null"
            ],
            "description": "Lieu principal (le plus d’emplacements)."
          },
          "positions": {
            "type": "integer",
            "description": "Nombre d’emplacements possibles."
          },
          "rogue": {
            "type": "boolean",
            "description": "Utile au voleur : demande du Crochetage."
          },
          "internal": {
            "type": "boolean",
            "description": "Objet interne du jeu."
          },
          "url": {
            "type": "string",
            "description": "Adresse publique de la fiche sur WoWDB (page HTML, à donner à vos lecteurs)."
          },
          "api_url": {
            "type": "string",
            "description": "Adresse de l’objet du monde dans l’API."
          }
        },
        "required": [
          "object",
          "id",
          "key",
          "version",
          "name",
          "icon",
          "type",
          "type_name",
          "skill",
          "zone",
          "positions",
          "rogue",
          "internal",
          "url",
          "api_url"
        ],
        "title": "Objet du monde",
        "description": "Objet du monde (résumé, tel que dans les listes et la recherche). Documentation : https://docs.wowdb.assemblee-defias.fr/game-objects"
      },
      "GameObjectDetail": {
        "title": "Objet du monde (fiche complète)",
        "description": "Fiche complète : le résumé GameObject, plus les champs de détail.",
        "allOf": [
          {
            "$ref": "#/components/schemas/GameObject"
          },
          {
            "type": "object",
            "properties": {
              "english_name": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Nom anglais."
              },
              "keys": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/ItemRef"
                },
                "description": "Clés qui l’ouvrent."
              },
              "loot": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Loot"
                },
                "description": "Butin, de la meilleure chance à la plus faible."
              },
              "zones": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Nom de la zone ou du donjon."
                    },
                    "positions": {
                      "type": "integer",
                      "description": "Nombre d’emplacements connus dans ce lieu."
                    },
                    "instance": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/InstanceRef"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Le donjon ou raid, quand le lieu en est un."
                    }
                  },
                  "required": [
                    "name",
                    "positions",
                    "instance"
                  ]
                },
                "description": "Lieux où il apparaît, du plus fréquent au plus rare."
              },
              "locations_url": {
                "type": "string",
                "description": "Ses emplacements sur les cartes : /game-objects/{id}/locations."
              },
              "versions": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Ref"
                },
                "description": "La même fiche dans chaque version du jeu où elle existe (elle comprise)."
              },
              "guides": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string",
                      "description": "Titre du guide."
                    },
                    "url": {
                      "type": "string",
                      "description": "Adresse du guide sur assemblee-defias.fr."
                    }
                  },
                  "required": [
                    "title",
                    "url"
                  ]
                },
                "description": "Guides de L’Assemblée des Défias qui citent cette fiche."
              }
            },
            "required": [
              "english_name",
              "keys",
              "loot",
              "zones",
              "locations_url",
              "versions",
              "guides"
            ]
          }
        ]
      },
      "ItemSet": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "item_set",
            "description": "Type d’objet, toujours « item_set »."
          },
          "id": {
            "type": "integer",
            "description": "Identifiant de l’ensemble : son numéro dans le jeu (entrée de la base du jeu), le même dans les trois versions quand l’ensemble y existe."
          },
          "key": {
            "type": "string",
            "description": "Clé WoWDB, unique dans toute la base : « <version>:<type>:<id> » (tbc:item-set:184)."
          },
          "version": {
            "type": "string",
            "enum": [
              "classic",
              "tbc",
              "wotlk"
            ],
            "description": "Version du jeu de cette fiche."
          },
          "name": {
            "type": "string",
            "description": "Nom français, comme en jeu."
          },
          "icon": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse absolue de l’icône du jeu (WebP, JPEG ou PNG), servie par WoWDB ; null si la fiche n’en a pas."
          },
          "tooltip": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Infobulle de l’ensemble : pièces et bonus, ligne par ligne."
          },
          "url": {
            "type": "string",
            "description": "Adresse publique de la fiche sur WoWDB (page HTML, à donner à vos lecteurs)."
          },
          "api_url": {
            "type": "string",
            "description": "Adresse de l’ensemble dans l’API."
          }
        },
        "required": [
          "object",
          "id",
          "key",
          "version",
          "name",
          "icon",
          "tooltip",
          "url",
          "api_url"
        ],
        "title": "Ensemble",
        "description": "Ensemble (résumé, tel que dans les listes et la recherche). Documentation : https://docs.wowdb.assemblee-defias.fr/item-sets"
      },
      "ItemSetDetail": {
        "title": "Ensemble (fiche complète)",
        "description": "Fiche complète : le résumé ItemSet, plus les champs de détail.",
        "allOf": [
          {
            "$ref": "#/components/schemas/ItemSet"
          },
          {
            "type": "object",
            "properties": {
              "versions": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Ref"
                },
                "description": "La même fiche dans chaque version du jeu où elle existe (elle comprise)."
              },
              "guides": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string",
                      "description": "Titre du guide."
                    },
                    "url": {
                      "type": "string",
                      "description": "Adresse du guide sur assemblee-defias.fr."
                    }
                  },
                  "required": [
                    "title",
                    "url"
                  ]
                },
                "description": "Guides de L’Assemblée des Défias qui citent cette fiche."
              }
            },
            "required": [
              "versions",
              "guides"
            ]
          }
        ]
      },
      "Faction": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "faction",
            "description": "Type d’objet, toujours « faction »."
          },
          "id": {
            "type": "integer",
            "description": "Identifiant de la réputation : son numéro dans le jeu (entrée de la base du jeu), le même dans les trois versions quand la réputation y existe."
          },
          "key": {
            "type": "string",
            "description": "Clé WoWDB, unique dans toute la base : « <version>:<type>:<id> » (tbc:faction:970)."
          },
          "version": {
            "type": "string",
            "enum": [
              "classic",
              "tbc",
              "wotlk"
            ],
            "description": "Version du jeu de cette fiche."
          },
          "name": {
            "type": "string",
            "description": "Nom français, comme en jeu."
          },
          "icon": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse absolue de l’icône du jeu (WebP, JPEG ou PNG), servie par WoWDB ; null si la fiche n’en a pas."
          },
          "side": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "alliance",
              "horde",
              "both",
              null
            ],
            "description": "Camp."
          },
          "side_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Camp, libellé français."
          },
          "group": {
            "type": "boolean",
            "description": "Vrai pour un groupe de réputations (« Alliance », « Expédition de la Horde »)."
          },
          "parent": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "name": {
                "type": "string",
                "description": "Nom du groupe."
              },
              "faction": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/Ref"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Fiche du groupe."
              }
            },
            "required": [
              "name",
              "faction"
            ],
            "description": "Groupe parent."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Description du jeu."
          },
          "rewards_count": {
            "type": "integer",
            "description": "Nombre de récompenses."
          },
          "quests_count": {
            "type": "integer",
            "description": "Nombre de quêtes qui la font monter."
          },
          "monsters_count": {
            "type": "integer",
            "description": "Nombre de monstres qui la font monter."
          },
          "url": {
            "type": "string",
            "description": "Adresse publique de la fiche sur WoWDB (page HTML, à donner à vos lecteurs)."
          },
          "api_url": {
            "type": "string",
            "description": "Adresse de la réputation dans l’API."
          }
        },
        "required": [
          "object",
          "id",
          "key",
          "version",
          "name",
          "icon",
          "side",
          "side_name",
          "group",
          "parent",
          "description",
          "rewards_count",
          "quests_count",
          "monsters_count",
          "url",
          "api_url"
        ],
        "title": "Réputation",
        "description": "Réputation (résumé, tel que dans les listes et la recherche). Documentation : https://docs.wowdb.assemblee-defias.fr/factions"
      },
      "FactionDetail": {
        "title": "Réputation (fiche complète)",
        "description": "Fiche complète : le résumé Faction, plus les champs de détail.",
        "allOf": [
          {
            "$ref": "#/components/schemas/Faction"
          },
          {
            "type": "object",
            "properties": {
              "english_name": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Nom anglais."
              },
              "ranks": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "rank": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "enum": [
                        "hated",
                        "hostile",
                        "unfriendly",
                        "neutral",
                        "friendly",
                        "honored",
                        "revered",
                        "exalted",
                        null
                      ],
                      "description": "Rang."
                    },
                    "rank_name": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Rang, libellé du jeu."
                    },
                    "min": {
                      "type": "integer",
                      "description": "Valeur de début."
                    },
                    "max": {
                      "type": "integer",
                      "description": "Valeur de fin."
                    },
                    "rewards": {
                      "type": "integer",
                      "description": "Récompenses à ce rang."
                    }
                  },
                  "required": [
                    "rank",
                    "rank_name",
                    "min",
                    "max",
                    "rewards"
                  ]
                },
                "description": "Rangs, de Détesté à Exalté."
              },
              "starting_reputation": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "who": {
                      "type": "string",
                      "description": "Races et classes concernées, en clair."
                    },
                    "rank_name": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Rang de départ."
                    },
                    "value": {
                      "type": "integer",
                      "description": "Valeur de départ."
                    }
                  },
                  "required": [
                    "who",
                    "rank_name",
                    "value"
                  ]
                },
                "description": "Réputation de départ selon la race et la classe."
              },
              "rewards": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "item": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/ItemRef"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "L’objet."
                    },
                    "name": {
                      "type": "string",
                      "description": "Nom."
                    },
                    "rank": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "enum": [
                        "hated",
                        "hostile",
                        "unfriendly",
                        "neutral",
                        "friendly",
                        "honored",
                        "revered",
                        "exalted",
                        null
                      ],
                      "description": "Rang requis."
                    },
                    "rank_name": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Rang requis, libellé du jeu."
                    },
                    "vendors": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      },
                      "description": "Intendants : npc (Ref ou null), name, cost (honor, arena, personal_rating, items)."
                    }
                  },
                  "required": [
                    "item",
                    "name",
                    "rank",
                    "rank_name",
                    "vendors"
                  ]
                },
                "description": "Récompenses par rang, avec leurs intendants et leur prix."
              },
              "quests": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "quest": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/Ref"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "La quête."
                    },
                    "name": {
                      "type": "string",
                      "description": "Nom."
                    },
                    "value": {
                      "type": "integer",
                      "description": "Points gagnés."
                    },
                    "repeatable": {
                      "type": "boolean",
                      "description": "Répétable."
                    },
                    "items": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      },
                      "description": "Objets à rendre : item, name, quantity."
                    }
                  },
                  "required": [
                    "quest",
                    "name",
                    "value",
                    "repeatable",
                    "items"
                  ]
                },
                "description": "Quêtes qui la font monter."
              },
              "monsters": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "npc": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/Ref"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Le monstre."
                    },
                    "name": {
                      "type": "string",
                      "description": "Nom."
                    },
                    "values": {
                      "type": "array",
                      "items": {
                        "type": "object"
                      },
                      "description": "Par variante (normal, héroïque…) : variant, variant_name, value, until_rank_name."
                    }
                  },
                  "required": [
                    "npc",
                    "name",
                    "values"
                  ]
                },
                "description": "Monstres qui la font monter, les plus rentables d’abord."
              },
              "children": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Ref"
                },
                "description": "Réputations du groupe."
              },
              "versions": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/Ref"
                },
                "description": "La même fiche dans chaque version du jeu où elle existe (elle comprise)."
              },
              "guides": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string",
                      "description": "Titre du guide."
                    },
                    "url": {
                      "type": "string",
                      "description": "Adresse du guide sur assemblee-defias.fr."
                    }
                  },
                  "required": [
                    "title",
                    "url"
                  ]
                },
                "description": "Guides de L’Assemblée des Défias qui citent cette fiche."
              }
            },
            "required": [
              "english_name",
              "ranks",
              "starting_reputation",
              "rewards",
              "quests",
              "monsters",
              "children",
              "versions",
              "guides"
            ]
          }
        ]
      },
      "Instance": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "instance",
            "description": "Toujours « instance »."
          },
          "id": {
            "type": "integer",
            "description": "Numéro de carte du jeu (36 : Mortemines)."
          },
          "key": {
            "type": "string",
            "description": "Clé WoWDB : « <version>:<carte> » (classic:36)."
          },
          "version": {
            "type": "string",
            "enum": [
              "classic",
              "tbc",
              "wotlk"
            ],
            "description": "Version du jeu."
          },
          "name": {
            "type": "string",
            "description": "Nom français."
          },
          "icon": {
            "type": [
              "string",
              "null"
            ],
            "description": "Adresse absolue de l’icône du jeu (WebP, JPEG ou PNG), servie par WoWDB ; null si la fiche n’en a pas."
          },
          "type": {
            "type": "string",
            "enum": [
              "dungeon",
              "raid"
            ],
            "description": "Donjon ou raid."
          },
          "type_name": {
            "type": "string",
            "description": "Libellé français."
          },
          "level_min": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Niveau conseillé minimum."
          },
          "level_max": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Niveau conseillé maximum."
          },
          "required_level": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Niveau requis pour entrer."
          },
          "players": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Nombre de joueurs."
          },
          "bosses": {
            "type": "integer",
            "description": "Nombre de boss."
          },
          "items": {
            "type": "integer",
            "description": "Nombre d’objets de butin."
          },
          "rogue_items": {
            "type": "integer",
            "description": "Objets utiles au voleur dans le butin."
          },
          "url": {
            "type": "string",
            "description": "Page du donjon sur WoWDB."
          },
          "api_url": {
            "type": "string",
            "description": "Adresse du donjon dans l’API."
          }
        },
        "required": [
          "object",
          "id",
          "key",
          "version",
          "name",
          "icon",
          "type",
          "type_name",
          "level_min",
          "level_max",
          "required_level",
          "players",
          "bosses",
          "items",
          "rogue_items",
          "url",
          "api_url"
        ],
        "title": "Donjon ou raid",
        "description": "Donjon ou raid (résumé, tel que dans les listes et la recherche). Documentation : https://docs.wowdb.assemblee-defias.fr/instances"
      },
      "InstanceDetail": {
        "title": "Donjon ou raid (fiche complète)",
        "description": "Fiche complète : le résumé Instance, plus les champs de détail.",
        "allOf": [
          {
            "$ref": "#/components/schemas/Instance"
          },
          {
            "type": "object",
            "properties": {
              "modes": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Libellé (« 10 joueurs héroïque »)."
                    },
                    "players": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Joueurs."
                    }
                  },
                  "required": [
                    "name",
                    "players"
                  ]
                },
                "description": "Modes de difficulté du jeu."
              },
              "difficulties": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "difficulty": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "enum": [
                        "normal",
                        "heroic",
                        "10_player",
                        "25_player",
                        "10_player_heroic",
                        "25_player_heroic",
                        null
                      ],
                      "description": "Code."
                    },
                    "difficulty_name": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Libellé."
                    }
                  },
                  "required": [
                    "difficulty",
                    "difficulty_name"
                  ]
                },
                "description": "Difficultés qui ont du butin."
              },
              "access": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "description": "item, quest ou achievement."
                    },
                    "heroic": {
                      "type": "boolean",
                      "description": "Vrai pour le mode héroïque."
                    },
                    "name": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Nom."
                    },
                    "item": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/Ref"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "La clé (type item)."
                    },
                    "quest": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/Ref"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "La quête (type quest)."
                    }
                  },
                  "required": [
                    "type",
                    "heroic",
                    "name"
                  ]
                },
                "description": "Conditions d’accès : clé, quête, haut fait."
              },
              "encounters": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "position": {
                      "type": "integer",
                      "description": "Place dans le donjon (1 = première)."
                    },
                    "name": {
                      "type": "string",
                      "description": "Nom de la rencontre."
                    },
                    "npc": {
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/Ref"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Fiche du boss."
                    },
                    "icon": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Icône du boss."
                    },
                    "items": {
                      "type": "integer",
                      "description": "Objets de butin."
                    },
                    "rogue_items": {
                      "type": "integer",
                      "description": "Objets utiles au voleur."
                    },
                    "difficulties": {
                      "type": "array",
                      "items": {
                        "type": "string",
                        "enum": [
                          "normal",
                          "heroic",
                          "10_player",
                          "25_player",
                          "10_player_heroic",
                          "25_player_heroic"
                        ]
                      },
                      "description": "Difficultés où il a du butin."
                    },
                    "loot_url": {
                      "type": "string",
                      "description": "Son butin : /instances/{id}/loot?encounter=<id du PNJ>."
                    }
                  },
                  "required": [
                    "position",
                    "name",
                    "npc",
                    "icon",
                    "items",
                    "rogue_items",
                    "difficulties",
                    "loot_url"
                  ]
                },
                "description": "Rencontres, dans l’ordre du jeu quand il est connu."
              },
              "game_order": {
                "type": "boolean",
                "description": "Vrai si les rencontres suivent l’ordre du jeu (sinon : ordre alphabétique)."
              },
              "quests": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "quest": {
                      "$ref": "#/components/schemas/Ref",
                      "description": "La quête."
                    },
                    "reason": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Lien avec le donjon (« Quête du donjon »)."
                    },
                    "level": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "Niveau."
                    }
                  },
                  "required": [
                    "quest",
                    "reason",
                    "level"
                  ]
                },
                "description": "Quêtes liées au donjon."
              },
              "loot_url": {
                "type": "string",
                "description": "Tout le butin : /instances/{id}/loot."
              },
              "versions": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/InstanceRef"
                },
                "description": "Le même donjon dans chaque version."
              },
              "guides": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "type": "string",
                      "description": "Titre du guide."
                    },
                    "url": {
                      "type": "string",
                      "description": "Adresse du guide sur assemblee-defias.fr."
                    }
                  },
                  "required": [
                    "title",
                    "url"
                  ]
                },
                "description": "Guides de L’Assemblée des Défias qui citent cette fiche."
              }
            },
            "required": [
              "modes",
              "difficulties",
              "access",
              "encounters",
              "game_order",
              "quests",
              "loot_url",
              "versions",
              "guides"
            ]
          }
        ]
      },
      "Loot": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "loot",
            "description": "Toujours « loot »."
          },
          "item": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ItemRef"
              },
              {
                "type": "null"
              }
            ],
            "description": "L’objet (avec niveau, emplacement et type)."
          },
          "name": {
            "type": "string",
            "description": "Nom de l’objet."
          },
          "chance": {
            "type": [
              "number",
              "null"
            ],
            "description": "Chance de butin en pour cent (la plus haute des difficultés)."
          },
          "difficulties": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "normal",
                "heroic",
                "10_player",
                "25_player",
                "10_player_heroic",
                "25_player_heroic"
              ]
            },
            "description": "Difficultés où il tombe."
          },
          "quest_item": {
            "type": "boolean",
            "description": "Objet de quête (ne tombe que pour qui a la quête)."
          },
          "instance": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/InstanceRef"
              },
              {
                "type": "null"
              }
            ],
            "description": "Donjon où il tombe."
          }
        },
        "required": [
          "object",
          "item",
          "name",
          "chance",
          "difficulties",
          "quest_item",
          "instance"
        ],
        "title": "Butin",
        "description": "Une ligne de butin d’un PNJ ou d’un objet du monde."
      },
      "InstanceLoot": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "loot",
            "description": "Toujours « loot »."
          },
          "item": {
            "$ref": "#/components/schemas/ItemRef",
            "description": "L’objet."
          },
          "name": {
            "type": "string",
            "description": "Nom."
          },
          "chance": {
            "type": [
              "number",
              "null"
            ],
            "description": "Chance en pour cent."
          },
          "difficulty": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "normal",
              "heroic",
              "10_player",
              "25_player",
              "10_player_heroic",
              "25_player_heroic",
              null
            ],
            "description": "Difficulté."
          },
          "difficulty_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Libellé."
          },
          "rogue": {
            "type": "boolean",
            "description": "Utile au voleur."
          },
          "source": {
            "type": "object",
            "properties": {
              "kind": {
                "type": "string",
                "description": "encounter (boss), chest (coffre) ou npc (autre monstre)."
              },
              "name": {
                "type": "string",
                "description": "Nom."
              },
              "boss": {
                "type": "boolean",
                "description": "Vrai pour un boss."
              },
              "npc": {
                "anyOf": [
                  {
                    "$ref": "#/components/schemas/Ref"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Fiche du PNJ."
              },
              "npc_ids": {
                "type": "array",
                "items": {
                  "type": "integer"
                },
                "description": "Identifiants du PNJ dans chaque difficulté (filtre encounter)."
              }
            },
            "required": [
              "kind",
              "name",
              "boss",
              "npc",
              "npc_ids"
            ],
            "description": "Qui le lâche."
          }
        },
        "required": [
          "object",
          "item",
          "name",
          "chance",
          "difficulty",
          "difficulty_name",
          "rogue",
          "source"
        ],
        "title": "Butin de donjon",
        "description": "Une ligne de butin d’un donjon ou d’un raid : un objet, une source, une difficulté."
      },
      "VendorItem": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "vendor_item",
            "description": "Toujours « vendor_item »."
          },
          "item": {
            "$ref": "#/components/schemas/ItemRef",
            "description": "L’objet."
          },
          "name": {
            "type": "string",
            "description": "Nom."
          }
        },
        "required": [
          "object",
          "item",
          "name"
        ],
        "title": "Objet vendu",
        "description": "Un objet vendu par un PNJ."
      },
      "NpcQuest": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "npc_quest",
            "description": "Toujours « npc_quest »."
          },
          "role": {
            "type": "string",
            "enum": [
              "starts",
              "ends"
            ],
            "description": "starts (il la donne) ou ends (il la reprend)."
          },
          "quest": {
            "$ref": "#/components/schemas/Ref",
            "description": "La quête."
          },
          "level": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Niveau de la quête."
          }
        },
        "required": [
          "object",
          "role",
          "quest",
          "level"
        ],
        "title": "Quête d’un PNJ",
        "description": "Quête que le PNJ donne ou reprend."
      },
      "Map": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "map",
            "description": "Toujours « map »."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Nom de la zone ou de l’étage."
          },
          "floor": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Étage du donjon ; null pour une zone."
          },
          "instance": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/InstanceRef"
              },
              {
                "type": "null"
              }
            ],
            "description": "Donjon de l’étage."
          },
          "image": {
            "type": [
              "string",
              "null"
            ],
            "description": "Fond de carte du jeu (WebP), servi par WoWDB."
          },
          "width": {
            "type": "integer",
            "description": "Largeur de référence du fond, en pixels."
          },
          "height": {
            "type": "integer",
            "description": "Hauteur de référence."
          },
          "points": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "x": {
                  "type": "number",
                  "description": "Abscisse (0 à gauche)."
                },
                "y": {
                  "type": "number",
                  "description": "Ordonnée (0 en haut)."
                }
              },
              "required": [
                "x",
                "y"
              ]
            },
            "description": "Emplacements, en pour cent de la largeur et de la hauteur (0 à 100), comme les coordonnées du jeu."
          }
        },
        "required": [
          "object",
          "name",
          "floor",
          "instance",
          "image",
          "width",
          "height",
          "points"
        ],
        "title": "Carte",
        "description": "Un fond de carte du jeu (zone ou étage de donjon) et les emplacements d’un PNJ ou d’un objet du monde."
      },
      "Encounter": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "encounter",
            "description": "Toujours « encounter »."
          },
          "instance": {
            "$ref": "#/components/schemas/InstanceRef",
            "description": "Le donjon ou raid."
          },
          "position": {
            "type": "integer",
            "description": "Place de la rencontre (1 = première)."
          },
          "total": {
            "type": "integer",
            "description": "Nombre de rencontres du donjon."
          },
          "game_order": {
            "type": "boolean",
            "description": "Vrai si l’ordre est celui du jeu."
          },
          "previous": {
            "type": [
              "object",
              "null"
            ],
            "description": "Rencontre précédente : name et npc (Ref ou null)."
          },
          "next": {
            "type": [
              "object",
              "null"
            ],
            "description": "Rencontre suivante : name et npc."
          },
          "items": {
            "type": "integer",
            "description": "Objets de son butin."
          },
          "rogue_items": {
            "type": "integer",
            "description": "Objets utiles au voleur."
          },
          "difficulties": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Difficultés : difficulty, difficulty_name, items."
          },
          "loot_url": {
            "type": "string",
            "description": "Son butin détaillé : /instances/{id}/loot?encounter=<id>."
          }
        },
        "required": [
          "object",
          "instance",
          "position",
          "total",
          "game_order",
          "previous",
          "next",
          "items",
          "rogue_items",
          "difficulties",
          "loot_url"
        ],
        "title": "Rencontre",
        "description": "Place d’un boss dans son donjon ou raid."
      },
      "Version": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "version",
            "description": "Toujours « version »."
          },
          "id": {
            "type": "string",
            "enum": [
              "classic",
              "tbc",
              "wotlk"
            ],
            "description": "Clé de la version, à mettre dans les adresses (/v1/{version}/…)."
          },
          "name": {
            "type": "string",
            "description": "Nom court."
          },
          "full_name": {
            "type": "string",
            "description": "Nom complet."
          },
          "patch": {
            "type": "string",
            "description": "Version finale du client, celle des serveurs actuels."
          },
          "released": {
            "type": "integer",
            "description": "Année de sortie."
          },
          "counts": {
            "type": "object",
            "properties": {
              "items": {
                "type": "integer",
                "description": "Nombre de items."
              },
              "spells": {
                "type": "integer",
                "description": "Nombre de spells."
              },
              "quests": {
                "type": "integer",
                "description": "Nombre de quests."
              },
              "npcs": {
                "type": "integer",
                "description": "Nombre de npcs."
              },
              "game_objects": {
                "type": "integer",
                "description": "Nombre de game_objects."
              },
              "item_sets": {
                "type": "integer",
                "description": "Nombre de item_sets."
              },
              "factions": {
                "type": "integer",
                "description": "Nombre de factions."
              },
              "instances": {
                "type": "integer",
                "description": "Nombre de instances."
              }
            },
            "required": [
              "items",
              "spells",
              "quests",
              "npcs",
              "game_objects",
              "item_sets",
              "factions",
              "instances"
            ],
            "description": "Nombre de fiches visibles par ressource."
          },
          "rogue_counts": {
            "type": "object",
            "properties": {
              "items": {
                "type": "integer",
                "description": "items utiles au voleur."
              },
              "quests": {
                "type": "integer",
                "description": "quests utiles au voleur."
              },
              "game_objects": {
                "type": "integer",
                "description": "game_objects utiles au voleur."
              }
            },
            "required": [
              "items",
              "quests",
              "game_objects"
            ],
            "description": "Fiches utiles au voleur."
          },
          "url": {
            "type": "string",
            "description": "Catalogue de cette version sur WoWDB."
          },
          "api_url": {
            "type": "string",
            "description": "Adresse dans l’API."
          }
        },
        "required": [
          "object",
          "id",
          "name",
          "full_name",
          "patch",
          "released",
          "counts",
          "rogue_counts",
          "url",
          "api_url"
        ],
        "title": "Version du jeu"
      },
      "Stats": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "stats",
            "description": "Toujours « stats »."
          },
          "records": {
            "type": "integer",
            "description": "Nombre total de fiches visibles (hors donjons)."
          },
          "by_version": {
            "type": "object",
            "description": "Effectifs par version (mêmes champs que counts de Version), clés classic, tbc, wotlk."
          },
          "rogue": {
            "type": "object",
            "description": "Fiches utiles au voleur par version."
          },
          "updated_at": {
            "type": "string",
            "description": "Date de la dernière mise à jour des données (AAAA-MM-JJ)."
          }
        },
        "required": [
          "object",
          "records",
          "by_version",
          "rogue",
          "updated_at"
        ],
        "title": "Statistiques"
      },
      "Api": {
        "type": "object",
        "properties": {
          "object": {
            "type": "string",
            "const": "api",
            "description": "Toujours « api »."
          },
          "name": {
            "type": "string",
            "description": "Nom."
          },
          "version": {
            "type": "string",
            "description": "Version de l’API (v1)."
          },
          "released": {
            "type": "string",
            "description": "Date de publication de la v1."
          },
          "data_updated": {
            "type": "string",
            "description": "Date des données."
          },
          "description": {
            "type": "string",
            "description": "Présentation."
          },
          "documentation": {
            "type": "string",
            "description": "Documentation."
          },
          "openapi": {
            "type": "string",
            "description": "Spécification OpenAPI."
          },
          "llms": {
            "type": "string",
            "description": "Index pour les assistants IA."
          },
          "website": {
            "type": "string",
            "description": "WoWDB."
          },
          "versions": {
            "type": "array",
            "items": {
              "type": "object"
            },
            "description": "Versions du jeu (id, api_url)."
          },
          "endpoints": {
            "type": "object",
            "description": "Adresses des ressources."
          }
        },
        "required": [
          "object",
          "name",
          "version",
          "released",
          "data_updated",
          "description",
          "documentation",
          "openapi",
          "llms",
          "website",
          "versions",
          "endpoints"
        ],
        "title": "Racine de l’API"
      },
      "SearchResult": {
        "title": "Résultat de recherche",
        "description": "Résumé d’une fiche de n’importe quel type ; le champ object indique lequel.",
        "oneOf": [
          {
            "$ref": "#/components/schemas/Item"
          },
          {
            "$ref": "#/components/schemas/Spell"
          },
          {
            "$ref": "#/components/schemas/Quest"
          },
          {
            "$ref": "#/components/schemas/Npc"
          },
          {
            "$ref": "#/components/schemas/GameObject"
          },
          {
            "$ref": "#/components/schemas/ItemSet"
          },
          {
            "$ref": "#/components/schemas/Faction"
          }
        ],
        "discriminator": {
          "propertyName": "object",
          "mapping": {
            "item": "#/components/schemas/Item",
            "spell": "#/components/schemas/Spell",
            "quest": "#/components/schemas/Quest",
            "npc": "#/components/schemas/Npc",
            "game_object": "#/components/schemas/GameObject",
            "item_set": "#/components/schemas/ItemSet",
            "faction": "#/components/schemas/Faction"
          }
        }
      }
    }
  }
}
