# API de WoWDB des Défias : documentation complète > Toutes les pages de https://docs.wowdb.assemblee-defias.fr en Markdown, dans l’ordre du sommaire. # API de WoWDB > L’API publique de WoWDB des Défias : 155 848 fiches de World of Warcraft Vanilla, TBC et WotLK, en français, en lecture seule, sans clé. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/ ## Introduction WoWDB des Défias est la base de données de L’Assemblée des Défias, le repaire des voleurs de World of Warcraft. Son API donne accès aux mêmes fiches que le [site](https://wowdb.assemblee-defias.fr/) : 80 745 objets, 51 791 PNJ, 19 713 quêtes, 2 536 objets du monde, 873 sorts du voleur, 172 réputations, 18 ensembles et 150 donjons et raids, pour les trois versions classiques du jeu. C’est une API REST qui renvoie du JSON. Elle est **publique, gratuite, en lecture seule et sans clé** : une adresse suffit, depuis un terminal, un serveur, un bot Discord, un addon, une page web ou un assistant IA. - **Une adresse de base** : `https://api.wowdb.assemblee-defias.fr/v1`. - **La version du jeu dans le chemin** : `/classic/…`, `/tbc/…` ou `/wotlk/…` ([versions du jeu](https://docs.wowdb.assemblee-defias.fr/versions)). - **Des objets typés et stables** : chaque réponse a un champ `object` (`item`, `npc`, `list`…), des noms de champs anglais en snake_case et des codes stables (`quality: "epic"`) ; les textes du jeu restent en français. - **Des liens partout** : chaque objet donne son `url` (la page WoWDB à montrer à vos lecteurs), son `api_url` et l’adresse absolue de son `icon`. - **Des listes paginées par curseur** ([pagination](https://docs.wowdb.assemblee-defias.fr/pagination)), des [filtres](https://docs.wowdb.assemblee-defias.fr/filtres), dont le filtre voleur, des [erreurs](https://docs.wowdb.assemblee-defias.fr/erreurs) JSON homogènes, un [cache HTTP](https://docs.wowdb.assemblee-defias.fr/cache) avec ETag. **URL de base** ```text https://api.wowdb.assemblee-defias.fr/v1 ``` **Requête (GET /v1)** #### cURL ```bash curl https://api.wowdb.assemblee-defias.fr/v1 ``` #### JavaScript ```js const res = await fetch("https://api.wowdb.assemblee-defias.fr/v1"); if (!res.ok) throw new Error((await res.json()).error.message); const api = await res.json(); console.log(api.name); ``` #### Python ```python import json import urllib.request req = urllib.request.Request( "https://api.wowdb.assemblee-defias.fr/v1", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: api = json.load(res) print(api["name"]) ``` #### PHP ```php ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1', false, $context); $api = json_decode($json, true); echo $api['name'], PHP_EOL; ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1") res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) api = JSON.parse(res.body) puts api["name"] ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" ) func main() { req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1", nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var api map[string]any if err := json.NewDecoder(res.Body).Decode(&api); err != nil { panic(err) } fmt.Println(api["name"]) } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1"); using var doc = JsonDocument.Parse(json); Console.WriteLine(doc.RootElement.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let api: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .call()? .into_json()?; println!("{}", api["name"].as_str().unwrap_or_default()); Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "api", "name": "API de WoWDB des Défias", "version": "v1", "released": "2026-10-01", "data_updated": "2026-10-01", "description": "API publique en lecture seule de WoWDB des Défias : objets, sorts, quêtes, PNJ, objets du monde, ensembles, réputations, donjons et raids de World of Warcraft (Vanilla, TBC, WotLK), en français.", "documentation": "https://docs.wowdb.assemblee-defias.fr/", "openapi": "https://api.wowdb.assemblee-defias.fr/v1/openapi.json", "llms": "https://docs.wowdb.assemblee-defias.fr/llms.txt", "website": "https://wowdb.assemblee-defias.fr/", "versions": [ { "id": "classic", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/versions/classic" }, { "id": "tbc", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/versions/tbc" }, { "id": "wotlk", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/versions/wotlk" } ], "endpoints": { "search": "https://api.wowdb.assemblee-defias.fr/v1/search?q={texte}", "stats": "https://api.wowdb.assemblee-defias.fr/v1/stats", "versions": "https://api.wowdb.assemblee-defias.fr/v1/versions", "items": "https://api.wowdb.assemblee-defias.fr/v1/{version}/items", "spells": "https://api.wowdb.assemblee-defias.fr/v1/{version}/spells", "quests": "https://api.wowdb.assemblee-defias.fr/v1/{version}/quests", "npcs": "https://api.wowdb.assemblee-defias.fr/v1/{version}/npcs", "game_objects": "https://api.wowdb.assemblee-defias.fr/v1/{version}/game-objects", "item_sets": "https://api.wowdb.assemblee-defias.fr/v1/{version}/item-sets", "factions": "https://api.wowdb.assemblee-defias.fr/v1/{version}/factions", "instances": "https://api.wowdb.assemblee-defias.fr/v1/{version}/instances" } } ``` ## Démarrage rapide : une première requête en 30 secondes 1. Ouvrez un terminal (ou la console de votre navigateur). 2. Copiez l’exemple ci-contre : la fiche de la **Barbelure cruelle**, l’épée qu’Edwin VanCleef laisse tomber aux Mortemines. 3. Lisez la réponse : nom, qualité, niveau, dégâts de l’arme, infobulle du jeu ligne par ligne, et `dropped_by` : VanCleef, 20 % de chances. Changez de langage avec le sélecteur en haut de l’exemple : votre choix est retenu sur toutes les pages. Aucune bibliothèque n’est nécessaire : chaque exemple n’utilise que la bibliothèque standard de son langage (sauf Rust). Il existe aussi des [bibliothèques clientes](https://docs.wowdb.assemblee-defias.fr/bibliotheques) d’un seul fichier. > **Bon à savoir** : Pas de clé, pas de compte : identifiez simplement votre application dans l’en-tête `User-Agent` ([authentification](https://docs.wowdb.assemblee-defias.fr/authentification)). **Requête (Première requête)** #### cURL ```bash curl https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191 ``` #### JavaScript ```js const res = await fetch("https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191"); if (!res.ok) throw new Error((await res.json()).error.message); const item = await res.json(); console.log(item.name); ``` #### Python ```python import json import urllib.request req = urllib.request.Request( "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: item = json.load(res) print(item["name"]) ``` #### PHP ```php ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191', false, $context); $item = json_decode($json, true); echo $item['name'], PHP_EOL; ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191") res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) item = JSON.parse(res.body) puts item["name"] ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" ) func main() { req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191", nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var item map[string]any if err := json.NewDecoder(res.Body).Decode(&item); err != nil { panic(err) } fmt.Println(item["name"]) } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191"); using var doc = JsonDocument.Parse(json); Console.WriteLine(doc.RootElement.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let item: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .call()? .into_json()?; println!("{}", item["name"].as_str().unwrap_or_default()); Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "item", "id": 5191, "key": "classic:item:5191", "version": "classic", "name": "Barbelure cruelle", "quality": "rare", "quality_name": "Rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_sword_24.jpg", "item_level": 24, "required_level": 19, "slot": "one_hand", "slot_name": "À une main", "type": "sword", "type_name": "Épée", "weapon": { "damage_min": 30, "damage_max": 57, "speed": 2.8, "dps": 15.5 }, "sell_price": 2964, "rogue": true, "internal": false, "tooltip": [ "Barbelure cruelle", "Niveau d'objet 24", "Lié quand ramassé", "À une main", "Épée", "Dégâts : 30 - 57", "Vitesse 2.80", "(15.5 dégâts par seconde)", "Durabilité 75 / 75", "Niveau 19 requis", "Équipé : Augmente de 12 la puissance d'attaque." ], "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:5191", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191", "required_reputation": null, "dropped_by": [ { "source_type": "npc", "name": "Edwin VanCleef", "npc": { "object": "npc", "id": 639, "version": "classic", "name": "Edwin VanCleef", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:639", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639" }, "boss": true, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" }, "difficulty": "normal", "difficulty_name": "Normal", "chance": 20 } ], "rewarded_by": [], "summons": null, "other_names": [], "versions": [ { "object": "item", "id": 5191, "version": "classic", "name": "Barbelure cruelle", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:5191", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191" }, { "object": "item", "id": 5191, "version": "tbc", "name": "Barbelure cruelle", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:5191", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/5191" }, { "object": "item", "id": 5191, "version": "wotlk", "name": "Barbelure cruelle", "url": "https://wowdb.assemblee-defias.fr/?id=wotlk:item:5191", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/wotlk/items/5191" } ], "guides": [] } ``` ## Lister, filtrer, paginer Les listes acceptent des filtres combinables. Ici, les dagues rares et épiques utiles au voleur jusqu’au niveau 30, de la meilleure à la moins bonne. Le filtre `rogue=true` est une option : sans lui, la liste contient tout. Une liste renvoie `{ object: "list", data, has_more, next_cursor, url }` : pour la page suivante, repassez `next_cursor` dans `cursor` ([pagination](https://docs.wowdb.assemblee-defias.fr/pagination)). **Requête (GET /v1/{version}/items)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/classic/items \ -d type=dagger \ -d rogue=true \ -d quality=rare,epic \ -d max_level=30 \ -d sort=-item_level \ -d limit=2 ``` #### JavaScript ```js const params = new URLSearchParams({ type: "dagger", rogue: "true", quality: "rare,epic", max_level: "30", sort: "-item_level", limit: "2", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/classic/items?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const item of page.data) { console.log(item.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "type": "dagger", "rogue": "true", "quality": "rare,epic", "max_level": "30", "sort": "-item_level", "limit": "2", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/classic/items?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for item in page["data"]: print(item["name"]) ``` #### PHP ```php 'dagger', 'rogue' => 'true', 'quality' => 'rare,epic', 'max_level' => '30', 'sort' => '-item_level', 'limit' => '2', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/items?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $item) { echo $item['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/items") uri.query = URI.encode_www_form( type: "dagger", rogue: "true", quality: "rare,epic", max_level: "30", sort: "-item_level", limit: "2", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |item| puts item["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("type", "dagger") params.Set("rogue", "true") params.Set("quality", "rare,epic") params.Set("max_level", "30") params.Set("sort", "-item_level") params.Set("limit", "2") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/items?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, item := range page.Data { fmt.Println(item["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/items?type=dagger&rogue=true&quality=rare,epic&max_level=30&sort=-item_level&limit=2")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/items?type=dagger&rogue=true&quality=rare,epic&max_level=30&sort=-item_level&limit=2"); using var doc = JsonDocument.Parse(json); foreach (var item in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(item.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/items") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("type", "dagger") .query("rogue", "true") .query("quality", "rare,epic") .query("max_level", "30") .query("sort", "-item_level") .query("limit", "2") .call()? .into_json()?; for item in page["data"].as_array().into_iter().flatten() { println!("{}", item["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "item", "id": 23168, "key": "classic:item:23168", "version": "classic", "name": "Dague focale de Dédain", "quality": "rare", "quality_name": "Rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_weapon_shortblade_07.jpg", "item_level": 35, "required_level": 30, "slot": "one_hand", "slot_name": "À une main", "type": "dagger", "type_name": "Dague", "weapon": { "damage_min": 22, "damage_max": 42, "speed": 1.4, "dps": 22.9 }, "sell_price": 2665, "rogue": true, "internal": false, "tooltip": [ "Dague focale de Dédain", "Niveau d'objet 35", "Lié quand ramassé", "À une main", "Dague", "Dégâts : 22 - 42", "Vitesse 1.40", "(22.9 dégâts par seconde)", "Durabilité 65 / 65", "Niveau 30 requis", "Équipé : Augmente les dégâts et les soins produits par les sorts et effets magiques de 9 au maximum." ], "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:23168", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/23168" }, { "object": "item", "id": 6691, "key": "classic:item:6691", "version": "classic", "name": "Surin de brochepourceau", "quality": "rare", "quality_name": "Rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bone_06.jpg", "item_level": 35, "required_level": 30, "slot": "one_hand", "slot_name": "À une main", "type": "dagger", "type_name": "Dague", "weapon": { "damage_min": 24, "damage_max": 45, "speed": 1.5, "dps": 23 }, "sell_price": 8866, "rogue": true, "internal": false, "tooltip": [ "Surin de brochepourceau", "Niveau d'objet 35", "Lié quand ramassé", "Unique", "À une main", "Dague", "Dégâts : 24 - 45", "Vitesse 1.50", "(23.0 dégâts par seconde)", "+6 Endurance", "+4 Esprit", "Durabilité 65 / 65", "Niveau 30 requis" ], "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:6691", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/6691" } ], "has_more": true, "next_cursor": "eyJrIjpbLTM1LCJzdXJpbiBkZSBicm9jaGVwb3VyY2VhdSIsImNsYXNzaWM6aXRlbTo2NjkxIl0sImgiOiJqY1BDbFRNSFQyIn0", "url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items?max_level=30&quality=rare%2Cepic&rogue=true&sort=-item_level&type=dagger" } ``` ## Ressources - [Objets](https://docs.wowdb.assemblee-defias.fr/items) : Tout le catalogue, avec dégâts, prix, sources et filtre voleur. - [PNJ](https://docs.wowdb.assemblee-defias.fr/npcs) : Boss, rencontres, butin, ventes, quêtes et emplacements. - [Quêtes](https://docs.wowdb.assemblee-defias.fr/quests) : Objectifs, récompenses, chaînes, PNJ de début et de fin. - [Objets du monde](https://docs.wowdb.assemblee-defias.fr/game-objects) : Coffres à crocheter, gisements, herbes et leurs cartes. - [Donjons et raids](https://docs.wowdb.assemblee-defias.fr/instances) : Rencontres dans l’ordre du jeu et butin par difficulté. - [Sorts](https://docs.wowdb.assemblee-defias.fr/spells) : Les sorts et talents du voleur, avec leurs rangs. - [Réputations](https://docs.wowdb.assemblee-defias.fr/factions) : Récompenses par rang, intendants, quêtes et monstres. - [Ensembles](https://docs.wowdb.assemblee-defias.fr/item-sets) : Pièces et bonus des ensembles. - [Recherche](https://docs.wowdb.assemblee-defias.fr/search) : Toute la base en une requête, par pertinence. ## Ce que vous pouvez construire - Un **bot Discord** qui répond `!objet Barbelure cruelle` avec l’icône, l’infobulle et le lien WoWDB. - Le **site de votre guilde** : butin des raids, listes de souhaits, réputations à monter. - Un **outil de comparaison** de dagues ou d’épées par dégâts par seconde (`weapon.dps`). - Une **carte des coffres à crocheter** d’une zone, avec `/game-objects/{id}/locations`. - Un **assistant IA** qui cite des fiches exactes au lieu d’inventer : [llms.txt et Markdown](https://docs.wowdb.assemblee-defias.fr/llms). ## Pour les assistants IA Chaque page de cette documentation existe en Markdown (lien « Voir en Markdown », ou ajoutez `.md` à l’adresse) et se copie d’un clic avec « Copier pour un LLM ». L’index [llms.txt](https://docs.wowdb.assemblee-defias.fr/llms.txt) liste toutes les pages, et [llms-full.txt](https://docs.wowdb.assemblee-defias.fr/llms-full.txt) les réunit en un seul fichier. La spécification complète est en [OpenAPI 3.1](https://docs.wowdb.assemblee-defias.fr/openapi). --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Authentification > Aucune clé, aucun compte : l’API de WoWDB est publique. Identifiez simplement votre application. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/authentification ## Aucune clé L’API est publique et en lecture seule : **aucune clé, aucun jeton, aucun compte**. Les données sont celles du site, visibles par tous ; il n’y a rien à protéger, donc rien à authentifier. Pas d’en-tête `Authorization` à envoyer : s’il y en a un, il est ignoré. **Aucune clé** ```bash curl https://api.wowdb.assemblee-defias.fr/v1/stats ``` ## Identifiez votre application Envoyez un en-tête `User-Agent` qui nomme votre application et donne un moyen de vous joindre (site, adresse, pseudo sur le forum). En cas de souci (boucle folle, trop de requêtes), nous pourrons vous prévenir au lieu de bloquer votre adresse. Certains pare-feu refusent aussi les requêtes sans `User-Agent` : tous les exemples de cette documentation en posent un. **User-Agent** ```bash curl https://api.wowdb.assemblee-defias.fr/v1/stats \ -H "User-Agent: bot-de-ma-guilde/2.1 (https://ma-guilde.example)" ``` ## HTTPS Utilisez toujours `https://`. Les adresses de l’API, des icônes et des cartes données dans les réponses sont absolues et en HTTPS. ## Quotas Sans clé, les quotas s’appliquent par adresse IP : 120 requêtes par minute et 3000 par heure ([limites de débit](https://docs.wowdb.assemblee-defias.fr/limites)). Un besoin plus large (import complet, outil très fréquenté) ? Mettez les réponses en cache, ou écrivez-nous sur le [forum](https://forum.assemblee-defias.fr/). --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Versions du jeu > Vanilla, The Burning Crusade et Wrath of the Lich King : la version du jeu fait partie de chaque adresse. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/versions ## Trois versions du jeu WoWDB couvre les trois versions classiques de World of Warcraft, sur leur version finale, celle des serveurs actuels. La version fait partie du chemin : `/v1/{version}/…`. | Clé | Version | Client | Sortie | Objets | Quêtes | PNJ | | --- | --- | --- | --- | --- | --- | --- | | `classic` | World of Warcraft (Vanilla) | 1.12.1 | 2004 | 15 850 | 4 243 | 9 848 | | `tbc` | The Burning Crusade | 2.4.3 | 2007 | 25 762 | 6 374 | 16 796 | | `wotlk` | Wrath of the Lich King | 3.3.5a | 2008 | 39 133 | 9 096 | 25 147 | **Requête (GET /v1/versions/{version})** #### cURL ```bash curl https://api.wowdb.assemblee-defias.fr/v1/versions/tbc ``` #### JavaScript ```js const res = await fetch("https://api.wowdb.assemblee-defias.fr/v1/versions/tbc"); if (!res.ok) throw new Error((await res.json()).error.message); const version = await res.json(); console.log(version.name); ``` #### Python ```python import json import urllib.request req = urllib.request.Request( "https://api.wowdb.assemblee-defias.fr/v1/versions/tbc", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: version = json.load(res) print(version["name"]) ``` #### PHP ```php ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/versions/tbc', false, $context); $version = json_decode($json, true); echo $version['name'], PHP_EOL; ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/versions/tbc") res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) version = JSON.parse(res.body) puts version["name"] ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" ) func main() { req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/versions/tbc", nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var version map[string]any if err := json.NewDecoder(res.Body).Decode(&version); err != nil { panic(err) } fmt.Println(version["name"]) } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/versions/tbc")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/versions/tbc"); using var doc = JsonDocument.Parse(json); Console.WriteLine(doc.RootElement.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let version: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/versions/tbc") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .call()? .into_json()?; println!("{}", version["name"].as_str().unwrap_or_default()); Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "version", "id": "tbc", "name": "TBC", "full_name": "World of Warcraft: The Burning Crusade", "patch": "2.4.3", "released": 2007, "counts": { "items": 25762, "spells": 272, "quests": 6374, "npcs": 16796, "game_objects": 818, "item_sets": 18, "factions": 58, "instances": 51 }, "rogue_counts": { "items": 6254, "quests": 1110, "game_objects": 44 }, "url": "https://wowdb.assemblee-defias.fr/?version=tbc", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/versions/tbc" } ``` ## Un identifiant, trois versions Un identifiant est le numéro du jeu : la Barbelure cruelle est `5191` en Vanilla, en TBC et en WotLK. Mais la fiche peut changer d’une version à l’autre (statistiques, qualité, butin) : la **Lame bourdonnante** (`2169`) est commune en Vanilla et rare en TBC. Demandez toujours la version de votre serveur. Chaque fiche complète a un champ `versions` : la même fiche dans chaque version où elle existe, avec son `api_url`. > **Attention** : Un numéro qui n’existe pas dans une version répond `404 resource_missing`. Une version inconnue (`/cata/items`) répond `404 version_unknown`. **Même objet, deux versions** ```bash curl https://api.wowdb.assemblee-defias.fr/v1/classic/items/2169 # "quality": "common" curl https://api.wowdb.assemblee-defias.fr/v1/tbc/items/2169 # "quality": "rare" ``` ## Lister les versions du jeu `GET /v1/versions` Les trois versions de World of Warcraft couvertes, avec le nombre de fiches de chacune. **Paramètres** - `limit` (entier, facultatif) : Nombre d’éléments par page, de 1 à 100 (20 par défaut). - `cursor` (chaîne, facultatif) : Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres. - `include_total` (booléen, facultatif) : true : ajoute total_count, le nombre total d’éléments avec ces filtres. **Renvoie** : Une liste (`object: "list"`) d’objets `version`, paginée par curseur. **Requête (GET /v1/versions)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/versions \ -d limit=1 ``` #### JavaScript ```js const params = new URLSearchParams({ limit: "1", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/versions?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const version of page.data) { console.log(version.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "limit": "1", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/versions?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for version in page["data"]: print(version["name"]) ``` #### PHP ```php '1', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/versions?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $version) { echo $version['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/versions") uri.query = URI.encode_www_form( limit: "1", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |version| puts version["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("limit", "1") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/versions?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, version := range page.Data { fmt.Println(version["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/versions?limit=1")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/versions?limit=1"); using var doc = JsonDocument.Parse(json); foreach (var version in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(version.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/versions") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("limit", "1") .call()? .into_json()?; for version in page["data"].as_array().into_iter().flatten() { println!("{}", version["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "version", "id": "classic", "name": "Vanilla", "full_name": "World of Warcraft", "patch": "1.12.1", "released": 2004, "counts": { "items": 15850, "spells": 265, "quests": 4243, "npcs": 9848, "game_objects": 591, "item_sets": 0, "factions": 37, "instances": 26 }, "rogue_counts": { "items": 3619, "quests": 614, "game_objects": 32 }, "url": "https://wowdb.assemblee-defias.fr/?version=classic", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/versions/classic" } ], "has_more": true, "next_cursor": "eyJvIjoxLCJoIjoiaHE3T0kwTmVRRiJ9", "url": "https://api.wowdb.assemblee-defias.fr/v1/versions" } ``` ## Obtenir une version `GET /v1/versions/{version}` Une version du jeu et ses effectifs. **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. **Renvoie** : L’objet `version`. **Requête (GET /v1/versions/{version})** #### cURL ```bash curl https://api.wowdb.assemblee-defias.fr/v1/versions/tbc ``` #### JavaScript ```js const res = await fetch("https://api.wowdb.assemblee-defias.fr/v1/versions/tbc"); if (!res.ok) throw new Error((await res.json()).error.message); const version = await res.json(); console.log(version.name); ``` #### Python ```python import json import urllib.request req = urllib.request.Request( "https://api.wowdb.assemblee-defias.fr/v1/versions/tbc", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: version = json.load(res) print(version["name"]) ``` #### PHP ```php ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/versions/tbc', false, $context); $version = json_decode($json, true); echo $version['name'], PHP_EOL; ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/versions/tbc") res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) version = JSON.parse(res.body) puts version["name"] ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" ) func main() { req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/versions/tbc", nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var version map[string]any if err := json.NewDecoder(res.Body).Decode(&version); err != nil { panic(err) } fmt.Println(version["name"]) } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/versions/tbc")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/versions/tbc"); using var doc = JsonDocument.Parse(json); Console.WriteLine(doc.RootElement.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let version: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/versions/tbc") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .call()? .into_json()?; println!("{}", version["name"].as_str().unwrap_or_default()); Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "version", "id": "tbc", "name": "TBC", "full_name": "World of Warcraft: The Burning Crusade", "patch": "2.4.3", "released": 2007, "counts": { "items": 25762, "spells": 272, "quests": 6374, "npcs": 16796, "game_objects": 818, "item_sets": 18, "factions": 58, "instances": 51 }, "rogue_counts": { "items": 6254, "quests": 1110, "game_objects": 44 }, "url": "https://wowdb.assemblee-defias.fr/?version=tbc", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/versions/tbc" } ``` --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Pagination > Listes paginées par curseur, comme Stripe : has_more, next_cursor, sans doublon ni trou. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/pagination ## Principe Toutes les listes ont la même enveloppe : - `object` (chaîne) : Toujours « list ». Valeurs : `list`. - `data` (tableau d’objets) : Les éléments de cette page (objets du type de la liste). - `has_more` (booléen) : Vrai s’il reste des éléments après cette page. - `next_cursor` (chaîne ou null) : Curseur de la page suivante, à passer tel quel dans cursor ; null en fin de liste. - `url` (chaîne) : Adresse de la liste dans l’API, filtres compris (sans cursor ni limit). - `total_count` (entier, facultatif) : Nombre total d’éléments avec ces filtres ; seulement avec include_total=true. `limit` règle la taille de la page, de 1 à 100 (20 par défaut). Tant que `has_more` vaut `true`, repassez la valeur de `next_cursor` dans le paramètre `cursor`, **avec les mêmes filtres et le même tri**. La dernière page a `has_more: false` et `next_cursor: null`. La pagination suit la clé de tri (« keyset ») : chaque page reprend juste après le dernier élément de la précédente. Pas de doublon, pas de trou, et la centième page est aussi rapide que la première. **Requête (Première page)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/classic/items \ -d type=dagger \ -d rogue=true \ -d quality=rare,epic \ -d max_level=30 \ -d sort=-item_level \ -d limit=2 ``` #### JavaScript ```js const params = new URLSearchParams({ type: "dagger", rogue: "true", quality: "rare,epic", max_level: "30", sort: "-item_level", limit: "2", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/classic/items?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const item of page.data) { console.log(item.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "type": "dagger", "rogue": "true", "quality": "rare,epic", "max_level": "30", "sort": "-item_level", "limit": "2", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/classic/items?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for item in page["data"]: print(item["name"]) ``` #### PHP ```php 'dagger', 'rogue' => 'true', 'quality' => 'rare,epic', 'max_level' => '30', 'sort' => '-item_level', 'limit' => '2', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/items?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $item) { echo $item['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/items") uri.query = URI.encode_www_form( type: "dagger", rogue: "true", quality: "rare,epic", max_level: "30", sort: "-item_level", limit: "2", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |item| puts item["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("type", "dagger") params.Set("rogue", "true") params.Set("quality", "rare,epic") params.Set("max_level", "30") params.Set("sort", "-item_level") params.Set("limit", "2") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/items?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, item := range page.Data { fmt.Println(item["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/items?type=dagger&rogue=true&quality=rare,epic&max_level=30&sort=-item_level&limit=2")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/items?type=dagger&rogue=true&quality=rare,epic&max_level=30&sort=-item_level&limit=2"); using var doc = JsonDocument.Parse(json); foreach (var item in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(item.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/items") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("type", "dagger") .query("rogue", "true") .query("quality", "rare,epic") .query("max_level", "30") .query("sort", "-item_level") .query("limit", "2") .call()? .into_json()?; for item in page["data"].as_array().into_iter().flatten() { println!("{}", item["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "item", "id": 23168, "key": "classic:item:23168", "version": "classic", "name": "Dague focale de Dédain", "quality": "rare", "quality_name": "Rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_weapon_shortblade_07.jpg", "item_level": 35, "required_level": 30, "slot": "one_hand", "slot_name": "À une main", "type": "dagger", "type_name": "Dague", "weapon": { "damage_min": 22, "damage_max": 42, "speed": 1.4, "dps": 22.9 }, "sell_price": 2665, "rogue": true, "internal": false, "tooltip": [ "Dague focale de Dédain", "Niveau d'objet 35", "Lié quand ramassé", "À une main", "Dague", "Dégâts : 22 - 42", "Vitesse 1.40", "(22.9 dégâts par seconde)", "Durabilité 65 / 65", "Niveau 30 requis", "Équipé : Augmente les dégâts et les soins produits par les sorts et effets magiques de 9 au maximum." ], "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:23168", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/23168" }, { "object": "item", "id": 6691, "key": "classic:item:6691", "version": "classic", "name": "Surin de brochepourceau", "quality": "rare", "quality_name": "Rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bone_06.jpg", "item_level": 35, "required_level": 30, "slot": "one_hand", "slot_name": "À une main", "type": "dagger", "type_name": "Dague", "weapon": { "damage_min": 24, "damage_max": 45, "speed": 1.5, "dps": 23 }, "sell_price": 8866, "rogue": true, "internal": false, "tooltip": [ "Surin de brochepourceau", "Niveau d'objet 35", "Lié quand ramassé", "Unique", "À une main", "Dague", "Dégâts : 24 - 45", "Vitesse 1.50", "(23.0 dégâts par seconde)", "+6 Endurance", "+4 Esprit", "Durabilité 65 / 65", "Niveau 30 requis" ], "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:6691", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/6691" } ], "has_more": true, "next_cursor": "eyJrIjpbLTM1LCJzdXJpbiBkZSBicm9jaGVwb3VyY2VhdSIsImNsYXNzaWM6aXRlbTo2NjkxIl0sImgiOiJqY1BDbFRNSFQyIn0", "url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items?max_level=30&quality=rare%2Cepic&rogue=true&sort=-item_level&type=dagger" } ``` ## Parcourir toute une liste Une boucle suffit : demandez des pages de 100 tant qu’il y a un curseur. Les [bibliothèques clientes](https://docs.wowdb.assemblee-defias.fr/bibliotheques) le font pour vous (`iterate`, `paginate`). > **Bon à savoir** : Pour parcourir tout le catalogue d’une version (39 133 objets en WotLK), comptez quelques centaines de requêtes : gardez le résultat en cache plutôt que de recommencer ([limites de débit](https://docs.wowdb.assemblee-defias.fr/limites)). **Toutes les pages** #### cURL ```bash # Page suivante : reprenez next_cursor de la page précédente. curl -G https://api.wowdb.assemblee-defias.fr/v1/classic/items \ -d rogue=true -d type=dagger -d limit=100 curl -G https://api.wowdb.assemblee-defias.fr/v1/classic/items \ -d rogue=true -d type=dagger -d limit=100 \ -d cursor=CURSEUR_DE_LA_PAGE_PRECEDENTE ``` #### JavaScript ```js // Toutes les dagues utiles au voleur en Vanilla, page après page. async function* tous(chemin, filtres) { let cursor; do { const params = new URLSearchParams({ ...filtres, limit: "100", ...(cursor && { cursor }) }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1${chemin}?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); yield* page.data; cursor = page.next_cursor; } while (cursor); } for await (const item of tous("/classic/items", { rogue: "true", type: "dagger" })) { console.log(item.name); } ``` #### Python ```python import json import urllib.parse import urllib.request def tous(chemin, **filtres): """Tous les éléments d'une liste, page après page.""" cursor = None while True: params = {**filtres, "limit": 100, **({"cursor": cursor} if cursor else {})} url = "https://api.wowdb.assemblee-defias.fr/v1" + chemin + "?" + urllib.parse.urlencode(params) req = urllib.request.Request(url, headers={"User-Agent": "mon-application/1.0"}) with urllib.request.urlopen(req) as res: page = json.load(res) yield from page["data"] cursor = page["next_cursor"] if not cursor: return for item in tous("/classic/items", rogue="true", type="dagger"): print(item["name"]) ``` #### PHP ```php 100] + ($cursor ? ['cursor' => $cursor] : []); $context = stream_context_create(['http' => ['header' => "User-Agent: mon-application/1.0\r\n"]]); $page = json_decode(file_get_contents('https://api.wowdb.assemblee-defias.fr/v1' . $chemin . '?' . http_build_query($params), false, $context), true); yield from $page['data']; $cursor = $page['next_cursor']; } while ($cursor); } foreach (tous('/classic/items', ['rogue' => 'true', 'type' => 'dagger']) as $item) { echo $item['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" def tous(chemin, filtres) return enum_for(:tous, chemin, filtres) unless block_given? cursor = nil loop do uri = URI("https://api.wowdb.assemblee-defias.fr/v1#{chemin}") uri.query = URI.encode_www_form(filtres.merge(limit: 100).merge(cursor ? { cursor: cursor } : {})) page = JSON.parse(Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0" }).body) page["data"].each { |element| yield element } cursor = page["next_cursor"] break unless cursor end end tous("/classic/items", rogue: true, type: "dagger") { |item| puts item["name"] } ``` #### Go ```go // Toutes les pages d'une liste ; f est appelée pour chaque élément. func tous(chemin string, filtres url.Values, f func(map[string]any)) error { cursor := "" for { params := url.Values{} for k, v := range filtres { params[k] = v } params.Set("limit", "100") if cursor != "" { params.Set("cursor", cursor) } req, _ := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1"+chemin+"?"+params.Encode(), nil) req.Header.Set("User-Agent", "mon-application/1.0") res, err := http.DefaultClient.Do(req) if err != nil { return err } var page struct { Data []map[string]any `json:"data"` NextCursor *string `json:"next_cursor"` } err = json.NewDecoder(res.Body).Decode(&page) res.Body.Close() if err != nil { return err } for _, element := range page.Data { f(element) } if page.NextCursor == nil { return nil } cursor = *page.NextCursor } } ``` #### Java ```java // Avec le client sans dépendance WowDb.java (bibliothèques clientes). WowDb wowdb = new WowDb("mon-application/1.0"); for (Map item : wowdb.iterate("/classic/items", Map.of("rogue", "true", "type", "dagger"))) { System.out.println(item.get("name")); } ``` #### .NET ```csharp // Avec le client sans dépendance WowDb.cs (bibliothèques clientes). var wowdb = new WowDb.Client("mon-application/1.0"); await foreach (var item in wowdb.IterateAsync("/classic/items", new() { ["rogue"] = "true", ["type"] = "dagger" })) Console.WriteLine(item.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let mut cursor: Option = None; loop { let mut req = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/items") .set("User-Agent", "mon-application/1.0") .query("rogue", "true") .query("type", "dagger") .query("limit", "100"); if let Some(c) = &cursor { req = req.query("cursor", c); } let page: serde_json::Value = req.call()?.into_json()?; for item in page["data"].as_array().into_iter().flatten() { println!("{}", item["name"].as_str().unwrap_or_default()); } match page["next_cursor"].as_str() { Some(c) => cursor = Some(c.to_string()), None => break, } } Ok(()) } ``` ## Nombre total Par défaut, une liste ne compte pas ses éléments (c’est plus rapide). Ajoutez `include_total=true` pour recevoir `total_count`, le nombre total d’éléments avec ces filtres. **include_total** ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/classic/items \ -d rogue=true -d include_total=true -d limit=1 ``` ## En-tête Link Quand il y a une page suivante, la réponse porte aussi un en-tête `Link` (RFC 8288) avec son adresse complète, `rel="next"` : pratique pour les outils qui savent le suivre. **En-tête de réponse** ```http Link: ; rel="next" ``` ## Curseur invalide Un curseur est opaque : ne le fabriquez pas, ne le modifiez pas. Il est lié à la requête qui l’a produit ; réutilisé avec d’autres filtres ou un autre tri, il est refusé avec `400 cursor_invalid`, au lieu de donner une page incohérente. `limit` peut, lui, changer d’une page à l’autre. ## Listes incluses dans une fiche Certaines fiches contiennent une liste longue : le butin et les ventes d’un PNJ. La fiche en donne les 10 premiers éléments dans la même enveloppe `list`, avec `has_more` et l’`url` de la liste complète (`/npcs/{id}/loot`), qui se pagine de la même façon. --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Filtres et filtre voleur > Filtrer les listes par qualité, emplacement, type, niveau, camp… et garder ce qui sert au voleur avec rogue=true. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/filtres ## Syntaxe - Les filtres sont des paramètres de requête, tous facultatifs et combinables (ET logique). - Plusieurs valeurs d’un même filtre se séparent par des virgules (OU logique) : `quality=rare,epic`. - Les booléens valent `true` ou `false`. - Les niveaux sont des entiers : `min_level=60&max_level=70`. - `q` filtre sur le nom : chaque mot doit commencer un mot du nom, sans souci des accents ni des majuscules (`q=lame om` trouve « Lame de l’ombre »). - Un paramètre inconnu ou une valeur inconnue répondent `400` avec la liste des valeurs possibles : une faute de frappe ne passe jamais inaperçue. **Requête (Coffres à crocheter)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects \ -d type=locked_chest \ -d skill=lockpicking \ -d min_skill=300 \ -d sort=-skill \ -d limit=2 ``` #### JavaScript ```js const params = new URLSearchParams({ type: "locked_chest", skill: "lockpicking", min_skill: "300", sort: "-skill", limit: "2", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const gameObject of page.data) { console.log(gameObject.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "type": "locked_chest", "skill": "lockpicking", "min_skill": "300", "sort": "-skill", "limit": "2", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for game_object in page["data"]: print(game_object["name"]) ``` #### PHP ```php 'locked_chest', 'skill' => 'lockpicking', 'min_skill' => '300', 'sort' => '-skill', 'limit' => '2', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $gameObject) { echo $gameObject['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects") uri.query = URI.encode_www_form( type: "locked_chest", skill: "lockpicking", min_skill: "300", sort: "-skill", limit: "2", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |game_object| puts game_object["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("type", "locked_chest") params.Set("skill", "lockpicking") params.Set("min_skill", "300") params.Set("sort", "-skill") params.Set("limit", "2") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, gameObject := range page.Data { fmt.Println(gameObject["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects?type=locked_chest&skill=lockpicking&min_skill=300&sort=-skill&limit=2")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects?type=locked_chest&skill=lockpicking&min_skill=300&sort=-skill&limit=2"); using var doc = JsonDocument.Parse(json); foreach (var gameObject in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(gameObject.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("type", "locked_chest") .query("skill", "lockpicking") .query("min_skill", "300") .query("sort", "-skill") .query("limit", "2") .call()? .into_json()?; for game_object in page["data"].as_array().into_iter().flatten() { println!("{}", game_object["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "game_object", "id": 184304, "key": "tbc:object:184304", "version": "tbc", "name": "Coffre verrouillé", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_box_04.jpg", "type": "locked_chest", "type_name": "Coffre verrouillé", "skill": { "skill": "lockpicking", "name": "Crochetage", "level": 5000 }, "zone": "Contreforts de Hautebrande d'antan", "positions": 1, "rogue": true, "internal": false, "url": "https://wowdb.assemblee-defias.fr/?id=tbc:object:184304", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/184304" }, { "object": "game_object", "id": 186648, "key": "tbc:object:186648", "version": "tbc", "name": "Malle d'Hazlek", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_box_04.jpg", "type": "locked_chest", "type_name": "Coffre verrouillé", "skill": { "skill": "lockpicking", "name": "Crochetage", "level": 5000 }, "zone": "Zul'Aman", "positions": 1, "rogue": true, "internal": false, "url": "https://wowdb.assemblee-defias.fr/?id=tbc:object:186648", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/186648" } ], "has_more": true, "next_cursor": "eyJrIjpbLTUwMDAsIm1hbGxlIGQnaGF6bGVrIiwidGJjOm9iamVjdDoxODY2NDgiXSwiaCI6IkpmU1R3c3FMNE8ifQ", "url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects?min_skill=300&skill=lockpicking&sort=-skill&type=locked_chest" } ``` ## Le filtre voleur WoWDB contient **tout** le jeu ; le filtre voleur est une option, jamais le comportement par défaut. Avec `rogue=true`, une liste ne garde que ce qui sert à un voleur ; `rogue=false` garde le reste ; sans le paramètre, tout est listé. | Ressource | rogue=true garde | | --- | --- | | Objets | Armes et armures qu’un voleur porte dans cette version (dagues, épées, masses et armes de pugilat à une main, haches à une main en WotLK, armes à distance, cuir), capes, bijoux, anneaux, colliers, munitions ; objets réservés au voleur ; glyphes ; fournitures (poisons, crochets, poudres, coffrets) ; objets cités par un guide. | | Quêtes | Quêtes de classe du voleur, et quêtes dont une récompense ou un objectif sert au voleur. | | Objets du monde | Ceux qui demandent du Crochetage. | | Donjons | Ceux dont le butin contient au moins un objet utile au voleur. | | Recherche | Les objets, quêtes et objets du monde utiles au voleur ; les autres types restent dans les résultats. | Chaque objet, quête et objet du monde a aussi un champ booléen `rogue` : vous pouvez filtrer de votre côté. **Requête (Dagues utiles au voleur)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/classic/items \ -d type=dagger \ -d rogue=true \ -d quality=rare,epic \ -d max_level=30 \ -d sort=-item_level \ -d limit=2 ``` #### JavaScript ```js const params = new URLSearchParams({ type: "dagger", rogue: "true", quality: "rare,epic", max_level: "30", sort: "-item_level", limit: "2", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/classic/items?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const item of page.data) { console.log(item.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "type": "dagger", "rogue": "true", "quality": "rare,epic", "max_level": "30", "sort": "-item_level", "limit": "2", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/classic/items?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for item in page["data"]: print(item["name"]) ``` #### PHP ```php 'dagger', 'rogue' => 'true', 'quality' => 'rare,epic', 'max_level' => '30', 'sort' => '-item_level', 'limit' => '2', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/items?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $item) { echo $item['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/items") uri.query = URI.encode_www_form( type: "dagger", rogue: "true", quality: "rare,epic", max_level: "30", sort: "-item_level", limit: "2", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |item| puts item["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("type", "dagger") params.Set("rogue", "true") params.Set("quality", "rare,epic") params.Set("max_level", "30") params.Set("sort", "-item_level") params.Set("limit", "2") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/items?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, item := range page.Data { fmt.Println(item["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/items?type=dagger&rogue=true&quality=rare,epic&max_level=30&sort=-item_level&limit=2")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/items?type=dagger&rogue=true&quality=rare,epic&max_level=30&sort=-item_level&limit=2"); using var doc = JsonDocument.Parse(json); foreach (var item in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(item.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/items") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("type", "dagger") .query("rogue", "true") .query("quality", "rare,epic") .query("max_level", "30") .query("sort", "-item_level") .query("limit", "2") .call()? .into_json()?; for item in page["data"].as_array().into_iter().flatten() { println!("{}", item["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "item", "id": 23168, "key": "classic:item:23168", "version": "classic", "name": "Dague focale de Dédain", "quality": "rare", "quality_name": "Rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_weapon_shortblade_07.jpg", "item_level": 35, "required_level": 30, "slot": "one_hand", "slot_name": "À une main", "type": "dagger", "type_name": "Dague", "weapon": { "damage_min": 22, "damage_max": 42, "speed": 1.4, "dps": 22.9 }, "sell_price": 2665, "rogue": true, "internal": false, "tooltip": [ "Dague focale de Dédain", "Niveau d'objet 35", "Lié quand ramassé", "À une main", "Dague", "Dégâts : 22 - 42", "Vitesse 1.40", "(22.9 dégâts par seconde)", "Durabilité 65 / 65", "Niveau 30 requis", "Équipé : Augmente les dégâts et les soins produits par les sorts et effets magiques de 9 au maximum." ], "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:23168", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/23168" }, { "object": "item", "id": 6691, "key": "classic:item:6691", "version": "classic", "name": "Surin de brochepourceau", "quality": "rare", "quality_name": "Rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bone_06.jpg", "item_level": 35, "required_level": 30, "slot": "one_hand", "slot_name": "À une main", "type": "dagger", "type_name": "Dague", "weapon": { "damage_min": 24, "damage_max": 45, "speed": 1.5, "dps": 23 }, "sell_price": 8866, "rogue": true, "internal": false, "tooltip": [ "Surin de brochepourceau", "Niveau d'objet 35", "Lié quand ramassé", "Unique", "À une main", "Dague", "Dégâts : 24 - 45", "Vitesse 1.50", "(23.0 dégâts par seconde)", "+6 Endurance", "+4 Esprit", "Durabilité 65 / 65", "Niveau 30 requis" ], "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:6691", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/6691" } ], "has_more": true, "next_cursor": "eyJrIjpbLTM1LCJzdXJpbiBkZSBicm9jaGVwb3VyY2VhdSIsImNsYXNzaWM6aXRlbTo2NjkxIl0sImgiOiJqY1BDbFRNSFQyIn0", "url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items?max_level=30&quality=rare%2Cepic&rogue=true&sort=-item_level&type=dagger" } ``` ## Tri Le paramètre `sort` choisit l’ordre : `name` par défaut, et selon la ressource `item_level`, `required_level`, `quality`, `level`, `xp`, `skill`. Un `-` devant inverse l’ordre : `sort=-item_level` donne le niveau d’objet le plus haut d’abord. Les valeurs vides vont toujours en fin de liste, et le nom départage les égalités. ## Codes des filtres Les filtres et les champs utilisent des codes anglais stables ; chaque champ code a son jumeau `*_name` avec le libellé français du jeu (`quality: "epic"`, `quality_name: "Épique"`). **Qualités (quality)** | Code | Libellé | | --- | --- | | `poor` | Médiocre | | `common` | Commun | | `uncommon` | Inhabituel | | `rare` | Rare | | `epic` | Épique | | `legendary` | Légendaire | | `artifact` | Artefact | | `heirloom` | Héritage | **Emplacements (slot)** | Code | Libellé | | --- | --- | | `one_hand` | À une main | | `two_hand` | À deux mains | | `main_hand` | Main droite | | `off_hand` | Main gauche | | `held_in_off_hand` | Tenu(e) en main gauche | | `ranged` | À distance | | `thrown` | Armes de jet | | `projectile` | Projectile | | `relic` | Relique | | `head` | Tête | | `neck` | Cou | | `shoulder` | Épaules | | `back` | Dos | | `chest` | Torse | | `shirt` | Chemise | | `tabard` | Tabard | | `wrist` | Poignets | | `hands` | Mains | | `waist` | Taille | | `legs` | Jambes | | `feet` | Pieds | | `finger` | Doigt | | `trinket` | Bijou | | `bag` | Sac | **Types d’objet (type des objets)** | Code | Libellé | | --- | --- | | `dagger` | Dague | | `sword` | Épée | | `mace` | Masse | | `axe` | Hache | | `fist_weapon` | Arme de pugilat | | `polearm` | Arme d’hast | | `staff` | Bâton | | `bow` | Arc | | `crossbow` | Arbalète | | `gun` | Arme à feu | | `thrown` | Arme de jet | | `wand` | Baguette | | `fishing_pole` | Canne à pêche | | `misc_weapon` | Arme diverse | | `cloth` | Tissu | | `leather` | Cuir | | `mail` | Mailles | | `plate` | Plaques | | `shield` | Bouclier | | `libram` | Libram | | `idol` | Idole | | `totem` | Totem | | `sigil` | Cachet | | `misc_armor` | Armure diverse (bijoux, chemises…) | | `consumable` | Consommable | | `container` | Conteneur | | `gem` | Gemme | | `glyph` | Glyphe | | `recipe` | Recette | | `trade_goods` | Artisanat | | `reagent` | Composant | | `projectile` | Projectile | | `quiver` | Carquois | | `quest` | Objet de quête | | `key` | Clé | | `misc` | Divers | **Types de créature (type des PNJ)** | Code | Libellé | | --- | --- | | `humanoid` | Humanoïde | | `beast` | Bête | | `demon` | Démon | | `dragonkin` | Draconien | | `elemental` | Élémentaire | | `giant` | Géant | | `undead` | Mort-vivant | | `mechanical` | Mécanique | | `critter` | Bestiole | | `totem` | Totem | | `non_combat_pet` | Familier pacifique | | `gas_cloud` | Nuage de gaz | | `not_specified` | Non spécifié | | `none` | Aucun | **Rangs des PNJ (rank)** | Code | Libellé | | --- | --- | | `normal` | Normal | | `elite` | Élite | | `rare_elite` | Élite rare | | `boss` | Boss | | `rare` | Rare | **Familles (family)** | Code | Libellé | | --- | --- | | `wolf` | Loup | | `cat` | Félin | | `spider` | Araignée | | `bear` | Ours | | `boar` | Sanglier | | `crocolisk` | Crocilisque | | `carrion_bird` | Charognard | | `crab` | Crabe | | `gorilla` | Gorille | | `raptor` | Raptor | | `tallstrider` | Haut-trotteur | | `felhunter` | Chasseur corrompu | | `voidwalker` | Marcheur du Vide | | `succubus` | Succube | | `doomguard` | Garde funeste | | `scorpid` | Scorpide | | `turtle` | Tortue | | `imp` | Diablotin | | `bat` | Chauve-souris | | `hyena` | Hyène | | `bird_of_prey` | Oiseau de proie | | `wind_serpent` | Serpent des vents | | `felguard` | Gangregarde | | `dragonhawk` | Faucon-dragon | | `ravager` | Ravageur | | `warp_stalker` | Traqueur dimensionnel | | `sporebat` | Sporoptère | | `nether_ray` | Raie du Néant | | `serpent` | Serpent | | `moth` | Phalène | | `chimaera` | Chimère | | `devilsaur` | Diablosaure | | `ghoul` | Goule | | `silithid` | Silithide | | `worm` | Ver | | `rhino` | Rhinocéros | | `wasp` | Guêpe | | `core_hound` | Chien du Magma | | `spirit_beast` | Esprit de bête | **Types d’objet du monde** | Code | Libellé | | --- | --- | | `chest` | Coffre | | `locked_chest` | Coffre verrouillé | | `quest_object` | Objet de quête | | `ore` | Gisement de minerai | | `herb` | Herbe | **Compétences (skill)** | Code | Libellé | | --- | --- | | `lockpicking` | Crochetage | | `mining` | Minage | | `herbalism` | Herboristerie | **Types de quête (type des quêtes)** | Code | Libellé | | --- | --- | | `group` | Groupe | | `elite` | Élite | | `dungeon` | Donjon | | `raid` | Raid | | `heroic` | Héroïque | | `pvp` | JcJ | | `escort` | Escorte | | `legendary` | Légendaire | | `world_event` | Événement mondial | | `life` | Vie | | `other` | Autre | | `daily` | Journalière | | `weekly` | Hebdomadaire | | `repeatable` | Répétable | **Camps (side)** | Code | Libellé | | --- | --- | | `alliance` | Alliance | | `horde` | Horde | | `both` | Alliance et Horde | **Types de donjon** | Code | Libellé | | --- | --- | | `dungeon` | Donjon | | `raid` | Raid | **Difficultés (difficulty)** | Code | Libellé | | --- | --- | | `normal` | Normal | | `heroic` | Héroïque | | `10_player` | 10 joueurs | | `25_player` | 25 joueurs | | `10_player_heroic` | 10 joueurs héroïque | | `25_player_heroic` | 25 joueurs héroïque | **Rangs de réputation** | Code | Libellé | | --- | --- | | `hated` | Détesté | | `hostile` | Hostile | | `unfriendly` | Inamical | | `neutral` | Neutre | | `friendly` | Amical | | `honored` | Honoré | | `revered` | Révéré | | `exalted` | Exalté | --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Erreurs > Statuts HTTP et objet error homogène : type, code, message en français, param et doc_url. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/erreurs ## Statuts HTTP | Statut | Signification | | --- | --- | | `200 OK` | Réussite. | | `304 Not Modified` | Rien n’a changé depuis l’ETag envoyé dans `If-None-Match` ([cache](https://docs.wowdb.assemblee-defias.fr/cache)). | | `400 Bad Request` | Requête à corriger : paramètre inconnu, valeur invalide, curseur invalide. | | `404 Not Found` | Fiche, version du jeu ou route introuvable. | | `405 Method Not Allowed` | Méthode autre que `GET`, `HEAD` ou `OPTIONS` : l’API est en lecture seule. | | `429 Too Many Requests` | Trop de requêtes : attendez `Retry-After` secondes ([limites](https://docs.wowdb.assemblee-defias.fr/limites)). | | `500 Internal Server Error` | Erreur de WoWDB, rare : réessayez plus tard, et signalez-la avec `X-Request-Id` si elle persiste. | **Requête (Exemple : 404)** #### cURL ```bash curl https://api.wowdb.assemblee-defias.fr/v1/classic/items/999999 ``` **Réponse** (statut 404) ```json { "error": { "type": "invalid_request_error", "code": "resource_missing", "message": "Aucun objet n° 999999 dans la version classic. Vérifiez la version : un même numéro n'existe pas forcément dans les trois.", "param": null, "doc_url": "https://docs.wowdb.assemblee-defias.fr/erreurs#resource_missing" } } ``` ## L’objet error Toute réponse en erreur a le même corps JSON : - `error` (objet) : L’erreur. - `type` (chaîne) : Famille : invalid_request_error (requête à corriger), rate_limit_error (trop de requêtes), api_error (erreur de WoWDB). - `code` (chaîne) : Code précis et stable, à tester dans votre code (parameter_invalid, resource_missing…). - `message` (chaîne) : Explication en français, lisible par un humain. - `param` (chaîne ou null) : Paramètre en cause, s’il y en a un. - `doc_url` (chaîne) : Section de la documentation qui explique cette erreur. Testez `error.code` dans votre code : il est stable. `message` est en français et peut évoluer. **Gérer une erreur** #### cURL ```bash # -i affiche le statut et les en-têtes ; le corps reste du JSON. curl -i "https://api.wowdb.assemblee-defias.fr/v1/classic/items?quality=mythic" ``` #### JavaScript ```js const res = await fetch("https://api.wowdb.assemblee-defias.fr/v1/classic/items?quality=mythic"); if (!res.ok) { const { error } = await res.json(); // error.type, error.code, error.message, error.param, error.doc_url if (error.code === "parameter_invalid") console.error(`${error.param} : ${error.message}`); if (res.status === 429) await new Promise(r => setTimeout(r, Number(res.headers.get("Retry-After")) * 1000)); } ``` #### Python ```python import json import urllib.error import urllib.request try: urllib.request.urlopen("https://api.wowdb.assemblee-defias.fr/v1/classic/items?quality=mythic") except urllib.error.HTTPError as e: error = json.load(e)["error"] print(e.code, error["code"], error["param"], error["message"]) # 400 parameter_invalid quality Valeur inconnue pour quality : « mythic »… ``` ## Codes d’erreur ### parameter_invalid `400` : valeur invalide (`limit=500`, `quality=mythic`, `rogue=oui`, identifiant non numérique) ou paramètre répété. `param` nomme le paramètre, `message` donne les valeurs permises. ### parameter_unknown `400` : paramètre inconnu de cette route (`qualite=4`). Le message liste les paramètres acceptés. ### parameter_missing `400` : paramètre obligatoire absent (`q` de la recherche). ### cursor_invalid `400` : curseur illisible ou venu d’une autre requête ([pagination](https://docs.wowdb.assemblee-defias.fr/pagination#curseur-invalide)). ### resource_missing `404` : aucune fiche de ce numéro dans cette version. ### version_unknown `404` : version du jeu inconnue ; versions : `classic`, `tbc`, `wotlk`. ### route_unknown `404` : aucune route à cette adresse. ### method_not_allowed `405` : méthode refusée ; l’en-tête `Allow` liste `GET, HEAD, OPTIONS`. ### rate_limited `429` : quota dépassé ; type `rate_limit_error`. ### internal_error `500` : erreur de WoWDB ; type `api_error`. **Requête (Exemple : 400)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/classic/items \ -d quality=mythic ``` **Réponse** (statut 400) ```json { "error": { "type": "invalid_request_error", "code": "parameter_invalid", "message": "Valeur inconnue pour quality : « mythic ». Valeurs possibles : poor, common, uncommon, rare, epic, legendary, artifact, heirloom.", "param": "quality", "doc_url": "https://docs.wowdb.assemblee-defias.fr/erreurs#parameter_invalid" } } ``` --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Limites de débit > 120 requêtes par minute et 3000 par heure par adresse IP, avec les en-têtes RateLimit et Retry-After. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/limites ## Quotas Chaque adresse IP peut faire **120 requêtes par minute** et **3000 par heure** (fenêtres glissantes). Toutes les requêtes comptent, y compris les réponses `304` et les erreurs. C’est large pour un bot, un site ou un outil personnel, et cela protège le petit serveur qui sert WoWDB à tout le monde. **Lire les en-têtes** #### cURL ```bash curl -s -D - -o /dev/null https://api.wowdb.assemblee-defias.fr/v1/stats | grep -i ratelimit # RateLimit-Limit: 120 # RateLimit-Remaining: 119 # RateLimit-Reset: 60 # RateLimit-Policy: 120;w=60, 3000;w=3600 ``` ## En-têtes | En-tête | Valeur | | --- | --- | | `RateLimit-Limit` | Requêtes permises dans la fenêtre qui s’applique. | | `RateLimit-Remaining` | Requêtes restantes avant le refus. | | `RateLimit-Reset` | Secondes avant qu’une place se libère. | | `RateLimit-Policy` | Les deux fenêtres : `120;w=60, 3000;w=3600`. | | `Retry-After` | Sur une réponse `429` seulement : secondes à attendre. | Ces en-têtes sont exposés au JavaScript des navigateurs (CORS). ## En cas de dépassement La réponse est `429 Too Many Requests`, avec `Retry-After` et une erreur `rate_limit_error` / `rate_limited`. Attendez le délai indiqué avant de réessayer ; inutile d’insister avant, chaque requête refusée compte aussi. **Réessayer après Retry-After** #### JavaScript ```js // Réessaie après le délai de Retry-After, au plus trois fois. async function getAvecPatience(url, essais = 3) { for (let i = 0; ; i++) { const res = await fetch(url); if (res.status !== 429 || i >= essais) return res; const attente = Number(res.headers.get("Retry-After") || 1); await new Promise(r => setTimeout(r, attente * 1000)); } } ``` #### Python ```python import time import urllib.error import urllib.request def get_avec_patience(url, essais=3): """Réessaie après le délai de Retry-After, au plus trois fois.""" for i in range(essais + 1): try: return urllib.request.urlopen(url) except urllib.error.HTTPError as e: if e.code != 429 or i == essais: raise time.sleep(int(e.headers.get("Retry-After", "1"))) ``` ## Bonnes pratiques - Gardez les réponses en cache : les données ne changent qu’aux mises à jour de WoWDB ([cache et ETag](https://docs.wowdb.assemblee-defias.fr/cache)). - Utilisez `limit=100` pour parcourir une liste : 50 fois moins de requêtes qu’avec des pages de 2. - Préférez une recherche ou un filtre à des centaines de fiches lues une à une. - Pour un très gros besoin, écrivez-nous sur le [forum](https://forum.assemblee-defias.fr/) avant de lancer l’import. --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Cache et ETag > Cache-Control, ETag et 304 Not Modified : économisez vos requêtes et vos quotas. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/cache ## Cache-Control Les réponses réussies portent `Cache-Control: public, max-age=600, stale-while-revalidate=86400` : gardez-les 10 minutes sans redemander, puis revalidez. Les données ne changent qu’aux mises à jour de WoWDB ; la date des données est dans `data_updated` (racine de l’API) et `updated_at` (`/stats`). Les erreurs ne se gardent pas (`no-store`), sauf les `404`, une minute. ## ETag et If-None-Match Chaque réponse `200` a un `ETag`, l’empreinte de son contenu. Renvoyez-le dans `If-None-Match` : si rien n’a changé, la réponse est `304 Not Modified`, sans corps. C’est plus rapide, plus léger, et votre copie locale reste valable. `If-None-Match` accepte plusieurs ETag séparés par des virgules, et la forme faible `W/"…"` que posent certains intermédiaires. **Requête conditionnelle** #### cURL ```bash # Première requête : notez l'ETag. curl -si https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191 | grep -i etag # ETag: "…" # Ensuite : 304 Not Modified, sans corps, tant que la fiche n'a pas changé. curl -si https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191 \ -H 'If-None-Match: "…"' ``` #### JavaScript ```js // Cache en mémoire par ETag : une requête conditionnelle, puis la copie locale si 304. const cache = new Map(); async function getEnCache(url) { const copie = cache.get(url); const res = await fetch(url, { headers: copie ? { "If-None-Match": copie.etag } : {} }); if (res.status === 304) return copie.data; const data = await res.json(); cache.set(url, { etag: res.headers.get("ETag"), data }); return data; } ``` #### Python ```python import json import urllib.error import urllib.request cache = {} def get_en_cache(url): """Requête conditionnelle : la copie locale si la fiche n'a pas changé (304).""" copie = cache.get(url) req = urllib.request.Request(url, headers={"If-None-Match": copie[0]} if copie else {}) try: with urllib.request.urlopen(req) as res: data = json.load(res) cache[url] = (res.headers["ETag"], data) return data except urllib.error.HTTPError as e: if e.code == 304: return copie[1] raise ``` --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # CORS > L’API s’appelle directement depuis le JavaScript de n’importe quel site : Access-Control-Allow-Origin: *. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/cors ## Ouvert à tous les sites Les données sont publiques : l’API répond à toutes les origines, sans liste blanche. Une page de votre site de guilde peut appeler l’API directement depuis le navigateur du visiteur, sans serveur intermédiaire. | En-tête | Valeur | | --- | --- | | `Access-Control-Allow-Origin` | `*` | | `Access-Control-Allow-Methods` | `GET, HEAD, OPTIONS` | | `Access-Control-Allow-Headers` | `Content-Type, If-None-Match, Cache-Control` | | `Access-Control-Expose-Headers` | `ETag, Link, RateLimit-*, Retry-After, X-Request-Id` | | `Access-Control-Max-Age` | `86400` (requête préalable gardée un jour) | > **Bon à savoir** : Sans clé, il n’y a pas de cookie ni d’identifiant : n’utilisez pas `credentials: "include"`, inutile et refusé avec `*`. **Depuis une page web** #### cURL ```bash # Requête préalable (preflight) d'un navigateur : 204 et les en-têtes CORS. curl -i -X OPTIONS https://api.wowdb.assemblee-defias.fr/v1/classic/items \ -H "Origin: https://ma-guilde.example" \ -H "Access-Control-Request-Method: GET" ``` #### JavaScript ```js
    ``` --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Objets > Les 80 745 objets de Vanilla, TBC et WotLK : qualité, niveaux, emplacement, dégâts, prix, infobulle, sources, filtre voleur. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/items ## Objets Tout le catalogue des objets du jeu, dans les trois versions : armes, armures, consommables, recettes, objets de quête… Les objets internes du jeu (tests, doublons, objets jamais sortis) sont absents des listes et de la recherche, mais restent joignables par leur numéro, avec `internal: true`. **Routes** - `GET /v1/{version}/items` : Lister les objets - `GET /v1/{version}/items/{id}` : Obtenir un objet ## L’objet item Un objet du jeu. Les listes renvoient le résumé ; la fiche ajoute les champs « fiche seulement » : sources de butin, quêtes, réputation requise, versions, guides. - `object` (chaîne) : Type d’objet, toujours « item ». Valeurs : `item`. - `id` (entier) : 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` (chaîne) : Clé WoWDB, unique dans toute la base : « :: » (classic:item:5191). - `version` (code) : Version du jeu de cette fiche. Valeurs : `classic`, `tbc`, `wotlk`. - `name` (chaîne) : Nom français, comme en jeu. - `quality` (code ou null) : Qualité de l’objet (couleur du nom en jeu). Valeurs : `poor`, `common`, `uncommon`, `rare`, `epic`, `legendary`, `artifact`, `heirloom`. - `quality_name` (chaîne ou null) : Qualité, libellé français. - `icon` (chaîne ou null) : 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` (entier ou null) : Niveau d’objet. - `required_level` (entier ou null) : Niveau requis pour l’équiper ou l’utiliser. - `slot` (code ou null) : Emplacement d’équipement ; null si l’objet ne se porte pas. Valeurs : voir les codes (https://docs.wowdb.assemblee-defias.fr/filtres#codes). - `slot_name` (chaîne ou null) : Emplacement, libellé du jeu (« À une main »). - `type` (code ou null) : Type d’objet : sous-classe pour les armes et armures (dague, cuir…), classe pour les autres. Valeurs : voir les codes (https://docs.wowdb.assemblee-defias.fr/filtres#codes). - `type_name` (chaîne ou null) : Type, libellé français. - `weapon` (objet ou null) : Caractéristiques d’arme lues dans l’infobulle ; null hors des armes. - `damage_min` (entier) : Dégâts minimum. - `damage_max` (entier) : Dégâts maximum. - `speed` (nombre) : Vitesse d’attaque en secondes. - `dps` (nombre) : Dégâts par seconde. - `sell_price` (entier ou null) : Prix de vente à un marchand, en pièces de cuivre (10 000 = 1 pièce d’or) ; null si invendable. - `rogue` (booléen) : 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` (booléen) : Objet interne du jeu (test, doublon, jamais sorti) : absent des listes et de la recherche, mais joignable par son identifiant. - `tooltip` (tableau de chaînes) : Infobulle du jeu, ligne par ligne, en français (sans le prix de vente, donné par sell_price). - `url` (chaîne) : Adresse publique de la fiche sur WoWDB (page HTML, à donner à vos lecteurs). - `api_url` (chaîne) : Adresse de l’objet dans l’API. Champs de la fiche seulement (`GET …/{id}`) : - `required_reputation` (objet ou null) : Réputation requise pour l’acheter ou l’utiliser. - `faction` (Ref ou null) : La réputation, quand elle a une fiche. - `name` (chaîne) : Nom de la faction. - `rank` (code ou null) : Rang requis. Valeurs : `hated`, `hostile`, `unfriendly`, `neutral`, `friendly`, `honored`, `revered`, `exalted`. - `rank_name` (chaîne ou null) : Rang requis, libellé du jeu. - `dropped_by` (tableau d’objets) : Où il tombe dans les donjons et raids : monstres, boss et coffres, par difficulté. - `source_type` (chaîne) : « npc » (créature) ou « game_object » (coffre). - `name` (chaîne) : Nom de la source. - `npc` (Ref ou null) : Fiche du PNJ, quand elle existe. - `boss` (booléen) : Vrai pour un boss. - `instance` (InstanceRef) : Le donjon ou raid. - `difficulty` (code ou null) : Difficulté. Valeurs : `normal`, `heroic`, `10_player`, `25_player`, `10_player_heroic`, `25_player_heroic`. - `difficulty_name` (chaîne ou null) : Difficulté, libellé français. - `chance` (nombre ou null) : Chance de butin en pour cent. - `rewarded_by` (tableau d’objets) : Quêtes qui le donnent en récompense. - `quest` (Ref) : La quête. - `choice` (booléen) : Vrai si c’est une récompense au choix. - `summons` (objet ou null) : Monture ou compagnon que l’objet invoque. - `type` (chaîne) : « mount », « companion » ou « other ». - `name` (chaîne ou null) : Nom de la créature. - `npc` (Ref ou null) : Fiche de la créature. - `other_names` (tableau de chaînes) : Autres noms : nom anglais, anciens noms français. - `versions` (tableau de Ref) : La même fiche dans chaque version du jeu où elle existe (elle comprise). - `guides` (tableau d’objets) : Guides de L’Assemblée des Défias qui citent cette fiche. - `title` (chaîne) : Titre du guide. - `url` (chaîne) : Adresse du guide sur assemblee-defias.fr. **Exemple : objet** (statut 200) ```json { "object": "item", "id": 5191, "key": "classic:item:5191", "version": "classic", "name": "Barbelure cruelle", "quality": "rare", "quality_name": "Rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_sword_24.jpg", "item_level": 24, "required_level": 19, "slot": "one_hand", "slot_name": "À une main", "type": "sword", "type_name": "Épée", "weapon": { "damage_min": 30, "damage_max": 57, "speed": 2.8, "dps": 15.5 }, "sell_price": 2964, "rogue": true, "internal": false, "tooltip": [ "Barbelure cruelle", "Niveau d'objet 24", "Lié quand ramassé", "À une main", "Épée", "Dégâts : 30 - 57", "Vitesse 2.80", "(15.5 dégâts par seconde)", "Durabilité 75 / 75", "Niveau 19 requis", "Équipé : Augmente de 12 la puissance d'attaque." ], "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:5191", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191", "required_reputation": null, "dropped_by": [ { "source_type": "npc", "name": "Edwin VanCleef", "npc": { "object": "npc", "id": 639, "version": "classic", "name": "Edwin VanCleef", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:639", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639" }, "boss": true, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" }, "difficulty": "normal", "difficulty_name": "Normal", "chance": 20 } ], "rewarded_by": [], "summons": null, "other_names": [], "versions": [ { "object": "item", "id": 5191, "version": "classic", "name": "Barbelure cruelle", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:5191", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191" }, { "object": "item", "id": 5191, "version": "tbc", "name": "Barbelure cruelle", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:5191", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/5191" }, { "object": "item", "id": 5191, "version": "wotlk", "name": "Barbelure cruelle", "url": "https://wowdb.assemblee-defias.fr/?id=wotlk:item:5191", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/wotlk/items/5191" } ], "guides": [] } ``` ## Lister les objets `GET /v1/{version}/items` 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. **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `q` (chaîne, facultatif) : 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. - `quality` (codes séparés par des virgules, facultatif) : Qualités. Plusieurs valeurs séparées par des virgules. Valeurs : `poor`, `common`, `uncommon`, `rare`, `epic`, `legendary`, `artifact`, `heirloom`. - `slot` (codes séparés par des virgules, facultatif) : Emplacements. Plusieurs valeurs séparées par des virgules. Valeurs : voir https://docs.wowdb.assemblee-defias.fr/filtres#codes. - `type` (codes séparés par des virgules, facultatif) : Types d’objet. Plusieurs valeurs séparées par des virgules. Valeurs : voir https://docs.wowdb.assemblee-defias.fr/filtres#codes. - `min_level` (entier, facultatif) : Niveau requis minimum (1 à 100). - `max_level` (entier, facultatif) : Niveau requis maximum (1 à 100). - `min_item_level` (entier, facultatif) : Niveau d’objet minimum. - `max_item_level` (entier, facultatif) : Niveau d’objet maximum. - `rogue` (booléen, facultatif) : true : seulement les objets utiles au voleur ; false : seulement les autres. Absent : tout (par défaut). - `sort` (chaîne, facultatif) : 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. Valeurs : `name`, `-name`, `item_level`, `-item_level`, `required_level`, `-required_level`, `quality`, `-quality`. - `limit` (entier, facultatif) : Nombre d’éléments par page, de 1 à 100 (20 par défaut). - `cursor` (chaîne, facultatif) : Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres. - `include_total` (booléen, facultatif) : true : ajoute total_count, le nombre total d’éléments avec ces filtres. **Renvoie** : Une liste (`object: "list"`) d’objets `item`, paginée par curseur. **Requête (GET /v1/{version}/items)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/classic/items \ -d type=dagger \ -d rogue=true \ -d quality=rare,epic \ -d max_level=30 \ -d sort=-item_level \ -d limit=2 ``` #### JavaScript ```js const params = new URLSearchParams({ type: "dagger", rogue: "true", quality: "rare,epic", max_level: "30", sort: "-item_level", limit: "2", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/classic/items?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const item of page.data) { console.log(item.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "type": "dagger", "rogue": "true", "quality": "rare,epic", "max_level": "30", "sort": "-item_level", "limit": "2", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/classic/items?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for item in page["data"]: print(item["name"]) ``` #### PHP ```php 'dagger', 'rogue' => 'true', 'quality' => 'rare,epic', 'max_level' => '30', 'sort' => '-item_level', 'limit' => '2', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/items?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $item) { echo $item['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/items") uri.query = URI.encode_www_form( type: "dagger", rogue: "true", quality: "rare,epic", max_level: "30", sort: "-item_level", limit: "2", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |item| puts item["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("type", "dagger") params.Set("rogue", "true") params.Set("quality", "rare,epic") params.Set("max_level", "30") params.Set("sort", "-item_level") params.Set("limit", "2") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/items?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, item := range page.Data { fmt.Println(item["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/items?type=dagger&rogue=true&quality=rare,epic&max_level=30&sort=-item_level&limit=2")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/items?type=dagger&rogue=true&quality=rare,epic&max_level=30&sort=-item_level&limit=2"); using var doc = JsonDocument.Parse(json); foreach (var item in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(item.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/items") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("type", "dagger") .query("rogue", "true") .query("quality", "rare,epic") .query("max_level", "30") .query("sort", "-item_level") .query("limit", "2") .call()? .into_json()?; for item in page["data"].as_array().into_iter().flatten() { println!("{}", item["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "item", "id": 23168, "key": "classic:item:23168", "version": "classic", "name": "Dague focale de Dédain", "quality": "rare", "quality_name": "Rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_weapon_shortblade_07.jpg", "item_level": 35, "required_level": 30, "slot": "one_hand", "slot_name": "À une main", "type": "dagger", "type_name": "Dague", "weapon": { "damage_min": 22, "damage_max": 42, "speed": 1.4, "dps": 22.9 }, "sell_price": 2665, "rogue": true, "internal": false, "tooltip": [ "Dague focale de Dédain", "Niveau d'objet 35", "Lié quand ramassé", "À une main", "Dague", "Dégâts : 22 - 42", "Vitesse 1.40", "(22.9 dégâts par seconde)", "Durabilité 65 / 65", "Niveau 30 requis", "Équipé : Augmente les dégâts et les soins produits par les sorts et effets magiques de 9 au maximum." ], "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:23168", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/23168" }, { "object": "item", "id": 6691, "key": "classic:item:6691", "version": "classic", "name": "Surin de brochepourceau", "quality": "rare", "quality_name": "Rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bone_06.jpg", "item_level": 35, "required_level": 30, "slot": "one_hand", "slot_name": "À une main", "type": "dagger", "type_name": "Dague", "weapon": { "damage_min": 24, "damage_max": 45, "speed": 1.5, "dps": 23 }, "sell_price": 8866, "rogue": true, "internal": false, "tooltip": [ "Surin de brochepourceau", "Niveau d'objet 35", "Lié quand ramassé", "Unique", "À une main", "Dague", "Dégâts : 24 - 45", "Vitesse 1.50", "(23.0 dégâts par seconde)", "+6 Endurance", "+4 Esprit", "Durabilité 65 / 65", "Niveau 30 requis" ], "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:6691", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/6691" } ], "has_more": true, "next_cursor": "eyJrIjpbLTM1LCJzdXJpbiBkZSBicm9jaGVwb3VyY2VhdSIsImNsYXNzaWM6aXRlbTo2NjkxIl0sImgiOiJqY1BDbFRNSFQyIn0", "url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items?max_level=30&quality=rare%2Cepic&rogue=true&sort=-item_level&type=dagger" } ``` ## Obtenir un objet `GET /v1/{version}/items/{id}` La fiche complète de l’objet : les champs de la liste, plus ceux marqués « fiche seulement ». **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `id` (entier, dans le chemin, obligatoire) : Identifiant du jeu de l’objet. **Renvoie** : La fiche complète, objet `item` (champs du résumé et champs « fiche seulement »), ou une erreur 404. **Requête (GET /v1/{version}/items/{id})** #### cURL ```bash curl https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191 ``` #### JavaScript ```js const res = await fetch("https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191"); if (!res.ok) throw new Error((await res.json()).error.message); const item = await res.json(); console.log(item.name); ``` #### Python ```python import json import urllib.request req = urllib.request.Request( "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: item = json.load(res) print(item["name"]) ``` #### PHP ```php ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191', false, $context); $item = json_decode($json, true); echo $item['name'], PHP_EOL; ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191") res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) item = JSON.parse(res.body) puts item["name"] ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" ) func main() { req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191", nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var item map[string]any if err := json.NewDecoder(res.Body).Decode(&item); err != nil { panic(err) } fmt.Println(item["name"]) } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191"); using var doc = JsonDocument.Parse(json); Console.WriteLine(doc.RootElement.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let item: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .call()? .into_json()?; println!("{}", item["name"].as_str().unwrap_or_default()); Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "item", "id": 5191, "key": "classic:item:5191", "version": "classic", "name": "Barbelure cruelle", "quality": "rare", "quality_name": "Rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_sword_24.jpg", "item_level": 24, "required_level": 19, "slot": "one_hand", "slot_name": "À une main", "type": "sword", "type_name": "Épée", "weapon": { "damage_min": 30, "damage_max": 57, "speed": 2.8, "dps": 15.5 }, "sell_price": 2964, "rogue": true, "internal": false, "tooltip": [ "Barbelure cruelle", "Niveau d'objet 24", "Lié quand ramassé", "À une main", "Épée", "Dégâts : 30 - 57", "Vitesse 2.80", "(15.5 dégâts par seconde)", "Durabilité 75 / 75", "Niveau 19 requis", "Équipé : Augmente de 12 la puissance d'attaque." ], "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:5191", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191", "required_reputation": null, "dropped_by": [ { "source_type": "npc", "name": "Edwin VanCleef", "npc": { "object": "npc", "id": 639, "version": "classic", "name": "Edwin VanCleef", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:639", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639" }, "boss": true, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" }, "difficulty": "normal", "difficulty_name": "Normal", "chance": 20 } ], "rewarded_by": [], "summons": null, "other_names": [], "versions": [ { "object": "item", "id": 5191, "version": "classic", "name": "Barbelure cruelle", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:5191", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191" }, { "object": "item", "id": 5191, "version": "tbc", "name": "Barbelure cruelle", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:5191", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/5191" }, { "object": "item", "id": 5191, "version": "wotlk", "name": "Barbelure cruelle", "url": "https://wowdb.assemblee-defias.fr/?id=wotlk:item:5191", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/wotlk/items/5191" } ], "guides": [] } ``` --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Sorts > Les sorts et talents du voleur, avec leurs rangs et niveaux requis. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/spells ## Sorts Les sorts et talents du voleur cités par les guides de L’Assemblée des Défias, dans chaque version, avec tous leurs rangs. Chaque rang est une fiche (son propre identifiant) ; `ranks` les relie. **Routes** - `GET /v1/{version}/spells` : Lister les sorts - `GET /v1/{version}/spells/{id}` : Obtenir un sort ## L’objet spell Un sort ou un talent, rang par rang. - `object` (chaîne) : Type d’objet, toujours « spell ». Valeurs : `spell`. - `id` (entier) : 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` (chaîne) : Clé WoWDB, unique dans toute la base : « :: » (classic:spell:1784). - `version` (code) : Version du jeu de cette fiche. Valeurs : `classic`, `tbc`, `wotlk`. - `name` (chaîne) : Nom français, comme en jeu. - `icon` (chaîne ou null) : Adresse absolue de l’icône du jeu (WebP, JPEG ou PNG), servie par WoWDB ; null si la fiche n’en a pas. - `rank` (entier ou null) : Rang du sort ; null pour un sort sans rang. - `required_level` (entier ou null) : Niveau requis. - `talent` (booléen) : Vrai pour un talent. - `tooltip` (tableau de chaînes) : Infobulle du jeu, ligne par ligne, en français (sans le prix de vente, donné par sell_price). - `url` (chaîne) : Adresse publique de la fiche sur WoWDB (page HTML, à donner à vos lecteurs). - `api_url` (chaîne) : Adresse de le sort dans l’API. Champs de la fiche seulement (`GET …/{id}`) : - `ranks` (tableau d’objets) : Tous les rangs de ce sort dans la même version. - `rank` (entier) : Rang. - `required_level` (entier ou null) : Niveau requis. - `spell` (Ref) : Fiche du rang. - `versions` (tableau de Ref) : La même fiche dans chaque version du jeu où elle existe (elle comprise). - `guides` (tableau d’objets) : Guides de L’Assemblée des Défias qui citent cette fiche. - `title` (chaîne) : Titre du guide. - `url` (chaîne) : Adresse du guide sur assemblee-defias.fr. **Exemple : sort** (statut 200) ```json { "object": "spell", "id": 1784, "key": "classic:spell:1784", "version": "classic", "name": "Camouflage", "icon": "https://wowdb.assemblee-defias.fr/database-icons/ability_stealth.jpg", "rank": 1, "required_level": 1, "talent": false, "tooltip": [ "Camouflage", "Instantanée", "10 s de recharge", "Requiert Voleur", "Niveau 1 requis", "Permet au voleur de se déplacer silencieusement, mais réduit sa vitesse de 50%. Dure jusqu'à ce qu'il soit annulé." ], "url": "https://wowdb.assemblee-defias.fr/?id=classic:spell:1784", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1784", "ranks": [ { "rank": 1, "required_level": 1, "spell": { "object": "spell", "id": 1784, "version": "classic", "name": "Camouflage", "url": "https://wowdb.assemblee-defias.fr/?id=classic:spell:1784", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1784" } }, { "rank": 2, "required_level": 20, "spell": { "object": "spell", "id": 1785, "version": "classic", "name": "Camouflage", "url": "https://wowdb.assemblee-defias.fr/?id=classic:spell:1785", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1785" } }, { "rank": 3, "required_level": 40, "spell": { "object": "spell", "id": 1786, "version": "classic", "name": "Camouflage", "url": "https://wowdb.assemblee-defias.fr/?id=classic:spell:1786", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1786" } }, { "rank": 4, "required_level": 60, "spell": { "object": "spell", "id": 1787, "version": "classic", "name": "Camouflage", "url": "https://wowdb.assemblee-defias.fr/?id=classic:spell:1787", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1787" } } ], "versions": [ { "object": "spell", "id": 1784, "version": "classic", "name": "Camouflage", "url": "https://wowdb.assemblee-defias.fr/?id=classic:spell:1784", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1784" }, { "object": "spell", "id": 1784, "version": "tbc", "name": "Camouflage", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:spell:1784", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/spells/1784" }, { "object": "spell", "id": 1784, "version": "wotlk", "name": "Camouflage", "url": "https://wowdb.assemblee-defias.fr/?id=wotlk:spell:1784", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/wotlk/spells/1784" } ], "guides": [] } ``` ## Lister les sorts `GET /v1/{version}/spells` Les sorts et talents du voleur cités par les guides, avec tous leurs rangs. **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `q` (chaîne, facultatif) : 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. - `talent` (booléen, facultatif) : true : talents seulement ; false : sorts seulement. - `min_level` (entier, facultatif) : Niveau requis minimum (1 à 100). - `max_level` (entier, facultatif) : Niveau requis maximum (1 à 100). - `sort` (chaîne, facultatif) : 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. Valeurs : `name`, `-name`, `required_level`, `-required_level`. - `limit` (entier, facultatif) : Nombre d’éléments par page, de 1 à 100 (20 par défaut). - `cursor` (chaîne, facultatif) : Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres. - `include_total` (booléen, facultatif) : true : ajoute total_count, le nombre total d’éléments avec ces filtres. **Renvoie** : Une liste (`object: "list"`) d’objets `spell`, paginée par curseur. **Requête (GET /v1/{version}/spells)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/classic/spells \ -d q=camouflage \ -d limit=2 ``` #### JavaScript ```js const params = new URLSearchParams({ q: "camouflage", limit: "2", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/classic/spells?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const spell of page.data) { console.log(spell.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "q": "camouflage", "limit": "2", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/classic/spells?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for spell in page["data"]: print(spell["name"]) ``` #### PHP ```php 'camouflage', 'limit' => '2', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/spells?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $spell) { echo $spell['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/spells") uri.query = URI.encode_www_form( q: "camouflage", limit: "2", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |spell| puts spell["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("q", "camouflage") params.Set("limit", "2") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/spells?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, spell := range page.Data { fmt.Println(spell["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/spells?q=camouflage&limit=2")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/spells?q=camouflage&limit=2"); using var doc = JsonDocument.Parse(json); foreach (var spell in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(spell.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/spells") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("q", "camouflage") .query("limit", "2") .call()? .into_json()?; for spell in page["data"].as_array().into_iter().flatten() { println!("{}", spell["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "spell", "id": 1784, "key": "classic:spell:1784", "version": "classic", "name": "Camouflage", "icon": "https://wowdb.assemblee-defias.fr/database-icons/ability_stealth.jpg", "rank": 1, "required_level": 1, "talent": false, "tooltip": [ "Camouflage", "Instantanée", "10 s de recharge", "Requiert Voleur", "Niveau 1 requis", "Permet au voleur de se déplacer silencieusement, mais réduit sa vitesse de 50%. Dure jusqu'à ce qu'il soit annulé." ], "url": "https://wowdb.assemblee-defias.fr/?id=classic:spell:1784", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1784" }, { "object": "spell", "id": 1785, "key": "classic:spell:1785", "version": "classic", "name": "Camouflage", "icon": "https://wowdb.assemblee-defias.fr/database-icons/ability_stealth.jpg", "rank": 2, "required_level": 20, "talent": false, "tooltip": [ "Camouflage", "Instantanée", "10 s de recharge", "Requiert Voleur", "Niveau 20 requis", "Permet au voleur de se déplacer silencieusement, mais réduit sa vitesse de 40%. Dure jusqu'à ce qu'il soit annulé." ], "url": "https://wowdb.assemblee-defias.fr/?id=classic:spell:1785", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1785" } ], "has_more": true, "next_cursor": "eyJrIjpbImNhbW91ZmxhZ2UiLCJjbGFzc2ljOnNwZWxsOjE3ODUiXSwiaCI6ImtVSFVnZVpFeFAifQ", "url": "https://api.wowdb.assemblee-defias.fr/v1/classic/spells?q=camouflage" } ``` ## Obtenir un sort `GET /v1/{version}/spells/{id}` La fiche complète du sort : les champs de la liste, plus ceux marqués « fiche seulement ». **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `id` (entier, dans le chemin, obligatoire) : Identifiant du jeu du sort. **Renvoie** : La fiche complète, objet `spell` (champs du résumé et champs « fiche seulement »), ou une erreur 404. **Requête (GET /v1/{version}/spells/{id})** #### cURL ```bash curl https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1784 ``` #### JavaScript ```js const res = await fetch("https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1784"); if (!res.ok) throw new Error((await res.json()).error.message); const spell = await res.json(); console.log(spell.name); ``` #### Python ```python import json import urllib.request req = urllib.request.Request( "https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1784", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: spell = json.load(res) print(spell["name"]) ``` #### PHP ```php ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1784', false, $context); $spell = json_decode($json, true); echo $spell['name'], PHP_EOL; ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1784") res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) spell = JSON.parse(res.body) puts spell["name"] ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" ) func main() { req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1784", nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var spell map[string]any if err := json.NewDecoder(res.Body).Decode(&spell); err != nil { panic(err) } fmt.Println(spell["name"]) } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1784")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1784"); using var doc = JsonDocument.Parse(json); Console.WriteLine(doc.RootElement.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let spell: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1784") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .call()? .into_json()?; println!("{}", spell["name"].as_str().unwrap_or_default()); Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "spell", "id": 1784, "key": "classic:spell:1784", "version": "classic", "name": "Camouflage", "icon": "https://wowdb.assemblee-defias.fr/database-icons/ability_stealth.jpg", "rank": 1, "required_level": 1, "talent": false, "tooltip": [ "Camouflage", "Instantanée", "10 s de recharge", "Requiert Voleur", "Niveau 1 requis", "Permet au voleur de se déplacer silencieusement, mais réduit sa vitesse de 50%. Dure jusqu'à ce qu'il soit annulé." ], "url": "https://wowdb.assemblee-defias.fr/?id=classic:spell:1784", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1784", "ranks": [ { "rank": 1, "required_level": 1, "spell": { "object": "spell", "id": 1784, "version": "classic", "name": "Camouflage", "url": "https://wowdb.assemblee-defias.fr/?id=classic:spell:1784", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1784" } }, { "rank": 2, "required_level": 20, "spell": { "object": "spell", "id": 1785, "version": "classic", "name": "Camouflage", "url": "https://wowdb.assemblee-defias.fr/?id=classic:spell:1785", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1785" } }, { "rank": 3, "required_level": 40, "spell": { "object": "spell", "id": 1786, "version": "classic", "name": "Camouflage", "url": "https://wowdb.assemblee-defias.fr/?id=classic:spell:1786", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1786" } }, { "rank": 4, "required_level": 60, "spell": { "object": "spell", "id": 1787, "version": "classic", "name": "Camouflage", "url": "https://wowdb.assemblee-defias.fr/?id=classic:spell:1787", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1787" } } ], "versions": [ { "object": "spell", "id": 1784, "version": "classic", "name": "Camouflage", "url": "https://wowdb.assemblee-defias.fr/?id=classic:spell:1784", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/spells/1784" }, { "object": "spell", "id": 1784, "version": "tbc", "name": "Camouflage", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:spell:1784", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/spells/1784" }, { "object": "spell", "id": 1784, "version": "wotlk", "name": "Camouflage", "url": "https://wowdb.assemblee-defias.fr/?id=wotlk:spell:1784", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/wotlk/spells/1784" } ], "guides": [] } ``` --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Quêtes > Les 19 713 quêtes : objectifs, récompenses, PNJ de début et de fin, chaînes, catégories. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/quests ## Quêtes Toutes les quêtes du jeu, avec leurs textes français, leurs objectifs, leurs récompenses et leur chaîne. Exemple : **La Confrérie défias** (`166`), la quête qui envoie tuer Edwin VanCleef. **Routes** - `GET /v1/{version}/quests` : Lister les quêtes - `GET /v1/{version}/quests/{id}` : Obtenir une quête ## L’objet quest Une quête. Les listes renvoient un résumé (niveau, camp, catégorie, récompenses) ; la fiche ajoute les textes, les objectifs, les récompenses détaillées, les PNJ et la chaîne. - `object` (chaîne) : Type d’objet, toujours « quest ». Valeurs : `quest`. - `id` (entier) : 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` (chaîne) : Clé WoWDB, unique dans toute la base : « :: » (classic:quest:166). - `version` (code) : Version du jeu de cette fiche. Valeurs : `classic`, `tbc`, `wotlk`. - `name` (chaîne) : Nom français, comme en jeu. - `icon` (chaîne ou null) : Adresse absolue de l’icône du jeu (WebP, JPEG ou PNG), servie par WoWDB ; null si la fiche n’en a pas. - `level` (entier ou null) : Niveau de la quête. - `required_level` (entier ou null) : Niveau requis pour la prendre. - `side` (code ou null) : Camp qui peut la faire. Valeurs : `alliance`, `horde`, `both`. - `side_name` (chaîne ou null) : Camp, libellé français. - `type` (code ou null) : Type de quête du jeu (groupe, donjon, raid…) ; null pour une quête normale. Valeurs : `group`, `elite`, `dungeon`, `raid`, `heroic`, `pvp`, `escort`, `legendary`, `world_event`, `life`, `other`. - `type_name` (chaîne ou null) : Type, libellé français. - `daily` (booléen) : Quête journalière. - `weekly` (booléen) : Quête hebdomadaire. - `repeatable` (booléen) : Quête répétable. - `category` (objet ou null) : Catégorie du journal de quêtes : une zone ou une catégorie du jeu (classe, métier, événement). - `type` (chaîne) : « zone » ou « sort » (catégorie du jeu). - `id` (entier ou null) : Numéro de la zone ou de la catégorie (filtre zone des listes). - `name` (chaîne) : Nom français. - `instance` (InstanceRef ou null) : Donjon ou raid de la quête. - `xp` (entier ou null) : Expérience gagnée. - `money` (entier ou null) : Argent gagné, en cuivre. - `reward_items` (tableau d’objets) : Objets de récompense, donnés ou au choix. - `item` (ItemRef) : L’objet. - `choice` (booléen) : Vrai si c’est une récompense au choix. - `rogue` (booléen) : Utile au voleur (récompense ou objectif qui le concerne, quête de classe). - `internal` (booléen) : Quête interne du jeu (jamais sortie) : absente des listes et de la recherche. - `url` (chaîne) : Adresse publique de la fiche sur WoWDB (page HTML, à donner à vos lecteurs). - `api_url` (chaîne) : Adresse de la quête dans l’API. Champs de la fiche seulement (`GET …/{id}`) : - `max_level` (entier ou null) : Niveau maximum pour la prendre. - `players` (entier ou null) : Nombre de joueurs conseillé. - `shareable` (booléen ou null) : Partageable avec le groupe. - `time_limit_text` (chaîne ou null) : Temps limité, en clair (« 15 min »). - `races` (chaîne ou null) : Races qui peuvent la prendre, en clair ; null pour toutes. - `classes` (chaîne ou null) : Classes qui peuvent la prendre, en clair ; null pour toutes. - `skill` (objet ou null) : Métier requis. - `name` (chaîne) : Métier. - `level` (entier) : Niveau de métier. - `objectives` (chaîne ou null) : Objectifs, texte du jeu. - `description` (chaîne ou null) : Description, texte du jeu. - `progress` (chaîne ou null) : Texte de progression (quête pas encore finie). - `completion` (chaîne ou null) : Texte de fin. - `requirements` (tableau d’objets) : Ce qu’il faut faire ou rapporter. - `kind` (chaîne) : item (objet à rapporter), creature, object (objet du monde), money, reputation, players, explore ou text. - `name` (chaîne ou null) : Nom de l’objectif. - `quantity` (entier ou null) : Quantité. - `record` (Ref ou null) : Fiche de l’objet, de la créature ou de la réputation. - `money` (entier ou null, facultatif) : Argent demandé, en cuivre (kind money). - `rank_name` (chaîne ou null, facultatif) : Rang à atteindre (kind reputation). - `value` (entier ou null, facultatif) : Valeur de réputation (kind reputation). - `zones` (tableau de chaînes, facultatif) : Zones de l’objectif. - `instance` (InstanceRef ou null, facultatif) : Donjon de l’objectif. - `text` (chaîne ou null, facultatif) : Libellé du jeu, quand il diffère du nom. - `rewards` (objet) : Récompenses. - `items` (tableau d’objets) : Objets donnés : item (ItemRef ou null), name, quantity. - `choices` (tableau d’objets) : Objets au choix : item, name, quantity. - `money` (entier ou null) : Argent, en cuivre. - `money_max_level` (entier ou null) : Argent au niveau maximum, en cuivre. - `xp` (entier ou null) : Expérience. - `spell` (objet ou null) : Sort appris : name et spell (Ref ou null). - `title` (chaîne ou null) : Titre obtenu. - `honor` (entier ou null) : Points d’honneur. - `arena` (entier ou null) : Points d’arène. - `talents` (entier ou null) : Points de talent. - `reputation` (tableau d’objets) : Réputation gagnée : faction (Ref ou null), name, value. - `starts` (tableau d’objets) : Qui donne la quête. - `type` (chaîne) : npc, item (objet qui commence la quête) ou game_object. - `name` (chaîne ou null) : Nom. - `record` (Ref ou null) : Sa fiche. - `zones` (tableau de chaînes) : Zones où le trouver. - `instance` (InstanceRef ou null) : Donjon où le trouver. - `ends` (tableau d’objets) : Qui reprend la quête (mêmes champs que starts). - `chain` (objet ou null) : Suite de quêtes. - `previous` (tableau de Ref) : À faire avant. - `follows` (tableau de Ref) : Quête dont elle est la suite directe. - `next` (tableau de Ref) : Quêtes ouvertes ensuite. - `direct` (tableau de Ref) : Suite directe, proposée aussitôt. - `exclusive` (tableau de Ref) : Quêtes exclusives : une seule possible. - `group` (tableau de Ref) : Quêtes du même ensemble. - `opened_by` (ItemRef ou null) : Objet qui ouvre la quête. - `versions` (tableau de Ref) : La même fiche dans chaque version du jeu où elle existe (elle comprise). - `guides` (tableau d’objets) : Guides de L’Assemblée des Défias qui citent cette fiche. - `title` (chaîne) : Titre du guide. - `url` (chaîne) : Adresse du guide sur assemblee-defias.fr. **Exemple : quête** (statut 200) ```json { "object": "quest", "id": 166, "key": "classic:quest:166", "version": "classic", "name": "La Confrérie défias", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_note_01.jpg", "level": 22, "required_level": 14, "side": "alliance", "side_name": "Alliance", "type": "dungeon", "type_name": "Donjon", "daily": false, "weekly": false, "repeatable": false, "category": { "type": "zone", "id": 1581, "name": "Les Mortemines" }, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" }, "xp": 2600, "money": null, "reward_items": [ { "item": { "object": "item", "id": 6087, "version": "classic", "name": "Haut-de-chausses de la marche de l'Ouest", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_pants_03.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:6087", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/6087" }, "choice": true }, { "item": { "object": "item", "id": 2041, "version": "classic", "name": "Tunique de la marche de l'Ouest", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_chest_leather_07.jpg", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:2041", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/2041" }, "choice": true }, { "item": { "object": "item", "id": 2042, "version": "classic", "name": "Bâton de la marche de l'Ouest", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_staff_10.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:2042", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/2042" }, "choice": true } ], "rogue": true, "internal": false, "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:166", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/166", "max_level": null, "players": null, "shareable": true, "time_limit_text": null, "races": null, "classes": null, "skill": null, "objectives": "Tuer Edwin VanCleef et apporter sa Tête à Gryan Roidemantel.", "description": "Il vous reste une dernière mission à accomplir. Il va falloir éliminer Edwin VanCleef. Bien que cela me chagrine de condamner un homme à mort, c'est pour le bien du peuple de la marche de l'Ouest que VanCleef doit mourir. Apportez-moi sa tête lorsque l'acte sera accompli.", "progress": "Alors, comment se passe cette chasse à l'homme pour Edwin VanCleef ?", "completion": ", votre bravoure est extraordinaire. La Milice du peuple vous remercie pour les services rendus au peuple de la marche de l'Ouest. VanCleef est mort, et sa mort marque le début de la chute de la Confrérie Défias. Nous pouvons espérer maintenant qu'un jour la paix revienne sur ce beau pays !\n\nJe vous salue, Seigneur !", "requirements": [ { "kind": "item", "name": "Tête de VanCleef", "quantity": 1, "record": { "object": "item", "id": 3637, "version": "classic", "name": "Tête de VanCleef", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_head_human_01.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:3637", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/3637" } } ], "rewards": { "items": [], "choices": [ { "item": { "object": "item", "id": 6087, "version": "classic", "name": "Haut-de-chausses de la marche de l'Ouest", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_pants_03.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:6087", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/6087" }, "name": "Haut-de-chausses de la marche de l'Ouest", "quantity": 1 }, { "item": { "object": "item", "id": 2041, "version": "classic", "name": "Tunique de la marche de l'Ouest", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_chest_leather_07.jpg", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:2041", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/2041" }, "name": "Tunique de la marche de l'Ouest", "quantity": 1 }, { "item": { "object": "item", "id": 2042, "version": "classic", "name": "Bâton de la marche de l'Ouest", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_staff_10.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:2042", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/2042" }, "name": "Bâton de la marche de l'Ouest", "quantity": 1 } ], "money": null, "money_max_level": 1560, "xp": 2600, "spell": null, "title": null, "honor": null, "arena": null, "talents": null, "reputation": [ { "faction": { "object": "faction", "id": 72, "version": "classic", "name": "Hurlevent", "url": "https://wowdb.assemblee-defias.fr/?id=classic:faction:72", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/factions/72" }, "name": "Hurlevent", "value": 500 } ] }, "starts": [ { "type": "npc", "name": "Maréchal Gryan Roidemantel", "record": { "object": "npc", "id": 234, "version": "classic", "name": "Maréchal Gryan Roidemantel", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:234", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/234" }, "zones": [ "Marche de l'Ouest" ], "instance": null } ], "ends": [ { "type": "npc", "name": "Maréchal Gryan Roidemantel", "record": { "object": "npc", "id": 234, "version": "classic", "name": "Maréchal Gryan Roidemantel", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:234", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/234" }, "zones": [ "Marche de l'Ouest" ], "instance": null } ], "chain": { "previous": [], "follows": [ { "object": "quest", "id": 155, "version": "classic", "name": "La Confrérie défias", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:155", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/155" } ], "next": [], "direct": [], "exclusive": [], "group": [], "opened_by": null }, "versions": [ { "object": "quest", "id": 166, "version": "classic", "name": "La Confrérie défias", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:166", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/166" }, { "object": "quest", "id": 166, "version": "tbc", "name": "La Confrérie défias", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:quest:166", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/quests/166" }, { "object": "quest", "id": 166, "version": "wotlk", "name": "La Confrérie défias", "url": "https://wowdb.assemblee-defias.fr/?id=wotlk:quest:166", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/wotlk/quests/166" } ], "guides": [] } ``` ## Lister les quêtes `GET /v1/{version}/quests` Toutes les quêtes d’une version (quêtes internes exclues), avec leurs récompenses résumées. **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `q` (chaîne, facultatif) : 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. - `side` (codes séparés par des virgules, facultatif) : Camps. Plusieurs valeurs séparées par des virgules. Valeurs : `alliance`, `horde`, `both`. - `type` (codes séparés par des virgules, facultatif) : 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. Valeurs : `group`, `elite`, `dungeon`, `raid`, `heroic`, `pvp`, `escort`, `legendary`, `world_event`, `life`, `other`, `daily`, `weekly`, `repeatable`. - `zone` (entier, facultatif) : Numéro de la zone du journal de quêtes (category.id ; 1581 : Les Mortemines). - `min_level` (entier, facultatif) : Niveau de la quête minimum (1 à 100). - `max_level` (entier, facultatif) : Niveau de la quête maximum (1 à 100). - `rogue` (booléen, facultatif) : true : seulement les quêtes utiles au voleur ; false : seulement les autres. Absent : tout (par défaut). - `sort` (chaîne, facultatif) : 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. Valeurs : `name`, `-name`, `level`, `-level`, `xp`, `-xp`. - `limit` (entier, facultatif) : Nombre d’éléments par page, de 1 à 100 (20 par défaut). - `cursor` (chaîne, facultatif) : Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres. - `include_total` (booléen, facultatif) : true : ajoute total_count, le nombre total d’éléments avec ces filtres. **Renvoie** : Une liste (`object: "list"`) d’objets `quest`, paginée par curseur. **Requête (GET /v1/{version}/quests)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/classic/quests \ -d zone=1581 \ -d side=alliance \ -d sort=level \ -d limit=2 ``` #### JavaScript ```js const params = new URLSearchParams({ zone: "1581", side: "alliance", sort: "level", limit: "2", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/classic/quests?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const quest of page.data) { console.log(quest.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "zone": "1581", "side": "alliance", "sort": "level", "limit": "2", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/classic/quests?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for quest in page["data"]: print(quest["name"]) ``` #### PHP ```php '1581', 'side' => 'alliance', 'sort' => 'level', 'limit' => '2', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/quests?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $quest) { echo $quest['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/quests") uri.query = URI.encode_www_form( zone: "1581", side: "alliance", sort: "level", limit: "2", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |quest| puts quest["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("zone", "1581") params.Set("side", "alliance") params.Set("sort", "level") params.Set("limit", "2") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/quests?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, quest := range page.Data { fmt.Println(quest["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/quests?zone=1581&side=alliance&sort=level&limit=2")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/quests?zone=1581&side=alliance&sort=level&limit=2"); using var doc = JsonDocument.Parse(json); foreach (var quest in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(quest.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/quests") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("zone", "1581") .query("side", "alliance") .query("sort", "level") .query("limit", "2") .call()? .into_json()?; for quest in page["data"].as_array().into_iter().flatten() { println!("{}", quest["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "quest", "id": 214, "key": "classic:quest:214", "version": "classic", "name": "Les masques rouges en soie", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_note_01.jpg", "level": 17, "required_level": 14, "side": "alliance", "side_name": "Alliance", "type": "dungeon", "type_name": "Donjon", "daily": false, "weekly": false, "repeatable": false, "category": { "type": "zone", "id": 1581, "name": "Les Mortemines" }, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" }, "xp": 1250, "money": null, "reward_items": [ { "item": { "object": "item", "id": 2074, "version": "classic", "name": "Lame courte solide", "quality": "uncommon", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_sword_23.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:2074", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/2074" }, "choice": true }, { "item": { "object": "item", "id": 2089, "version": "classic", "name": "Dague en ivoire imagé", "quality": "uncommon", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_weapon_shortblade_01.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:2089", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/2089" }, "choice": true }, { "item": { "object": "item", "id": 6094, "version": "classic", "name": "Hache perforante", "quality": "uncommon", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_throwingaxe_01.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:6094", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/6094" }, "choice": true } ], "rogue": true, "internal": false, "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:214", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/214" }, { "object": "quest", "id": 168, "key": "classic:quest:168", "version": "classic", "name": "À la recherche de cartes du syndicat des mineurs", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_note_01.jpg", "level": 18, "required_level": 14, "side": "alliance", "side_name": "Alliance", "type": null, "type_name": null, "daily": false, "weekly": false, "repeatable": false, "category": { "type": "zone", "id": 1581, "name": "Les Mortemines" }, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" }, "xp": 1350, "money": null, "reward_items": [ { "item": { "object": "item", "id": 2037, "version": "classic", "name": "Bottes de tunnelier", "quality": "uncommon", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_boots_01.jpg", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:2037", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/2037" }, "choice": true }, { "item": { "object": "item", "id": 2036, "version": "classic", "name": "Gants de mine poussiéreux", "quality": "uncommon", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_gauntlets_05.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:2036", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/2036" }, "choice": true } ], "rogue": true, "internal": false, "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:168", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/168" } ], "has_more": true, "next_cursor": "eyJrIjpbMTgsImEgbGEgcmVjaGVyY2hlIGRlIGNhcnRlcyBkdSBzeW5kaWNhdCBkZXMgbWluZXVycyIsImNsYXNzaWM6cXVlc3Q6MTY4Il0sImgiOiI3U1NVdVFVZkVEIn0", "url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests?side=alliance&sort=level&zone=1581" } ``` ## Obtenir une quête `GET /v1/{version}/quests/{id}` La fiche complète de la quête : les champs de la liste, plus ceux marqués « fiche seulement ». **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `id` (entier, dans le chemin, obligatoire) : Identifiant du jeu de la quête. **Renvoie** : La fiche complète, objet `quest` (champs du résumé et champs « fiche seulement »), ou une erreur 404. **Requête (GET /v1/{version}/quests/{id})** #### cURL ```bash curl https://api.wowdb.assemblee-defias.fr/v1/classic/quests/166 ``` #### JavaScript ```js const res = await fetch("https://api.wowdb.assemblee-defias.fr/v1/classic/quests/166"); if (!res.ok) throw new Error((await res.json()).error.message); const quest = await res.json(); console.log(quest.name); ``` #### Python ```python import json import urllib.request req = urllib.request.Request( "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/166", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: quest = json.load(res) print(quest["name"]) ``` #### PHP ```php ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/quests/166', false, $context); $quest = json_decode($json, true); echo $quest['name'], PHP_EOL; ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/quests/166") res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) quest = JSON.parse(res.body) puts quest["name"] ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" ) func main() { req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/166", nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var quest map[string]any if err := json.NewDecoder(res.Body).Decode(&quest); err != nil { panic(err) } fmt.Println(quest["name"]) } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/166")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/166"); using var doc = JsonDocument.Parse(json); Console.WriteLine(doc.RootElement.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let quest: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/quests/166") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .call()? .into_json()?; println!("{}", quest["name"].as_str().unwrap_or_default()); Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "quest", "id": 166, "key": "classic:quest:166", "version": "classic", "name": "La Confrérie défias", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_note_01.jpg", "level": 22, "required_level": 14, "side": "alliance", "side_name": "Alliance", "type": "dungeon", "type_name": "Donjon", "daily": false, "weekly": false, "repeatable": false, "category": { "type": "zone", "id": 1581, "name": "Les Mortemines" }, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" }, "xp": 2600, "money": null, "reward_items": [ { "item": { "object": "item", "id": 6087, "version": "classic", "name": "Haut-de-chausses de la marche de l'Ouest", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_pants_03.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:6087", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/6087" }, "choice": true }, { "item": { "object": "item", "id": 2041, "version": "classic", "name": "Tunique de la marche de l'Ouest", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_chest_leather_07.jpg", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:2041", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/2041" }, "choice": true }, { "item": { "object": "item", "id": 2042, "version": "classic", "name": "Bâton de la marche de l'Ouest", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_staff_10.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:2042", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/2042" }, "choice": true } ], "rogue": true, "internal": false, "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:166", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/166", "max_level": null, "players": null, "shareable": true, "time_limit_text": null, "races": null, "classes": null, "skill": null, "objectives": "Tuer Edwin VanCleef et apporter sa Tête à Gryan Roidemantel.", "description": "Il vous reste une dernière mission à accomplir. Il va falloir éliminer Edwin VanCleef. Bien que cela me chagrine de condamner un homme à mort, c'est pour le bien du peuple de la marche de l'Ouest que VanCleef doit mourir. Apportez-moi sa tête lorsque l'acte sera accompli.", "progress": "Alors, comment se passe cette chasse à l'homme pour Edwin VanCleef ?", "completion": ", votre bravoure est extraordinaire. La Milice du peuple vous remercie pour les services rendus au peuple de la marche de l'Ouest. VanCleef est mort, et sa mort marque le début de la chute de la Confrérie Défias. Nous pouvons espérer maintenant qu'un jour la paix revienne sur ce beau pays !\n\nJe vous salue, Seigneur !", "requirements": [ { "kind": "item", "name": "Tête de VanCleef", "quantity": 1, "record": { "object": "item", "id": 3637, "version": "classic", "name": "Tête de VanCleef", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_head_human_01.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:3637", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/3637" } } ], "rewards": { "items": [], "choices": [ { "item": { "object": "item", "id": 6087, "version": "classic", "name": "Haut-de-chausses de la marche de l'Ouest", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_pants_03.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:6087", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/6087" }, "name": "Haut-de-chausses de la marche de l'Ouest", "quantity": 1 }, { "item": { "object": "item", "id": 2041, "version": "classic", "name": "Tunique de la marche de l'Ouest", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_chest_leather_07.jpg", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:2041", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/2041" }, "name": "Tunique de la marche de l'Ouest", "quantity": 1 }, { "item": { "object": "item", "id": 2042, "version": "classic", "name": "Bâton de la marche de l'Ouest", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_staff_10.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:2042", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/2042" }, "name": "Bâton de la marche de l'Ouest", "quantity": 1 } ], "money": null, "money_max_level": 1560, "xp": 2600, "spell": null, "title": null, "honor": null, "arena": null, "talents": null, "reputation": [ { "faction": { "object": "faction", "id": 72, "version": "classic", "name": "Hurlevent", "url": "https://wowdb.assemblee-defias.fr/?id=classic:faction:72", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/factions/72" }, "name": "Hurlevent", "value": 500 } ] }, "starts": [ { "type": "npc", "name": "Maréchal Gryan Roidemantel", "record": { "object": "npc", "id": 234, "version": "classic", "name": "Maréchal Gryan Roidemantel", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:234", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/234" }, "zones": [ "Marche de l'Ouest" ], "instance": null } ], "ends": [ { "type": "npc", "name": "Maréchal Gryan Roidemantel", "record": { "object": "npc", "id": 234, "version": "classic", "name": "Maréchal Gryan Roidemantel", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:234", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/234" }, "zones": [ "Marche de l'Ouest" ], "instance": null } ], "chain": { "previous": [], "follows": [ { "object": "quest", "id": 155, "version": "classic", "name": "La Confrérie défias", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:155", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/155" } ], "next": [], "direct": [], "exclusive": [], "group": [], "opened_by": null }, "versions": [ { "object": "quest", "id": 166, "version": "classic", "name": "La Confrérie défias", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:166", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/166" }, { "object": "quest", "id": 166, "version": "tbc", "name": "La Confrérie défias", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:quest:166", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/quests/166" }, { "object": "quest", "id": 166, "version": "wotlk", "name": "La Confrérie défias", "url": "https://wowdb.assemblee-defias.fr/?id=wotlk:quest:166", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/wotlk/quests/166" } ], "guides": [] } ``` --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # PNJ > Les PNJ : boss et rencontres, butin, objets vendus, quêtes, réputation, emplacements sur les cartes. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/npcs ## PNJ Tous les PNJ du jeu : monstres, boss, marchands, donneurs de quêtes. Les PNJ techniques et les variantes de difficulté (« VanCleef (1) ») sont absents des listes. La fiche d’un boss donne sa **rencontre** (`encounter`) : son donjon, sa place dans l’ordre du jeu, le boss précédent et le suivant, et l’adresse de son butin par difficulté. **Routes** - `GET /v1/{version}/npcs` : Lister les PNJ - `GET /v1/{version}/npcs/{id}` : Obtenir un PNJ - `GET /v1/{version}/npcs/{id}/loot` : Lister le butin d’un PNJ - `GET /v1/{version}/npcs/{id}/sells` : Lister les objets vendus par un PNJ - `GET /v1/{version}/npcs/{id}/quests` : Lister les quêtes d’un PNJ - `GET /v1/{version}/npcs/{id}/locations` : Lister les emplacements d’un PNJ ## L’objet npc Un PNJ. `loot` et `sells` sont des listes incluses (les premiers éléments, puis leur adresse). - `object` (chaîne) : Type d’objet, toujours « npc ». Valeurs : `npc`. - `id` (entier) : 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` (chaîne) : Clé WoWDB, unique dans toute la base : « :: » (classic:npc:639). - `version` (code) : Version du jeu de cette fiche. Valeurs : `classic`, `tbc`, `wotlk`. - `name` (chaîne) : Nom français, comme en jeu. - `icon` (chaîne ou null) : Adresse absolue de l’icône du jeu (WebP, JPEG ou PNG), servie par WoWDB ; null si la fiche n’en a pas. - `subtitle` (chaîne ou null) : Sous-titre (« Caïd défias »). - `level_min` (entier ou null) : Niveau minimum ; null si inconnu (« ?? » des boss). - `level_max` (entier ou null) : Niveau maximum. - `type` (code ou null) : Type de créature. Valeurs : voir les codes (https://docs.wowdb.assemblee-defias.fr/filtres#codes). - `type_name` (chaîne ou null) : Type, libellé français. - `family` (code ou null) : Famille des bêtes et des démons. Valeurs : voir les codes (https://docs.wowdb.assemblee-defias.fr/filtres#codes). - `family_name` (chaîne ou null) : Famille, libellé français. - `rank` (code) : Rang : normal, élite, élite rare, boss, rare. Valeurs : `normal`, `elite`, `rare_elite`, `boss`, `rare`. - `rank_name` (chaîne) : Rang, libellé français. - `boss` (booléen) : Vrai pour un boss (rang boss). - `internal` (booléen) : PNJ technique ou variante de difficulté : absent des listes et de la recherche. - `url` (chaîne) : Adresse publique de la fiche sur WoWDB (page HTML, à donner à vos lecteurs). - `api_url` (chaîne) : Adresse de le PNJ dans l’API. Champs de la fiche seulement (`GET …/{id}`) : - `english_name` (chaîne ou null) : Nom anglais. - `faction` (objet ou null) : Faction du PNJ. - `name` (chaîne) : Nom de la faction. - `faction` (Ref ou null) : Réputation liée, quand elle a une fiche. - `base_npc` (Ref ou null) : PNJ de base, pour une variante de difficulté. - `zones` (tableau d’objets) : Lieux où il apparaît, du plus fréquent au plus rare. - `name` (chaîne ou null) : Nom de la zone ou du donjon. - `positions` (entier) : Nombre d’emplacements connus dans ce lieu. - `instance` (InstanceRef ou null) : Le donjon ou raid, quand le lieu en est un. - `encounter` (Encounter ou null) : Rencontre de boss : place du PNJ dans son donjon ou raid ; null hors des rencontres. - `loot` (liste) : Butin : les 10 premiers objets (Loot), puis /npcs/{id}/loot. - `sells` (liste) : Objets vendus : les 10 premiers (VendorItem), puis /npcs/{id}/sells. - `quests` (objet) : Quêtes qu’il donne et reprend. - `starts` (tableau de Ref) : Quêtes données. - `ends` (tableau de Ref) : Quêtes reprises. - `reputation` (tableau d’objets) : Réputation gagnée en le tuant. - `faction` (Ref ou null) : La réputation. - `name` (chaîne ou null) : Nom de la faction. - `value` (entier) : Points gagnés. - `until_rank_name` (chaîne ou null) : Jusqu’à quel rang. - `summoned_by` (tableau d’objets) : Objets qui l’invoquent (monture, compagnon). - `item` (ItemRef) : L’objet. - `type` (chaîne) : mount, companion ou other. - `locations_url` (chaîne) : Ses emplacements sur les cartes : /npcs/{id}/locations. - `versions` (tableau de Ref) : La même fiche dans chaque version du jeu où elle existe (elle comprise). - `guides` (tableau d’objets) : Guides de L’Assemblée des Défias qui citent cette fiche. - `title` (chaîne) : Titre du guide. - `url` (chaîne) : Adresse du guide sur assemblee-defias.fr. **Exemple : pnj** (statut 200) ```json { "object": "npc", "id": 639, "key": "classic:npc:639", "version": "classic", "name": "Edwin VanCleef", "icon": "https://wowdb.assemblee-defias.fr/database-icons/achievement_boss_edwinvancleef.webp", "subtitle": "Caïd défias", "level_min": 21, "level_max": 21, "type": "humanoid", "type_name": "Humanoïde", "family": null, "family_name": null, "rank": "rare_elite", "rank_name": "Élite rare", "boss": false, "internal": false, "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:639", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639", "english_name": "Edwin VanCleef", "faction": { "name": "Confrérie défias", "faction": null }, "base_npc": null, "zones": [ { "name": "Les Mortemines", "positions": 1, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } } ], "encounter": { "object": "encounter", "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" }, "position": 7, "total": 8, "game_order": true, "previous": { "name": "Capitaine Vertepeau", "npc": { "object": "npc", "id": 647, "version": "classic", "name": "Capitaine Vertepeau", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:647", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/647" } }, "next": { "name": "Mineur Johnson", "npc": { "object": "npc", "id": 3586, "version": "classic", "name": "Mineur Johnson", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:3586", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/3586" } }, "items": 4, "rogue_items": 3, "difficulties": [ { "difficulty": "normal", "difficulty_name": "Normal", "items": 4 } ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=639" }, "loot": { "object": "list", "data": [ { "object": "loot", "item": { "object": "item", "id": 5193, "version": "classic", "name": "Cape de la confrérie", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_cape_08.jpg", "item_level": 25, "slot_name": "Dos", "type_name": "Tissu", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:5193", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5193" }, "name": "Cape de la confrérie", "chance": 30, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 5202, "version": "classic", "name": "Casaque de corsaire", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_shirt_08.webp", "item_level": 24, "slot_name": "Torse", "type_name": "Tissu", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:5202", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5202" }, "name": "Casaque de corsaire", "chance": 30, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 10399, "version": "classic", "name": "Armure défias noircie", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_chest_leather_08.jpg", "item_level": 24, "slot_name": "Torse", "type_name": "Cuir", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:10399", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/10399" }, "name": "Armure défias noircie", "chance": 20, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 5191, "version": "classic", "name": "Barbelure cruelle", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_sword_24.jpg", "item_level": 24, "slot_name": "À une main", "type_name": "Épée", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:5191", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191" }, "name": "Barbelure cruelle", "chance": 20, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 12985, "version": "classic", "name": "Anneau de défense", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_jewelry_ring_28.jpg", "item_level": 22, "slot_name": "Doigt", "type_name": null, "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:12985", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/12985" }, "name": "Anneau de défense", "chance": 0.01, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 12996, "version": "classic", "name": "Bague de purification", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_jewelry_ring_31.jpg", "item_level": 23, "slot_name": "Doigt", "type_name": null, "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:12996", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/12996" }, "name": "Bague de purification", "chance": 0.01, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 2879, "version": "classic", "name": "Bâtonnet des antipodes", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_wand_04.webp", "item_level": 22, "slot_name": "Tenu(e) en main gauche", "type_name": null, "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:2879", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/2879" }, "name": "Bâtonnet des antipodes", "chance": 0.01, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 12987, "version": "classic", "name": "Braies des ombres", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_pants_06.jpg", "item_level": 22, "slot_name": "Jambes", "type_name": "Tissu", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:12987", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/12987" }, "name": "Braies des ombres", "chance": 0.01, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 12979, "version": "classic", "name": "Cape coupe-feu", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_cape_08.jpg", "item_level": 21, "slot_name": "Dos", "type_name": "Tissu", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:12979", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/12979" }, "name": "Cape coupe-feu", "chance": 0.01, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 12978, "version": "classic", "name": "Ceinture porte-tempête", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_belt_15.jpg", "item_level": 20, "slot_name": "Taille", "type_name": "Mailles", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:12978", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/12978" }, "name": "Ceinture porte-tempête", "chance": 0.01, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } } ], "has_more": true, "next_cursor": "eyJvIjoxMCwiaCI6InZLczczWkcwNW4ifQ", "url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/loot" }, "sells": { "object": "list", "data": [], "has_more": false, "next_cursor": null, "url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/sells" }, "quests": { "starts": [], "ends": [] }, "reputation": [], "summoned_by": [], "locations_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/locations", "versions": [ { "object": "npc", "id": 639, "version": "classic", "name": "Edwin VanCleef", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:639", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639" }, { "object": "npc", "id": 639, "version": "tbc", "name": "Edwin VanCleef", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:npc:639", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/npcs/639" }, { "object": "npc", "id": 639, "version": "wotlk", "name": "Edwin VanCleef", "url": "https://wowdb.assemblee-defias.fr/?id=wotlk:npc:639", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/wotlk/npcs/639" } ], "guides": [] } ``` ## L’objet loot Une ligne de butin d’un PNJ ou d’un objet du monde. - `object` (chaîne) : Toujours « loot ». Valeurs : `loot`. - `item` (ItemRef ou null) : L’objet (avec niveau, emplacement et type). - `name` (chaîne) : Nom de l’objet. - `chance` (nombre ou null) : Chance de butin en pour cent (la plus haute des difficultés). - `difficulties` (tableau de codes) : Difficultés où il tombe. Valeurs : `normal`, `heroic`, `10_player`, `25_player`, `10_player_heroic`, `25_player_heroic`. - `quest_item` (booléen) : Objet de quête (ne tombe que pour qui a la quête). - `instance` (InstanceRef ou null) : Donjon où il tombe. ## L’objet map Les emplacements d’un PNJ ou d’un objet du monde, groupés par fond de carte du jeu. Les coordonnées sont en pour cent de l’image, comme en jeu : placez un point à `left: x%` et `top: y%` sur l’`image`. - `object` (chaîne) : Toujours « map ». Valeurs : `map`. - `name` (chaîne ou null) : Nom de la zone ou de l’étage. - `floor` (entier ou null) : Étage du donjon ; null pour une zone. - `instance` (InstanceRef ou null) : Donjon de l’étage. - `image` (chaîne ou null) : Fond de carte du jeu (WebP), servi par WoWDB. - `width` (entier) : Largeur de référence du fond, en pixels. - `height` (entier) : Hauteur de référence. - `points` (tableau d’objets) : Emplacements, en pour cent de la largeur et de la hauteur (0 à 100), comme les coordonnées du jeu. - `x` (nombre) : Abscisse (0 à gauche). - `y` (nombre) : Ordonnée (0 en haut). ## Lister les PNJ `GET /v1/{version}/npcs` Tous les PNJ d’une version (PNJ techniques et variantes de difficulté exclus). **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `q` (chaîne, facultatif) : 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. - `type` (codes séparés par des virgules, facultatif) : Types de créature. Plusieurs valeurs séparées par des virgules. Valeurs : `humanoid`, `beast`, `demon`, `dragonkin`, `elemental`, `giant`, `undead`, `mechanical`, `critter`, `totem`, `non_combat_pet`, `gas_cloud`, `not_specified`, `none`. - `rank` (codes séparés par des virgules, facultatif) : Rangs. Plusieurs valeurs séparées par des virgules. Valeurs : `normal`, `elite`, `rare_elite`, `boss`, `rare`. - `family` (codes séparés par des virgules, facultatif) : Familles de bêtes et de démons. Plusieurs valeurs séparées par des virgules. Valeurs : voir https://docs.wowdb.assemblee-defias.fr/filtres#codes. - `min_level` (entier, facultatif) : Niveau (le plus haut) minimum (1 à 100). - `max_level` (entier, facultatif) : Niveau (le plus haut) maximum (1 à 100). - `sort` (chaîne, facultatif) : 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. Valeurs : `name`, `-name`, `level`, `-level`. - `limit` (entier, facultatif) : Nombre d’éléments par page, de 1 à 100 (20 par défaut). - `cursor` (chaîne, facultatif) : Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres. - `include_total` (booléen, facultatif) : true : ajoute total_count, le nombre total d’éléments avec ces filtres. **Renvoie** : Une liste (`object: "list"`) d’objets `npc`, paginée par curseur. **Requête (GET /v1/{version}/npcs)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/classic/npcs \ -d q=vancleef \ -d limit=2 ``` #### JavaScript ```js const params = new URLSearchParams({ q: "vancleef", limit: "2", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/classic/npcs?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const npc of page.data) { console.log(npc.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "q": "vancleef", "limit": "2", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/classic/npcs?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for npc in page["data"]: print(npc["name"]) ``` #### PHP ```php 'vancleef', 'limit' => '2', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/npcs?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $npc) { echo $npc['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/npcs") uri.query = URI.encode_www_form( q: "vancleef", limit: "2", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |npc| puts npc["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("q", "vancleef") params.Set("limit", "2") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, npc := range page.Data { fmt.Println(npc["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs?q=vancleef&limit=2")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs?q=vancleef&limit=2"); using var doc = JsonDocument.Parse(json); foreach (var npc in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(npc.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/npcs") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("q", "vancleef") .query("limit", "2") .call()? .into_json()?; for npc in page["data"].as_array().into_iter().flatten() { println!("{}", npc["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "npc", "id": 639, "key": "classic:npc:639", "version": "classic", "name": "Edwin VanCleef", "icon": "https://wowdb.assemblee-defias.fr/database-icons/achievement_boss_edwinvancleef.webp", "subtitle": "Caïd défias", "level_min": 21, "level_max": 21, "type": "humanoid", "type_name": "Humanoïde", "family": null, "family_name": null, "rank": "rare_elite", "rank_name": "Élite rare", "boss": false, "internal": false, "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:639", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639" } ], "has_more": false, "next_cursor": null, "url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs?q=vancleef" } ``` ## Obtenir un PNJ `GET /v1/{version}/npcs/{id}` La fiche complète du PNJ : les champs de la liste, plus ceux marqués « fiche seulement ». **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `id` (entier, dans le chemin, obligatoire) : Identifiant du jeu du PNJ. **Renvoie** : La fiche complète, objet `npc` (champs du résumé et champs « fiche seulement »), ou une erreur 404. **Requête (GET /v1/{version}/npcs/{id})** #### cURL ```bash curl https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639 ``` #### JavaScript ```js const res = await fetch("https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639"); if (!res.ok) throw new Error((await res.json()).error.message); const npc = await res.json(); console.log(npc.name); ``` #### Python ```python import json import urllib.request req = urllib.request.Request( "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: npc = json.load(res) print(npc["name"]) ``` #### PHP ```php ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639', false, $context); $npc = json_decode($json, true); echo $npc['name'], PHP_EOL; ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639") res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) npc = JSON.parse(res.body) puts npc["name"] ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" ) func main() { req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639", nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var npc map[string]any if err := json.NewDecoder(res.Body).Decode(&npc); err != nil { panic(err) } fmt.Println(npc["name"]) } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639"); using var doc = JsonDocument.Parse(json); Console.WriteLine(doc.RootElement.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let npc: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .call()? .into_json()?; println!("{}", npc["name"].as_str().unwrap_or_default()); Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "npc", "id": 639, "key": "classic:npc:639", "version": "classic", "name": "Edwin VanCleef", "icon": "https://wowdb.assemblee-defias.fr/database-icons/achievement_boss_edwinvancleef.webp", "subtitle": "Caïd défias", "level_min": 21, "level_max": 21, "type": "humanoid", "type_name": "Humanoïde", "family": null, "family_name": null, "rank": "rare_elite", "rank_name": "Élite rare", "boss": false, "internal": false, "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:639", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639", "english_name": "Edwin VanCleef", "faction": { "name": "Confrérie défias", "faction": null }, "base_npc": null, "zones": [ { "name": "Les Mortemines", "positions": 1, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } } ], "encounter": { "object": "encounter", "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" }, "position": 7, "total": 8, "game_order": true, "previous": { "name": "Capitaine Vertepeau", "npc": { "object": "npc", "id": 647, "version": "classic", "name": "Capitaine Vertepeau", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:647", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/647" } }, "next": { "name": "Mineur Johnson", "npc": { "object": "npc", "id": 3586, "version": "classic", "name": "Mineur Johnson", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:3586", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/3586" } }, "items": 4, "rogue_items": 3, "difficulties": [ { "difficulty": "normal", "difficulty_name": "Normal", "items": 4 } ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=639" }, "loot": { "object": "list", "data": [ { "object": "loot", "item": { "object": "item", "id": 5193, "version": "classic", "name": "Cape de la confrérie", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_cape_08.jpg", "item_level": 25, "slot_name": "Dos", "type_name": "Tissu", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:5193", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5193" }, "name": "Cape de la confrérie", "chance": 30, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 5202, "version": "classic", "name": "Casaque de corsaire", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_shirt_08.webp", "item_level": 24, "slot_name": "Torse", "type_name": "Tissu", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:5202", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5202" }, "name": "Casaque de corsaire", "chance": 30, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 10399, "version": "classic", "name": "Armure défias noircie", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_chest_leather_08.jpg", "item_level": 24, "slot_name": "Torse", "type_name": "Cuir", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:10399", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/10399" }, "name": "Armure défias noircie", "chance": 20, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 5191, "version": "classic", "name": "Barbelure cruelle", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_sword_24.jpg", "item_level": 24, "slot_name": "À une main", "type_name": "Épée", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:5191", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5191" }, "name": "Barbelure cruelle", "chance": 20, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 12985, "version": "classic", "name": "Anneau de défense", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_jewelry_ring_28.jpg", "item_level": 22, "slot_name": "Doigt", "type_name": null, "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:12985", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/12985" }, "name": "Anneau de défense", "chance": 0.01, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 12996, "version": "classic", "name": "Bague de purification", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_jewelry_ring_31.jpg", "item_level": 23, "slot_name": "Doigt", "type_name": null, "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:12996", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/12996" }, "name": "Bague de purification", "chance": 0.01, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 2879, "version": "classic", "name": "Bâtonnet des antipodes", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_wand_04.webp", "item_level": 22, "slot_name": "Tenu(e) en main gauche", "type_name": null, "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:2879", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/2879" }, "name": "Bâtonnet des antipodes", "chance": 0.01, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 12987, "version": "classic", "name": "Braies des ombres", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_pants_06.jpg", "item_level": 22, "slot_name": "Jambes", "type_name": "Tissu", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:12987", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/12987" }, "name": "Braies des ombres", "chance": 0.01, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 12979, "version": "classic", "name": "Cape coupe-feu", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_cape_08.jpg", "item_level": 21, "slot_name": "Dos", "type_name": "Tissu", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:12979", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/12979" }, "name": "Cape coupe-feu", "chance": 0.01, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 12978, "version": "classic", "name": "Ceinture porte-tempête", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_belt_15.jpg", "item_level": 20, "slot_name": "Taille", "type_name": "Mailles", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:12978", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/12978" }, "name": "Ceinture porte-tempête", "chance": 0.01, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } } ], "has_more": true, "next_cursor": "eyJvIjoxMCwiaCI6InZLczczWkcwNW4ifQ", "url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/loot" }, "sells": { "object": "list", "data": [], "has_more": false, "next_cursor": null, "url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/sells" }, "quests": { "starts": [], "ends": [] }, "reputation": [], "summoned_by": [], "locations_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/locations", "versions": [ { "object": "npc", "id": 639, "version": "classic", "name": "Edwin VanCleef", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:639", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639" }, { "object": "npc", "id": 639, "version": "tbc", "name": "Edwin VanCleef", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:npc:639", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/npcs/639" }, { "object": "npc", "id": 639, "version": "wotlk", "name": "Edwin VanCleef", "url": "https://wowdb.assemblee-defias.fr/?id=wotlk:npc:639", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/wotlk/npcs/639" } ], "guides": [] } ``` ## Lister le butin d’un PNJ `GET /v1/{version}/npcs/{id}/loot` Tout le butin du PNJ, une ligne par objet (difficultés réunies), la meilleure qualité puis la meilleure chance d’abord. **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `id` (entier, dans le chemin, obligatoire) : Identifiant du jeu du PNJ. - `limit` (entier, facultatif) : Nombre d’éléments par page, de 1 à 100 (20 par défaut). - `cursor` (chaîne, facultatif) : Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres. - `include_total` (booléen, facultatif) : true : ajoute total_count, le nombre total d’éléments avec ces filtres. **Renvoie** : Une liste (`object: "list"`) d’objets `loot`, paginée par curseur. **Requête (GET /v1/{version}/npcs/{id}/loot)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/loot \ -d limit=2 ``` #### JavaScript ```js const params = new URLSearchParams({ limit: "2", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/loot?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const loot of page.data) { console.log(loot.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "limit": "2", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/loot?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for loot in page["data"]: print(loot["name"]) ``` #### PHP ```php '2', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/loot?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $loot) { echo $loot['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/loot") uri.query = URI.encode_www_form( limit: "2", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |loot| puts loot["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("limit", "2") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/loot?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, loot := range page.Data { fmt.Println(loot["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/loot?limit=2")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/loot?limit=2"); using var doc = JsonDocument.Parse(json); foreach (var loot in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(loot.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/loot") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("limit", "2") .call()? .into_json()?; for loot in page["data"].as_array().into_iter().flatten() { println!("{}", loot["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "loot", "item": { "object": "item", "id": 5193, "version": "classic", "name": "Cape de la confrérie", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_cape_08.jpg", "item_level": 25, "slot_name": "Dos", "type_name": "Tissu", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:5193", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5193" }, "name": "Cape de la confrérie", "chance": 30, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } }, { "object": "loot", "item": { "object": "item", "id": 5202, "version": "classic", "name": "Casaque de corsaire", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_shirt_08.webp", "item_level": 24, "slot_name": "Torse", "type_name": "Tissu", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:5202", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5202" }, "name": "Casaque de corsaire", "chance": 30, "difficulties": [ "normal" ], "quest_item": false, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" } } ], "has_more": true, "next_cursor": "eyJvIjoyLCJoIjoidktzNzNaRzA1biJ9", "url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/loot" } ``` ## Lister les objets vendus par un PNJ `GET /v1/{version}/npcs/{id}/sells` Les objets qu’un marchand vend, par nom. Exemple : **Gerald Crawley**, fournisseur en poisons de la Horde. **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `id` (entier, dans le chemin, obligatoire) : Identifiant du jeu du PNJ. - `limit` (entier, facultatif) : Nombre d’éléments par page, de 1 à 100 (20 par défaut). - `cursor` (chaîne, facultatif) : Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres. - `include_total` (booléen, facultatif) : true : ajoute total_count, le nombre total d’éléments avec ces filtres. **Renvoie** : Une liste (`object: "list"`) d’objets `vendor_item`, paginée par curseur. **Requête (GET /v1/{version}/npcs/{id}/sells)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/3090/sells \ -d limit=2 ``` #### JavaScript ```js const params = new URLSearchParams({ limit: "2", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/3090/sells?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const entry of page.data) { console.log(entry.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "limit": "2", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/3090/sells?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for entry in page["data"]: print(entry["name"]) ``` #### PHP ```php '2', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/3090/sells?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $entry) { echo $entry['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/3090/sells") uri.query = URI.encode_www_form( limit: "2", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |entry| puts entry["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("limit", "2") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/3090/sells?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, entry := range page.Data { fmt.Println(entry["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/3090/sells?limit=2")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/3090/sells?limit=2"); using var doc = JsonDocument.Parse(json); foreach (var entry in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(entry.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/3090/sells") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("limit", "2") .call()? .into_json()?; for entry in page["data"].as_array().into_iter().flatten() { println!("{}", entry["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "vendor_item", "item": { "object": "item", "id": 8923, "version": "classic", "name": "Essence d'agonie", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_potion_19.jpg", "slot_name": null, "type_name": "Artisanat", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:8923", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/8923" }, "name": "Essence d'agonie" }, { "object": "vendor_item", "item": { "object": "item", "id": 2930, "version": "classic", "name": "Essence de douleur", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_potion_12.jpg", "slot_name": null, "type_name": "Artisanat", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:2930", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/2930" }, "name": "Essence de douleur" } ], "has_more": true, "next_cursor": "eyJvIjoyLCJoIjoiSEk5VVplcjI0UyJ9", "url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/3090/sells" } ``` ## Lister les quêtes d’un PNJ `GET /v1/{version}/npcs/{id}/quests` Les quêtes que le PNJ donne (starts) et reprend (ends), par niveau. **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `id` (entier, dans le chemin, obligatoire) : Identifiant du jeu du PNJ. - `role` (codes séparés par des virgules, facultatif) : starts, ends ou les deux (par défaut). Valeurs : `starts`, `ends`. - `limit` (entier, facultatif) : Nombre d’éléments par page, de 1 à 100 (20 par défaut). - `cursor` (chaîne, facultatif) : Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres. - `include_total` (booléen, facultatif) : true : ajoute total_count, le nombre total d’éléments avec ces filtres. **Renvoie** : Une liste (`object: "list"`) d’objets `npc_quest`, paginée par curseur. **Requête (GET /v1/{version}/npcs/{id}/quests)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/234/quests \ -d role=starts \ -d limit=2 ``` #### JavaScript ```js const params = new URLSearchParams({ role: "starts", limit: "2", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/234/quests?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const entry of page.data) { console.log(entry.quest.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "role": "starts", "limit": "2", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/234/quests?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for entry in page["data"]: print(entry["quest"]["name"]) ``` #### PHP ```php 'starts', 'limit' => '2', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/234/quests?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $entry) { echo $entry['quest']['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/234/quests") uri.query = URI.encode_www_form( role: "starts", limit: "2", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |entry| puts entry["quest"]["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("role", "starts") params.Set("limit", "2") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/234/quests?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, entry := range page.Data { fmt.Println(entry["quest"].(map[string]any)["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/234/quests?role=starts&limit=2")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/234/quests?role=starts&limit=2"); using var doc = JsonDocument.Parse(json); foreach (var entry in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(entry.GetProperty("quest").GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/234/quests") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("role", "starts") .query("limit", "2") .call()? .into_json()?; for entry in page["data"].as_array().into_iter().flatten() { println!("{}", entry["quest"]["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "npc_quest", "role": "starts", "quest": { "object": "quest", "id": 12, "version": "classic", "name": "Brigade de la marche de l'Ouest", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:12", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/12" }, "level": 12 }, { "object": "npc_quest", "role": "starts", "quest": { "object": "quest", "id": 13, "version": "classic", "name": "Brigade de la marche de l'Ouest", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:13", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/13" }, "level": 14 } ], "has_more": true, "next_cursor": "eyJvIjoyLCJoIjoiSGxPUEQ5SElyQyJ9", "url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/234/quests?role=starts" } ``` ## Lister les emplacements d’un PNJ `GET /v1/{version}/npcs/{id}/locations` Ses emplacements, groupés par fond de carte du jeu (zone ou étage de donjon), en pour cent de la carte. **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `id` (entier, dans le chemin, obligatoire) : Identifiant du jeu du PNJ. - `limit` (entier, facultatif) : Nombre d’éléments par page, de 1 à 100 (20 par défaut). - `cursor` (chaîne, facultatif) : Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres. - `include_total` (booléen, facultatif) : true : ajoute total_count, le nombre total d’éléments avec ces filtres. **Renvoie** : Une liste (`object: "list"`) d’objets `map`, paginée par curseur. **Requête (GET /v1/{version}/npcs/{id}/locations)** #### cURL ```bash curl https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/locations ``` #### JavaScript ```js const res = await fetch("https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/locations"); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const map of page.data) { console.log(map.name); } ``` #### Python ```python import json import urllib.request req = urllib.request.Request( "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/locations", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for map in page["data"]: print(map["name"]) ``` #### PHP ```php ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/locations', false, $context); $page = json_decode($json, true); foreach ($page['data'] as $map) { echo $map['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/locations") res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |map| puts map["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" ) func main() { req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/locations", nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, map := range page.Data { fmt.Println(map["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/locations")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/locations"); using var doc = JsonDocument.Parse(json); foreach (var map in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(map.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/locations") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .call()? .into_json()?; for map in page["data"].as_array().into_iter().flatten() { println!("{}", map["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "map", "name": "Les Mortemines", "floor": 2, "instance": { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" }, "image": "https://wowdb.assemblee-defias.fr/cartes/classic/36/2.webp", "width": 1002, "height": 668, "points": [ { "x": 60.6, "y": 45.9 } ] } ], "has_more": false, "next_cursor": null, "url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639/locations" } ``` --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Objets du monde > Coffres, coffres verrouillés, objets de quête, gisements et herbes, avec la compétence requise, le butin et les cartes. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/game-objects ## Objets du monde Les objets posés dans le monde : coffres, coffres verrouillés, objets de quête, gisements de minerai et herbes. Pour le voleur : `rogue=true` garde ceux qui demandent du **Crochetage**, et `skill.level` donne le niveau requis. Exemple : la **Cantine écarlate** (`179498` en TBC), Crochetage 250, dans les Maleterres de l’est. **Routes** - `GET /v1/{version}/game-objects` : Lister les objets du monde - `GET /v1/{version}/game-objects/{id}` : Obtenir un objet du monde - `GET /v1/{version}/game-objects/{id}/loot` : Lister le butin d’un objet du monde - `GET /v1/{version}/game-objects/{id}/locations` : Lister les emplacements d’un objet du monde ## L’objet game_object Un objet du monde. - `object` (chaîne) : Type d’objet, toujours « game_object ». Valeurs : `game_object`. - `id` (entier) : 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` (chaîne) : Clé WoWDB, unique dans toute la base : « :: » (tbc:object:179498). - `version` (code) : Version du jeu de cette fiche. Valeurs : `classic`, `tbc`, `wotlk`. - `name` (chaîne) : Nom français, comme en jeu. - `icon` (chaîne ou null) : Adresse absolue de l’icône du jeu (WebP, JPEG ou PNG), servie par WoWDB ; null si la fiche n’en a pas. - `type` (code ou null) : Type : coffre, coffre verrouillé, objet de quête, gisement de minerai, herbe. Valeurs : `chest`, `locked_chest`, `quest_object`, `ore`, `herb`. - `type_name` (chaîne ou null) : Type, libellé français. - `skill` (objet ou null) : Compétence requise pour l’ouvrir ou le récolter. - `skill` (code) : Compétence. Valeurs : `lockpicking`, `mining`, `herbalism`. - `name` (chaîne) : Compétence, libellé français. - `level` (entier) : Niveau requis (Crochetage 250). - `zone` (chaîne ou null) : Lieu principal (le plus d’emplacements). - `positions` (entier) : Nombre d’emplacements possibles. - `rogue` (booléen) : Utile au voleur : demande du Crochetage. - `internal` (booléen) : Objet interne du jeu. - `url` (chaîne) : Adresse publique de la fiche sur WoWDB (page HTML, à donner à vos lecteurs). - `api_url` (chaîne) : Adresse de l’objet du monde dans l’API. Champs de la fiche seulement (`GET …/{id}`) : - `english_name` (chaîne ou null) : Nom anglais. - `keys` (tableau de ItemRef) : Clés qui l’ouvrent. - `loot` (tableau de Loot) : Butin, de la meilleure chance à la plus faible. - `zones` (tableau d’objets) : Lieux où il apparaît, du plus fréquent au plus rare. - `name` (chaîne ou null) : Nom de la zone ou du donjon. - `positions` (entier) : Nombre d’emplacements connus dans ce lieu. - `instance` (InstanceRef ou null) : Le donjon ou raid, quand le lieu en est un. - `locations_url` (chaîne) : Ses emplacements sur les cartes : /game-objects/{id}/locations. - `versions` (tableau de Ref) : La même fiche dans chaque version du jeu où elle existe (elle comprise). - `guides` (tableau d’objets) : Guides de L’Assemblée des Défias qui citent cette fiche. - `title` (chaîne) : Titre du guide. - `url` (chaîne) : Adresse du guide sur assemblee-defias.fr. **Exemple : objet du monde** (statut 200) ```json { "object": "game_object", "id": 179498, "key": "tbc:object:179498", "version": "tbc", "name": "Cantine écarlate", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_box_04.jpg", "type": "locked_chest", "type_name": "Coffre verrouillé", "skill": { "skill": "lockpicking", "name": "Crochetage", "level": 250 }, "zone": "Maleterres de l'est", "positions": 10, "rogue": true, "internal": false, "url": "https://wowdb.assemblee-defias.fr/?id=tbc:object:179498", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498", "english_name": "Scarlet Footlocker", "keys": [], "loot": [ { "object": "loot", "item": { "object": "item", "id": 8766, "version": "tbc", "name": "Soupe de rosée matinale", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_potion_01.jpg", "item_level": 55, "slot_name": null, "type_name": "Consommable", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:8766", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/8766" }, "name": "Soupe de rosée matinale", "chance": 6.3, "difficulties": [], "quest_item": false, "instance": null }, { "object": "loot", "item": { "object": "item", "id": 8953, "version": "tbc", "name": "Bananes frites", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_food_23.webp", "item_level": 55, "slot_name": null, "type_name": "Consommable", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:8953", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/8953" }, "name": "Bananes frites", "chance": 3.9, "difficulties": [], "quest_item": false, "instance": null }, { "object": "loot", "item": { "object": "item", "id": 8950, "version": "tbc", "name": "Tarte aux cerises maison", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_food_10.webp", "item_level": 55, "slot_name": null, "type_name": "Consommable", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:8950", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/8950" }, "name": "Tarte aux cerises maison", "chance": 3, "difficulties": [], "quest_item": false, "instance": null }, { "object": "loot", "item": { "object": "item", "id": 8948, "version": "tbc", "name": "Cèpe des rois séché", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_mushroom_05.webp", "item_level": 55, "slot_name": null, "type_name": "Consommable", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:8948", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/8948" }, "name": "Cèpe des rois séché", "chance": 2.7, "difficulties": [], "quest_item": false, "instance": null }, { "object": "loot", "item": { "object": "item", "id": 8932, "version": "tbc", "name": "Emmental d'Alterac", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_food_37.webp", "item_level": 55, "slot_name": null, "type_name": "Consommable", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:8932", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/8932" }, "name": "Emmental d'Alterac", "chance": 2.4, "difficulties": [], "quest_item": false, "instance": null }, { "object": "loot", "item": { "object": "item", "id": 3928, "version": "tbc", "name": "Potion de soins excellente", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_potion_53.webp", "item_level": 45, "slot_name": null, "type_name": "Consommable", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:3928", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/3928" }, "name": "Potion de soins excellente", "chance": 2.4, "difficulties": [], "quest_item": false, "instance": null }, { "object": "loot", "item": { "object": "item", "id": 8952, "version": "tbc", "name": "Poulet rôti", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_food_15.webp", "item_level": 55, "slot_name": null, "type_name": "Consommable", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:8952", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/8952" }, "name": "Poulet rôti", "chance": 2.1, "difficulties": [], "quest_item": false, "instance": null }, { "object": "loot", "item": { "object": "item", "id": 7910, "version": "tbc", "name": "Rubis étoilé", "quality": "uncommon", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_gem_ruby_02.jpg", "item_level": 50, "slot_name": null, "type_name": "Gemme", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:7910", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/7910" }, "name": "Rubis étoilé", "chance": 0.6, "difficulties": [], "quest_item": false, "instance": null } ], "zones": [ { "name": "Maleterres de l'est", "positions": 10, "instance": null } ], "locations_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/locations", "versions": [ { "object": "game_object", "id": 179498, "version": "classic", "name": "Cantine écarlate", "url": "https://wowdb.assemblee-defias.fr/?id=classic:object:179498", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/game-objects/179498" }, { "object": "game_object", "id": 179498, "version": "tbc", "name": "Cantine écarlate", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:object:179498", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498" }, { "object": "game_object", "id": 179498, "version": "wotlk", "name": "Cantine écarlate", "url": "https://wowdb.assemblee-defias.fr/?id=wotlk:object:179498", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/wotlk/game-objects/179498" } ], "guides": [ { "title": "Crochetage", "url": "https://assemblee-defias.fr/crochetage.html" } ] } ``` ## Lister les objets du monde `GET /v1/{version}/game-objects` Coffres, coffres verrouillés, objets de quête, gisements et herbes d’une version. rogue=true : ceux qui demandent du Crochetage. **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `q` (chaîne, facultatif) : 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. - `type` (codes séparés par des virgules, facultatif) : Types d’objet du monde. Plusieurs valeurs séparées par des virgules. Valeurs : `chest`, `locked_chest`, `quest_object`, `ore`, `herb`. - `skill` (codes séparés par des virgules, facultatif) : Compétences requises. Plusieurs valeurs séparées par des virgules. Valeurs : `lockpicking`, `mining`, `herbalism`. - `min_skill` (entier, facultatif) : Niveau de compétence minimum (0 à 450). - `max_skill` (entier, facultatif) : Niveau de compétence maximum. - `rogue` (booléen, facultatif) : true : seulement les coffres à crocheter utiles au voleur ; false : seulement les autres. Absent : tout (par défaut). - `sort` (chaîne, facultatif) : 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. Valeurs : `name`, `-name`, `skill`, `-skill`. - `limit` (entier, facultatif) : Nombre d’éléments par page, de 1 à 100 (20 par défaut). - `cursor` (chaîne, facultatif) : Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres. - `include_total` (booléen, facultatif) : true : ajoute total_count, le nombre total d’éléments avec ces filtres. **Renvoie** : Une liste (`object: "list"`) d’objets `game_object`, paginée par curseur. **Requête (GET /v1/{version}/game-objects)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects \ -d type=locked_chest \ -d rogue=true \ -d min_skill=250 \ -d sort=skill \ -d limit=2 ``` #### JavaScript ```js const params = new URLSearchParams({ type: "locked_chest", rogue: "true", min_skill: "250", sort: "skill", limit: "2", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const gameObject of page.data) { console.log(gameObject.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "type": "locked_chest", "rogue": "true", "min_skill": "250", "sort": "skill", "limit": "2", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for game_object in page["data"]: print(game_object["name"]) ``` #### PHP ```php 'locked_chest', 'rogue' => 'true', 'min_skill' => '250', 'sort' => 'skill', 'limit' => '2', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $gameObject) { echo $gameObject['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects") uri.query = URI.encode_www_form( type: "locked_chest", rogue: "true", min_skill: "250", sort: "skill", limit: "2", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |game_object| puts game_object["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("type", "locked_chest") params.Set("rogue", "true") params.Set("min_skill", "250") params.Set("sort", "skill") params.Set("limit", "2") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, gameObject := range page.Data { fmt.Println(gameObject["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects?type=locked_chest&rogue=true&min_skill=250&sort=skill&limit=2")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects?type=locked_chest&rogue=true&min_skill=250&sort=skill&limit=2"); using var doc = JsonDocument.Parse(json); foreach (var gameObject in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(gameObject.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("type", "locked_chest") .query("rogue", "true") .query("min_skill", "250") .query("sort", "skill") .query("limit", "2") .call()? .into_json()?; for game_object in page["data"].as_array().into_iter().flatten() { println!("{}", game_object["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "game_object", "id": 179498, "key": "tbc:object:179498", "version": "tbc", "name": "Cantine écarlate", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_box_04.jpg", "type": "locked_chest", "type_name": "Coffre verrouillé", "skill": { "skill": "lockpicking", "name": "Crochetage", "level": 250 }, "zone": "Maleterres de l'est", "positions": 10, "rogue": true, "internal": false, "url": "https://wowdb.assemblee-defias.fr/?id=tbc:object:179498", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498" }, { "object": "game_object", "id": 153469, "key": "tbc:object:153469", "version": "tbc", "name": "Grand coffre cerclé de mithril", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_box_04.jpg", "type": "locked_chest", "type_name": "Coffre verrouillé", "skill": { "skill": "lockpicking", "name": "Crochetage", "level": 275 }, "zone": "Pic Rochenoire", "positions": 36, "rogue": true, "internal": false, "url": "https://wowdb.assemblee-defias.fr/?id=tbc:object:153469", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/153469" } ], "has_more": true, "next_cursor": "eyJrIjpbMjc1LCJncmFuZCBjb2ZmcmUgY2VyY2xlIGRlIG1pdGhyaWwiLCJ0YmM6b2JqZWN0OjE1MzQ2OSJdLCJoIjoic1RJS2s4YUVPayJ9", "url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects?min_skill=250&rogue=true&sort=skill&type=locked_chest" } ``` ## Obtenir un objet du monde `GET /v1/{version}/game-objects/{id}` La fiche complète de l’objet du monde : les champs de la liste, plus ceux marqués « fiche seulement ». **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `id` (entier, dans le chemin, obligatoire) : Identifiant du jeu de l’objet du monde. **Renvoie** : La fiche complète, objet `game_object` (champs du résumé et champs « fiche seulement »), ou une erreur 404. **Requête (GET /v1/{version}/game-objects/{id})** #### cURL ```bash curl https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498 ``` #### JavaScript ```js const res = await fetch("https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498"); if (!res.ok) throw new Error((await res.json()).error.message); const gameObject = await res.json(); console.log(gameObject.name); ``` #### Python ```python import json import urllib.request req = urllib.request.Request( "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: game_object = json.load(res) print(game_object["name"]) ``` #### PHP ```php ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498', false, $context); $gameObject = json_decode($json, true); echo $gameObject['name'], PHP_EOL; ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498") res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) game_object = JSON.parse(res.body) puts game_object["name"] ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" ) func main() { req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498", nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var gameObject map[string]any if err := json.NewDecoder(res.Body).Decode(&gameObject); err != nil { panic(err) } fmt.Println(gameObject["name"]) } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498"); using var doc = JsonDocument.Parse(json); Console.WriteLine(doc.RootElement.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let game_object: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .call()? .into_json()?; println!("{}", game_object["name"].as_str().unwrap_or_default()); Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "game_object", "id": 179498, "key": "tbc:object:179498", "version": "tbc", "name": "Cantine écarlate", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_box_04.jpg", "type": "locked_chest", "type_name": "Coffre verrouillé", "skill": { "skill": "lockpicking", "name": "Crochetage", "level": 250 }, "zone": "Maleterres de l'est", "positions": 10, "rogue": true, "internal": false, "url": "https://wowdb.assemblee-defias.fr/?id=tbc:object:179498", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498", "english_name": "Scarlet Footlocker", "keys": [], "loot": [ { "object": "loot", "item": { "object": "item", "id": 8766, "version": "tbc", "name": "Soupe de rosée matinale", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_potion_01.jpg", "item_level": 55, "slot_name": null, "type_name": "Consommable", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:8766", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/8766" }, "name": "Soupe de rosée matinale", "chance": 6.3, "difficulties": [], "quest_item": false, "instance": null }, { "object": "loot", "item": { "object": "item", "id": 8953, "version": "tbc", "name": "Bananes frites", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_food_23.webp", "item_level": 55, "slot_name": null, "type_name": "Consommable", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:8953", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/8953" }, "name": "Bananes frites", "chance": 3.9, "difficulties": [], "quest_item": false, "instance": null }, { "object": "loot", "item": { "object": "item", "id": 8950, "version": "tbc", "name": "Tarte aux cerises maison", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_food_10.webp", "item_level": 55, "slot_name": null, "type_name": "Consommable", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:8950", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/8950" }, "name": "Tarte aux cerises maison", "chance": 3, "difficulties": [], "quest_item": false, "instance": null }, { "object": "loot", "item": { "object": "item", "id": 8948, "version": "tbc", "name": "Cèpe des rois séché", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_mushroom_05.webp", "item_level": 55, "slot_name": null, "type_name": "Consommable", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:8948", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/8948" }, "name": "Cèpe des rois séché", "chance": 2.7, "difficulties": [], "quest_item": false, "instance": null }, { "object": "loot", "item": { "object": "item", "id": 8932, "version": "tbc", "name": "Emmental d'Alterac", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_food_37.webp", "item_level": 55, "slot_name": null, "type_name": "Consommable", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:8932", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/8932" }, "name": "Emmental d'Alterac", "chance": 2.4, "difficulties": [], "quest_item": false, "instance": null }, { "object": "loot", "item": { "object": "item", "id": 3928, "version": "tbc", "name": "Potion de soins excellente", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_potion_53.webp", "item_level": 45, "slot_name": null, "type_name": "Consommable", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:3928", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/3928" }, "name": "Potion de soins excellente", "chance": 2.4, "difficulties": [], "quest_item": false, "instance": null }, { "object": "loot", "item": { "object": "item", "id": 8952, "version": "tbc", "name": "Poulet rôti", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_food_15.webp", "item_level": 55, "slot_name": null, "type_name": "Consommable", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:8952", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/8952" }, "name": "Poulet rôti", "chance": 2.1, "difficulties": [], "quest_item": false, "instance": null }, { "object": "loot", "item": { "object": "item", "id": 7910, "version": "tbc", "name": "Rubis étoilé", "quality": "uncommon", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_gem_ruby_02.jpg", "item_level": 50, "slot_name": null, "type_name": "Gemme", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:7910", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/7910" }, "name": "Rubis étoilé", "chance": 0.6, "difficulties": [], "quest_item": false, "instance": null } ], "zones": [ { "name": "Maleterres de l'est", "positions": 10, "instance": null } ], "locations_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/locations", "versions": [ { "object": "game_object", "id": 179498, "version": "classic", "name": "Cantine écarlate", "url": "https://wowdb.assemblee-defias.fr/?id=classic:object:179498", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/game-objects/179498" }, { "object": "game_object", "id": 179498, "version": "tbc", "name": "Cantine écarlate", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:object:179498", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498" }, { "object": "game_object", "id": 179498, "version": "wotlk", "name": "Cantine écarlate", "url": "https://wowdb.assemblee-defias.fr/?id=wotlk:object:179498", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/wotlk/game-objects/179498" } ], "guides": [ { "title": "Crochetage", "url": "https://assemblee-defias.fr/crochetage.html" } ] } ``` ## Lister le butin d’un objet du monde `GET /v1/{version}/game-objects/{id}/loot` Le contenu d’un coffre ou d’un gisement, de la meilleure chance à la plus faible. **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `id` (entier, dans le chemin, obligatoire) : Identifiant du jeu de l’objet du monde. - `limit` (entier, facultatif) : Nombre d’éléments par page, de 1 à 100 (20 par défaut). - `cursor` (chaîne, facultatif) : Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres. - `include_total` (booléen, facultatif) : true : ajoute total_count, le nombre total d’éléments avec ces filtres. **Renvoie** : Une liste (`object: "list"`) d’objets `loot`, paginée par curseur. **Requête (GET /v1/{version}/game-objects/{id}/loot)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/loot \ -d limit=2 ``` #### JavaScript ```js const params = new URLSearchParams({ limit: "2", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/loot?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const loot of page.data) { console.log(loot.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "limit": "2", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/loot?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for loot in page["data"]: print(loot["name"]) ``` #### PHP ```php '2', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/loot?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $loot) { echo $loot['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/loot") uri.query = URI.encode_www_form( limit: "2", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |loot| puts loot["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("limit", "2") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/loot?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, loot := range page.Data { fmt.Println(loot["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/loot?limit=2")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/loot?limit=2"); using var doc = JsonDocument.Parse(json); foreach (var loot in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(loot.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/loot") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("limit", "2") .call()? .into_json()?; for loot in page["data"].as_array().into_iter().flatten() { println!("{}", loot["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "loot", "item": { "object": "item", "id": 8766, "version": "tbc", "name": "Soupe de rosée matinale", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_potion_01.jpg", "item_level": 55, "slot_name": null, "type_name": "Consommable", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:8766", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/8766" }, "name": "Soupe de rosée matinale", "chance": 6.3, "difficulties": [], "quest_item": false, "instance": null }, { "object": "loot", "item": { "object": "item", "id": 8953, "version": "tbc", "name": "Bananes frites", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_food_23.webp", "item_level": 55, "slot_name": null, "type_name": "Consommable", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item:8953", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/items/8953" }, "name": "Bananes frites", "chance": 3.9, "difficulties": [], "quest_item": false, "instance": null } ], "has_more": true, "next_cursor": "eyJvIjoyLCJoIjoiSEtGdEVKYXpQRCJ9", "url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/loot" } ``` ## Lister les emplacements d’un objet du monde `GET /v1/{version}/game-objects/{id}/locations` Où le trouver, par fond de carte. **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `id` (entier, dans le chemin, obligatoire) : Identifiant du jeu de l’objet du monde. - `limit` (entier, facultatif) : Nombre d’éléments par page, de 1 à 100 (20 par défaut). - `cursor` (chaîne, facultatif) : Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres. - `include_total` (booléen, facultatif) : true : ajoute total_count, le nombre total d’éléments avec ces filtres. **Renvoie** : Une liste (`object: "list"`) d’objets `map`, paginée par curseur. **Requête (GET /v1/{version}/game-objects/{id}/locations)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/locations \ -d limit=1 ``` #### JavaScript ```js const params = new URLSearchParams({ limit: "1", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/locations?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const map of page.data) { console.log(map.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "limit": "1", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/locations?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for map in page["data"]: print(map["name"]) ``` #### PHP ```php '1', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/locations?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $map) { echo $map['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/locations") uri.query = URI.encode_www_form( limit: "1", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |map| puts map["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("limit", "1") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/locations?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, map := range page.Data { fmt.Println(map["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/locations?limit=1")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/locations?limit=1"); using var doc = JsonDocument.Parse(json); foreach (var map in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(map.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/locations") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("limit", "1") .call()? .into_json()?; for map in page["data"].as_array().into_iter().flatten() { println!("{}", map["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "map", "name": "Maleterres de l'est", "floor": null, "instance": null, "image": "https://wowdb.assemblee-defias.fr/cartes/tbc/zones/EasternPlaguelands.webp", "width": 1002, "height": 668, "points": [ { "x": 77.9, "y": 76.3 }, { "x": 79, "y": 81 }, { "x": 82.9, "y": 83.5 }, { "x": 77.5, "y": 80.1 }, { "x": 87.8, "y": 86.8 }, { "x": 87.1, "y": 81.3 }, { "x": 84.2, "y": 81.1 }, { "x": 82, "y": 80 }, { "x": 80.6, "y": 84.4 }, { "x": 84.7, "y": 79.7 } ] } ], "has_more": false, "next_cursor": null, "url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/game-objects/179498/locations" } ``` --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Ensembles > Les ensembles d’armure : pièces et bonus. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/item-sets ## Ensembles Les ensembles d’armure cités par les guides (en TBC), avec leurs pièces et leurs bonus dans l’infobulle. Exemple : l’**Armure Sombreruse** (`184`), l’ensemble de donjon du voleur. **Routes** - `GET /v1/{version}/item-sets` : Lister les ensembles - `GET /v1/{version}/item-sets/{id}` : Obtenir un ensemble ## L’objet item_set Un ensemble. - `object` (chaîne) : Type d’objet, toujours « item_set ». Valeurs : `item_set`. - `id` (entier) : 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` (chaîne) : Clé WoWDB, unique dans toute la base : « :: » (tbc:item-set:184). - `version` (code) : Version du jeu de cette fiche. Valeurs : `classic`, `tbc`, `wotlk`. - `name` (chaîne) : Nom français, comme en jeu. - `icon` (chaîne ou null) : Adresse absolue de l’icône du jeu (WebP, JPEG ou PNG), servie par WoWDB ; null si la fiche n’en a pas. - `tooltip` (tableau de chaînes) : Infobulle de l’ensemble : pièces et bonus, ligne par ligne. - `url` (chaîne) : Adresse publique de la fiche sur WoWDB (page HTML, à donner à vos lecteurs). - `api_url` (chaîne) : Adresse de l’ensemble dans l’API. Champs de la fiche seulement (`GET …/{id}`) : - `versions` (tableau de Ref) : La même fiche dans chaque version du jeu où elle existe (elle comprise). - `guides` (tableau d’objets) : Guides de L’Assemblée des Défias qui citent cette fiche. - `title` (chaîne) : Titre du guide. - `url` (chaîne) : Adresse du guide sur assemblee-defias.fr. **Exemple : ensemble** (statut 200) ```json { "object": "item_set", "id": 184, "key": "tbc:item-set:184", "version": "tbc", "name": "Armure Sombreruse", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_chest_leather_07.jpg", "tooltip": [ "Armure Sombreruse", "Cuir", "Ensemble de donjon 1 (Classic)", "2 pièces:", "+200 à l'Armure.", "4 pièces:", "Augmente de 40 la puissance d'attaque.", "6 pièces:", "Confère une chance lors d'attaques de mêlée de recevoir 35 points d'énergie.", "8 pièces:", "+8 à toutes les résistances." ], "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item-set:184", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets/184", "versions": [ { "object": "item_set", "id": 184, "version": "tbc", "name": "Armure Sombreruse", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item-set:184", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets/184" } ], "guides": [ { "title": "Choisir sa race (Alliance)", "url": "https://assemblee-defias.fr/racesalliance.html" }, { "title": "Choisir sa race (Horde)", "url": "https://assemblee-defias.fr/raceshorde.html" }, { "title": "Pic de Rochenoire Inférieur (LBRS)", "url": "https://assemblee-defias.fr/lbrs.html" }, { "title": "Pic de Rochenoire Supérieur (UBRS)", "url": "https://assemblee-defias.fr/ubrs.html" }, { "title": "Scholomance", "url": "https://assemblee-defias.fr/scholo.html" }, { "title": "Sets d'armure", "url": "https://assemblee-defias.fr/stats.html" }, { "title": "Stratholme", "url": "https://assemblee-defias.fr/strat.html" } ] } ``` ## Lister les ensembles `GET /v1/{version}/item-sets` Les ensembles d’armure cités par les guides (TBC). **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `q` (chaîne, facultatif) : 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. - `sort` (chaîne, facultatif) : Ordre : name ; « - » devant inverse l’ordre (-item_level : du plus haut au plus bas). Valeurs vides en fin de liste. Par défaut : name. Valeurs : `name`, `-name`. - `limit` (entier, facultatif) : Nombre d’éléments par page, de 1 à 100 (20 par défaut). - `cursor` (chaîne, facultatif) : Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres. - `include_total` (booléen, facultatif) : true : ajoute total_count, le nombre total d’éléments avec ces filtres. **Renvoie** : Une liste (`object: "list"`) d’objets `item_set`, paginée par curseur. **Requête (GET /v1/{version}/item-sets)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets \ -d limit=2 ``` #### JavaScript ```js const params = new URLSearchParams({ limit: "2", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const itemSet of page.data) { console.log(itemSet.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "limit": "2", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for item_set in page["data"]: print(item_set["name"]) ``` #### PHP ```php '2', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $itemSet) { echo $itemSet['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets") uri.query = URI.encode_www_form( limit: "2", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |item_set| puts item_set["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("limit", "2") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, itemSet := range page.Data { fmt.Println(itemSet["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets?limit=2")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets?limit=2"); using var doc = JsonDocument.Parse(json); foreach (var itemSet in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(itemSet.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("limit", "2") .call()? .into_json()?; for item_set in page["data"].as_array().into_iter().flatten() { println!("{}", item_set["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "item_set", "id": 213, "key": "tbc:item-set:213", "version": "tbc", "name": "Armure Croc-de-sang", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_chest_cloth_07.jpg", "tooltip": [ "Armure Croc-de-sang", "Classe:", "Voleur", "Set de Raid Palier 2 (Classic)", "3 pièces:", "Augmente vos chances d'appliquer des poisons sur votre cible de 5%.", "5 pièces:", "Améliore la réduction de niveau de menace de la Feinte de 25%.", "8 pièces:", "Donne au voleur une chance d'infliger 283 à 317 points de dégâts à la cible et de le guérir de 50 points de vie toutes les 1 sec. pendant 6 s lorsqu'il touche un adversaire en mêlée." ], "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item-set:213", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets/213" }, { "object": "item_set", "id": 143, "key": "tbc:item-set:143", "version": "tbc", "name": "Armure de diablosaure", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_pants_wolf.jpg", "tooltip": [ "Armure de diablosaure", "Cuir", "2 pièces:", "Augmente votre score de toucher de 20." ], "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item-set:143", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets/143" } ], "has_more": true, "next_cursor": "eyJrIjpbImFybXVyZSBkZSBkaWFibG9zYXVyZSIsInRiYzppdGVtLXNldDoxNDMiXSwiaCI6Im1vcHhYalVBM3gifQ", "url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets" } ``` ## Obtenir un ensemble `GET /v1/{version}/item-sets/{id}` La fiche complète de l’ensemble : les champs de la liste, plus ceux marqués « fiche seulement ». **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `id` (entier, dans le chemin, obligatoire) : Identifiant du jeu de l’ensemble. **Renvoie** : La fiche complète, objet `item_set` (champs du résumé et champs « fiche seulement »), ou une erreur 404. **Requête (GET /v1/{version}/item-sets/{id})** #### cURL ```bash curl https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets/184 ``` #### JavaScript ```js const res = await fetch("https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets/184"); if (!res.ok) throw new Error((await res.json()).error.message); const itemSet = await res.json(); console.log(itemSet.name); ``` #### Python ```python import json import urllib.request req = urllib.request.Request( "https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets/184", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: item_set = json.load(res) print(item_set["name"]) ``` #### PHP ```php ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets/184', false, $context); $itemSet = json_decode($json, true); echo $itemSet['name'], PHP_EOL; ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets/184") res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) item_set = JSON.parse(res.body) puts item_set["name"] ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" ) func main() { req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets/184", nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var itemSet map[string]any if err := json.NewDecoder(res.Body).Decode(&itemSet); err != nil { panic(err) } fmt.Println(itemSet["name"]) } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets/184")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets/184"); using var doc = JsonDocument.Parse(json); Console.WriteLine(doc.RootElement.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let item_set: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets/184") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .call()? .into_json()?; println!("{}", item_set["name"].as_str().unwrap_or_default()); Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "item_set", "id": 184, "key": "tbc:item-set:184", "version": "tbc", "name": "Armure Sombreruse", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_chest_leather_07.jpg", "tooltip": [ "Armure Sombreruse", "Cuir", "Ensemble de donjon 1 (Classic)", "2 pièces:", "+200 à l'Armure.", "4 pièces:", "Augmente de 40 la puissance d'attaque.", "6 pièces:", "Confère une chance lors d'attaques de mêlée de recevoir 35 points d'énergie.", "8 pièces:", "+8 à toutes les résistances." ], "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item-set:184", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets/184", "versions": [ { "object": "item_set", "id": 184, "version": "tbc", "name": "Armure Sombreruse", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:item-set:184", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/item-sets/184" } ], "guides": [ { "title": "Choisir sa race (Alliance)", "url": "https://assemblee-defias.fr/racesalliance.html" }, { "title": "Choisir sa race (Horde)", "url": "https://assemblee-defias.fr/raceshorde.html" }, { "title": "Pic de Rochenoire Inférieur (LBRS)", "url": "https://assemblee-defias.fr/lbrs.html" }, { "title": "Pic de Rochenoire Supérieur (UBRS)", "url": "https://assemblee-defias.fr/ubrs.html" }, { "title": "Scholomance", "url": "https://assemblee-defias.fr/scholo.html" }, { "title": "Sets d'armure", "url": "https://assemblee-defias.fr/stats.html" }, { "title": "Stratholme", "url": "https://assemblee-defias.fr/strat.html" } ] } ``` --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Réputations > Les réputations : rangs, récompenses par rang avec intendants et prix, quêtes et monstres qui les font monter. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/factions ## Réputations Les factions et leurs réputations, groupes compris. Exemple : **Ravenholdt** (`349`), la confrérie des voleurs du manoir de Ravenholdt. **Routes** - `GET /v1/{version}/factions` : Lister les réputations - `GET /v1/{version}/factions/{id}` : Obtenir une réputation ## L’objet faction Une réputation. - `object` (chaîne) : Type d’objet, toujours « faction ». Valeurs : `faction`. - `id` (entier) : 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` (chaîne) : Clé WoWDB, unique dans toute la base : « :: » (tbc:faction:970). - `version` (code) : Version du jeu de cette fiche. Valeurs : `classic`, `tbc`, `wotlk`. - `name` (chaîne) : Nom français, comme en jeu. - `icon` (chaîne ou null) : Adresse absolue de l’icône du jeu (WebP, JPEG ou PNG), servie par WoWDB ; null si la fiche n’en a pas. - `side` (code ou null) : Camp. Valeurs : `alliance`, `horde`, `both`. - `side_name` (chaîne ou null) : Camp, libellé français. - `group` (booléen) : Vrai pour un groupe de réputations (« Alliance », « Expédition de la Horde »). - `parent` (objet ou null) : Groupe parent. - `name` (chaîne) : Nom du groupe. - `faction` (Ref ou null) : Fiche du groupe. - `description` (chaîne ou null) : Description du jeu. - `rewards_count` (entier) : Nombre de récompenses. - `quests_count` (entier) : Nombre de quêtes qui la font monter. - `monsters_count` (entier) : Nombre de monstres qui la font monter. - `url` (chaîne) : Adresse publique de la fiche sur WoWDB (page HTML, à donner à vos lecteurs). - `api_url` (chaîne) : Adresse de la réputation dans l’API. Champs de la fiche seulement (`GET …/{id}`) : - `english_name` (chaîne ou null) : Nom anglais. - `ranks` (tableau d’objets) : Rangs, de Détesté à Exalté. - `rank` (code ou null) : Rang. Valeurs : `hated`, `hostile`, `unfriendly`, `neutral`, `friendly`, `honored`, `revered`, `exalted`. - `rank_name` (chaîne ou null) : Rang, libellé du jeu. - `min` (entier) : Valeur de début. - `max` (entier) : Valeur de fin. - `rewards` (entier) : Récompenses à ce rang. - `starting_reputation` (tableau d’objets) : Réputation de départ selon la race et la classe. - `who` (chaîne) : Races et classes concernées, en clair. - `rank_name` (chaîne ou null) : Rang de départ. - `value` (entier) : Valeur de départ. - `rewards` (tableau d’objets) : Récompenses par rang, avec leurs intendants et leur prix. - `item` (ItemRef ou null) : L’objet. - `name` (chaîne) : Nom. - `rank` (code ou null) : Rang requis. Valeurs : `hated`, `hostile`, `unfriendly`, `neutral`, `friendly`, `honored`, `revered`, `exalted`. - `rank_name` (chaîne ou null) : Rang requis, libellé du jeu. - `vendors` (tableau d’objets) : Intendants : npc (Ref ou null), name, cost (honor, arena, personal_rating, items). - `quests` (tableau d’objets) : Quêtes qui la font monter. - `quest` (Ref ou null) : La quête. - `name` (chaîne) : Nom. - `value` (entier) : Points gagnés. - `repeatable` (booléen) : Répétable. - `items` (tableau d’objets) : Objets à rendre : item, name, quantity. - `monsters` (tableau d’objets) : Monstres qui la font monter, les plus rentables d’abord. - `npc` (Ref ou null) : Le monstre. - `name` (chaîne) : Nom. - `values` (tableau d’objets) : Par variante (normal, héroïque…) : variant, variant_name, value, until_rank_name. - `children` (tableau de Ref) : Réputations du groupe. - `versions` (tableau de Ref) : La même fiche dans chaque version du jeu où elle existe (elle comprise). - `guides` (tableau d’objets) : Guides de L’Assemblée des Défias qui citent cette fiche. - `title` (chaîne) : Titre du guide. - `url` (chaîne) : Adresse du guide sur assemblee-defias.fr. **Exemple : réputation** (statut 200) ```json { "object": "faction", "id": 349, "key": "classic:faction:349", "version": "classic", "name": "Ravenholdt", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_bannerpvp_03.webp", "side": "both", "side_name": "Alliance et Horde", "group": false, "parent": null, "description": "Cette guilde de voleurs et d’assassins, ennemie jurée du Syndicat, n’accepte que les individus les plus talentueux.", "rewards_count": 0, "quests_count": 7, "monsters_count": 11, "url": "https://wowdb.assemblee-defias.fr/?id=classic:faction:349", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/factions/349", "english_name": "Ravenholdt", "ranks": [ { "rank": "hated", "rank_name": "Détesté", "min": -42000, "max": -6000, "rewards": 0 }, { "rank": "hostile", "rank_name": "Hostile", "min": -6000, "max": -3000, "rewards": 0 }, { "rank": "unfriendly", "rank_name": "Inamical", "min": -3000, "max": 0, "rewards": 0 }, { "rank": "neutral", "rank_name": "Neutre", "min": 0, "max": 3000, "rewards": 0 }, { "rank": "friendly", "rank_name": "Amical", "min": 3000, "max": 9000, "rewards": 0 }, { "rank": "honored", "rank_name": "Honoré", "min": 9000, "max": 21000, "rewards": 0 }, { "rank": "revered", "rank_name": "Révéré", "min": 21000, "max": 42000, "rewards": 0 }, { "rank": "exalted", "rank_name": "Exalté", "min": 42000, "max": 42999, "rewards": 0 } ], "starting_reputation": [ { "who": "Toutes les races", "rank_name": "Neutre", "value": 0 } ], "rewards": [], "quests": [ { "quest": { "object": "quest", "id": 6701, "version": "classic", "name": "Emblèmes du Syndicat", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:6701", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/6701" }, "name": "Emblèmes du Syndicat", "value": 100, "repeatable": true, "items": [ { "item": { "object": "item", "id": 17124, "version": "classic", "name": "Emblème du Syndicat", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_armorkit_03.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:17124", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/17124" }, "name": "Emblème du Syndicat", "quantity": 1 } ] }, { "quest": { "object": "quest", "id": 8249, "version": "classic", "name": "Demande de coffrets", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:8249", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/8249" }, "name": "Demande de coffrets", "value": 75, "repeatable": true, "items": [ { "item": { "object": "item", "id": 16885, "version": "classic", "name": "Coffret lourd", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_box_03.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:16885", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/16885" }, "name": "Coffret lourd", "quantity": 5 } ] }, { "quest": { "object": "quest", "id": 8236, "version": "classic", "name": "La clé d'azur", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:8236", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/8236" }, "name": "La clé d'azur", "value": 350, "repeatable": false, "items": [ { "item": { "object": "item", "id": 20022, "version": "classic", "name": "Clé azur", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_key_08.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:20022", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/20022" }, "name": "Clé azur", "quantity": 1 } ] }, { "quest": { "object": "quest", "id": 8235, "version": "classic", "name": "Les fragments codés", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:8235", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/8235" }, "name": "Les fragments codés", "value": 250, "repeatable": false, "items": [ { "item": { "object": "item", "id": 20023, "version": "classic", "name": "Fragment codé", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_note_01.jpg", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:20023", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/20023" }, "name": "Fragment codé", "quantity": 10 } ] }, { "quest": { "object": "quest", "id": 6681, "version": "classic", "name": "Ravenholdt, le manoir", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:6681", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/6681" }, "name": "Ravenholdt, le manoir", "value": 250, "repeatable": false, "items": [ { "item": { "object": "item", "id": 17125, "version": "classic", "name": "Sceau de Ravenholdt", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_jewelry_talisman_01.jpg", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:17125", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/17125" }, "name": "Sceau de Ravenholdt", "quantity": 1 } ] }, { "quest": { "object": "quest", "id": 8234, "version": "classic", "name": "Sac azur scellé", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:8234", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/8234" }, "name": "Sac azur scellé", "value": 250, "repeatable": false, "items": [ { "item": { "object": "item", "id": 19775, "version": "classic", "name": "Sac azur scellé", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bag_16.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:19775", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/19775" }, "name": "Sac azur scellé", "quantity": 1 } ] }, { "quest": { "object": "quest", "id": 8233, "version": "classic", "name": "Une requête toute simple", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:8233", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/8233" }, "name": "Une requête toute simple", "value": 10, "repeatable": false, "items": [] } ], "monsters": [ { "npc": { "object": "npc", "id": 6771, "version": "classic", "name": "Assassin de Ravenholdt", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:6771", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/6771" }, "name": "Assassin de Ravenholdt", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 8309, "version": "classic", "name": "Carlo Aurelius", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:8309", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/8309" }, "name": "Carlo Aurelius", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 6707, "version": "classic", "name": "Fahrad", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:6707", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/6707" }, "name": "Fahrad", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 6766, "version": "classic", "name": "Garde de Ravenholdt", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:6766", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/6766" }, "name": "Garde de Ravenholdt", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 7323, "version": "classic", "name": "Lou Pierret", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:7323", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/7323" }, "name": "Lou Pierret", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 7325, "version": "classic", "name": "Maître Kang", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:7325", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/7325" }, "name": "Maître Kang", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 6768, "version": "classic", "name": "Seigneur Jorach Ravenholdt", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:6768", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/6768" }, "name": "Seigneur Jorach Ravenholdt", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 7324, "version": "classic", "name": "Simone Cantrell", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:7324", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/7324" }, "name": "Simone Cantrell", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 6779, "version": "classic", "name": "Smudge Tonnebois", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:6779", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/6779" }, "name": "Smudge Tonnebois", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 6777, "version": "classic", "name": "Zan Tympeustache", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:6777", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/6777" }, "name": "Zan Tympeustache", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 13085, "version": "classic", "name": "Myrokos Sourdeforme", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:13085", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/13085" }, "name": "Myrokos Sourdeforme", "values": [ { "variant": 0, "variant_name": null, "value": -125, "until_rank_name": "Neutre" } ] } ], "children": [], "versions": [ { "object": "faction", "id": 349, "version": "classic", "name": "Ravenholdt", "url": "https://wowdb.assemblee-defias.fr/?id=classic:faction:349", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/factions/349" }, { "object": "faction", "id": 349, "version": "tbc", "name": "Ravenholdt", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:faction:349", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/factions/349" }, { "object": "faction", "id": 349, "version": "wotlk", "name": "Ravenholdt", "url": "https://wowdb.assemblee-defias.fr/?id=wotlk:faction:349", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/wotlk/factions/349" } ], "guides": [] } ``` ## Lister les réputations `GET /v1/{version}/factions` Les réputations d’une version, groupes compris. **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `q` (chaîne, facultatif) : 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. - `side` (codes séparés par des virgules, facultatif) : Camps. Plusieurs valeurs séparées par des virgules. Valeurs : `alliance`, `horde`, `both`. - `sort` (chaîne, facultatif) : Ordre : name ; « - » devant inverse l’ordre (-item_level : du plus haut au plus bas). Valeurs vides en fin de liste. Par défaut : name. Valeurs : `name`, `-name`. - `limit` (entier, facultatif) : Nombre d’éléments par page, de 1 à 100 (20 par défaut). - `cursor` (chaîne, facultatif) : Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres. - `include_total` (booléen, facultatif) : true : ajoute total_count, le nombre total d’éléments avec ces filtres. **Renvoie** : Une liste (`object: "list"`) d’objets `faction`, paginée par curseur. **Requête (GET /v1/{version}/factions)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/classic/factions \ -d side=both \ -d limit=2 ``` #### JavaScript ```js const params = new URLSearchParams({ side: "both", limit: "2", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/classic/factions?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const faction of page.data) { console.log(faction.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "side": "both", "limit": "2", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/classic/factions?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for faction in page["data"]: print(faction["name"]) ``` #### PHP ```php 'both', 'limit' => '2', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/factions?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $faction) { echo $faction['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/factions") uri.query = URI.encode_www_form( side: "both", limit: "2", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |faction| puts faction["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("side", "both") params.Set("limit", "2") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/factions?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, faction := range page.Data { fmt.Println(faction["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/factions?side=both&limit=2")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/factions?side=both&limit=2"); using var doc = JsonDocument.Parse(json); foreach (var faction in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(faction.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/factions") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("side", "both") .query("limit", "2") .call()? .into_json()?; for faction in page["data"].as_array().into_iter().flatten() { println!("{}", faction["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "faction", "id": 529, "key": "classic:faction:529", "version": "classic", "name": "Aube d'argent", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_token_argentdawn3.webp", "side": "both", "side_name": "Alliance et Horde", "group": false, "parent": null, "description": "Cette organisation s’est vouée à protéger Azeroth contre la menace du Fléau. On trouve ses forteresses dans les Maleterres de l’est et de l’ouest.", "rewards_count": 20, "quests_count": 148, "monsters_count": 126, "url": "https://wowdb.assemblee-defias.fr/?id=classic:faction:529", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/factions/529" }, { "object": "faction", "id": 21, "key": "classic:faction:21", "version": "classic", "name": "Baie-du-Butin", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_bannerpvp_03.webp", "side": "both", "side_name": "Alliance et Horde", "group": false, "parent": { "name": "Cartel Gentepression", "faction": { "object": "faction", "id": 169, "version": "classic", "name": "Cartel Gentepression", "url": "https://wowdb.assemblee-defias.fr/?id=classic:faction:169", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/factions/169" } }, "description": "Cette ville portuaire en pleine expansion est dirigée par le baron Revilgaz, des Écumeurs des Flots noirs. Ces derniers appartiennent au cartel Gentepression, et sont des ennemis mortels des boucaniers de la Voile sanglante.", "rewards_count": 0, "quests_count": 74, "monsters_count": 26, "url": "https://wowdb.assemblee-defias.fr/?id=classic:faction:21", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/factions/21" } ], "has_more": true, "next_cursor": "eyJrIjpbImJhaWUtZHUtYnV0aW4iLCJjbGFzc2ljOmZhY3Rpb246MjEiXSwiaCI6Ilo4NmREOW5fNXEifQ", "url": "https://api.wowdb.assemblee-defias.fr/v1/classic/factions?side=both" } ``` ## Obtenir une réputation `GET /v1/{version}/factions/{id}` La fiche complète de la réputation : les champs de la liste, plus ceux marqués « fiche seulement ». **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `id` (entier, dans le chemin, obligatoire) : Identifiant du jeu de la réputation. **Renvoie** : La fiche complète, objet `faction` (champs du résumé et champs « fiche seulement »), ou une erreur 404. **Requête (GET /v1/{version}/factions/{id})** #### cURL ```bash curl https://api.wowdb.assemblee-defias.fr/v1/classic/factions/349 ``` #### JavaScript ```js const res = await fetch("https://api.wowdb.assemblee-defias.fr/v1/classic/factions/349"); if (!res.ok) throw new Error((await res.json()).error.message); const faction = await res.json(); console.log(faction.name); ``` #### Python ```python import json import urllib.request req = urllib.request.Request( "https://api.wowdb.assemblee-defias.fr/v1/classic/factions/349", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: faction = json.load(res) print(faction["name"]) ``` #### PHP ```php ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/factions/349', false, $context); $faction = json_decode($json, true); echo $faction['name'], PHP_EOL; ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/factions/349") res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) faction = JSON.parse(res.body) puts faction["name"] ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" ) func main() { req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/factions/349", nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var faction map[string]any if err := json.NewDecoder(res.Body).Decode(&faction); err != nil { panic(err) } fmt.Println(faction["name"]) } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/factions/349")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/factions/349"); using var doc = JsonDocument.Parse(json); Console.WriteLine(doc.RootElement.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let faction: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/factions/349") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .call()? .into_json()?; println!("{}", faction["name"].as_str().unwrap_or_default()); Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "faction", "id": 349, "key": "classic:faction:349", "version": "classic", "name": "Ravenholdt", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_bannerpvp_03.webp", "side": "both", "side_name": "Alliance et Horde", "group": false, "parent": null, "description": "Cette guilde de voleurs et d’assassins, ennemie jurée du Syndicat, n’accepte que les individus les plus talentueux.", "rewards_count": 0, "quests_count": 7, "monsters_count": 11, "url": "https://wowdb.assemblee-defias.fr/?id=classic:faction:349", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/factions/349", "english_name": "Ravenholdt", "ranks": [ { "rank": "hated", "rank_name": "Détesté", "min": -42000, "max": -6000, "rewards": 0 }, { "rank": "hostile", "rank_name": "Hostile", "min": -6000, "max": -3000, "rewards": 0 }, { "rank": "unfriendly", "rank_name": "Inamical", "min": -3000, "max": 0, "rewards": 0 }, { "rank": "neutral", "rank_name": "Neutre", "min": 0, "max": 3000, "rewards": 0 }, { "rank": "friendly", "rank_name": "Amical", "min": 3000, "max": 9000, "rewards": 0 }, { "rank": "honored", "rank_name": "Honoré", "min": 9000, "max": 21000, "rewards": 0 }, { "rank": "revered", "rank_name": "Révéré", "min": 21000, "max": 42000, "rewards": 0 }, { "rank": "exalted", "rank_name": "Exalté", "min": 42000, "max": 42999, "rewards": 0 } ], "starting_reputation": [ { "who": "Toutes les races", "rank_name": "Neutre", "value": 0 } ], "rewards": [], "quests": [ { "quest": { "object": "quest", "id": 6701, "version": "classic", "name": "Emblèmes du Syndicat", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:6701", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/6701" }, "name": "Emblèmes du Syndicat", "value": 100, "repeatable": true, "items": [ { "item": { "object": "item", "id": 17124, "version": "classic", "name": "Emblème du Syndicat", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_armorkit_03.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:17124", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/17124" }, "name": "Emblème du Syndicat", "quantity": 1 } ] }, { "quest": { "object": "quest", "id": 8249, "version": "classic", "name": "Demande de coffrets", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:8249", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/8249" }, "name": "Demande de coffrets", "value": 75, "repeatable": true, "items": [ { "item": { "object": "item", "id": 16885, "version": "classic", "name": "Coffret lourd", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_box_03.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:16885", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/16885" }, "name": "Coffret lourd", "quantity": 5 } ] }, { "quest": { "object": "quest", "id": 8236, "version": "classic", "name": "La clé d'azur", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:8236", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/8236" }, "name": "La clé d'azur", "value": 350, "repeatable": false, "items": [ { "item": { "object": "item", "id": 20022, "version": "classic", "name": "Clé azur", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_key_08.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:20022", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/20022" }, "name": "Clé azur", "quantity": 1 } ] }, { "quest": { "object": "quest", "id": 8235, "version": "classic", "name": "Les fragments codés", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:8235", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/8235" }, "name": "Les fragments codés", "value": 250, "repeatable": false, "items": [ { "item": { "object": "item", "id": 20023, "version": "classic", "name": "Fragment codé", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_note_01.jpg", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:20023", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/20023" }, "name": "Fragment codé", "quantity": 10 } ] }, { "quest": { "object": "quest", "id": 6681, "version": "classic", "name": "Ravenholdt, le manoir", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:6681", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/6681" }, "name": "Ravenholdt, le manoir", "value": 250, "repeatable": false, "items": [ { "item": { "object": "item", "id": 17125, "version": "classic", "name": "Sceau de Ravenholdt", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_jewelry_talisman_01.jpg", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:17125", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/17125" }, "name": "Sceau de Ravenholdt", "quantity": 1 } ] }, { "quest": { "object": "quest", "id": 8234, "version": "classic", "name": "Sac azur scellé", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:8234", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/8234" }, "name": "Sac azur scellé", "value": 250, "repeatable": false, "items": [ { "item": { "object": "item", "id": 19775, "version": "classic", "name": "Sac azur scellé", "quality": "common", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bag_16.webp", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:19775", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/19775" }, "name": "Sac azur scellé", "quantity": 1 } ] }, { "quest": { "object": "quest", "id": 8233, "version": "classic", "name": "Une requête toute simple", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:8233", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/8233" }, "name": "Une requête toute simple", "value": 10, "repeatable": false, "items": [] } ], "monsters": [ { "npc": { "object": "npc", "id": 6771, "version": "classic", "name": "Assassin de Ravenholdt", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:6771", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/6771" }, "name": "Assassin de Ravenholdt", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 8309, "version": "classic", "name": "Carlo Aurelius", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:8309", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/8309" }, "name": "Carlo Aurelius", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 6707, "version": "classic", "name": "Fahrad", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:6707", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/6707" }, "name": "Fahrad", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 6766, "version": "classic", "name": "Garde de Ravenholdt", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:6766", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/6766" }, "name": "Garde de Ravenholdt", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 7323, "version": "classic", "name": "Lou Pierret", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:7323", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/7323" }, "name": "Lou Pierret", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 7325, "version": "classic", "name": "Maître Kang", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:7325", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/7325" }, "name": "Maître Kang", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 6768, "version": "classic", "name": "Seigneur Jorach Ravenholdt", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:6768", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/6768" }, "name": "Seigneur Jorach Ravenholdt", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 7324, "version": "classic", "name": "Simone Cantrell", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:7324", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/7324" }, "name": "Simone Cantrell", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 6779, "version": "classic", "name": "Smudge Tonnebois", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:6779", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/6779" }, "name": "Smudge Tonnebois", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 6777, "version": "classic", "name": "Zan Tympeustache", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:6777", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/6777" }, "name": "Zan Tympeustache", "values": [ { "variant": 0, "variant_name": null, "value": -25, "until_rank_name": "Neutre" } ] }, { "npc": { "object": "npc", "id": 13085, "version": "classic", "name": "Myrokos Sourdeforme", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:13085", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/13085" }, "name": "Myrokos Sourdeforme", "values": [ { "variant": 0, "variant_name": null, "value": -125, "until_rank_name": "Neutre" } ] } ], "children": [], "versions": [ { "object": "faction", "id": 349, "version": "classic", "name": "Ravenholdt", "url": "https://wowdb.assemblee-defias.fr/?id=classic:faction:349", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/factions/349" }, { "object": "faction", "id": 349, "version": "tbc", "name": "Ravenholdt", "url": "https://wowdb.assemblee-defias.fr/?id=tbc:faction:349", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/factions/349" }, { "object": "faction", "id": 349, "version": "wotlk", "name": "Ravenholdt", "url": "https://wowdb.assemblee-defias.fr/?id=wotlk:faction:349", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/wotlk/factions/349" } ], "guides": [] } ``` --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Donjons et raids > Donjons et raids : niveaux, accès, rencontres dans l’ordre du jeu, quêtes et tout le butin par difficulté. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/instances ## Donjons et raids Les donjons et raids qui ont du butin. Leur identifiant est le **numéro de carte du jeu** (`36` : Mortemines, `631` : Citadelle de la Couronne de glace). Le butin se lit à plat, filtrable par rencontre, difficulté, qualité et filtre voleur. **Routes** - `GET /v1/{version}/instances` : Lister les donjons et raids - `GET /v1/{version}/instances/{id}` : Obtenir un donjon ou raid - `GET /v1/{version}/instances/{id}/loot` : Lister le butin d’un donjon ## L’objet instance Un donjon ou un raid. - `object` (chaîne) : Toujours « instance ». Valeurs : `instance`. - `id` (entier) : Numéro de carte du jeu (36 : Mortemines). - `key` (chaîne) : Clé WoWDB : « : » (classic:36). - `version` (code) : Version du jeu. Valeurs : `classic`, `tbc`, `wotlk`. - `name` (chaîne) : Nom français. - `icon` (chaîne ou null) : Adresse absolue de l’icône du jeu (WebP, JPEG ou PNG), servie par WoWDB ; null si la fiche n’en a pas. - `type` (code) : Donjon ou raid. Valeurs : `dungeon`, `raid`. - `type_name` (chaîne) : Libellé français. - `level_min` (entier ou null) : Niveau conseillé minimum. - `level_max` (entier ou null) : Niveau conseillé maximum. - `required_level` (entier ou null) : Niveau requis pour entrer. - `players` (entier ou null) : Nombre de joueurs. - `bosses` (entier) : Nombre de boss. - `items` (entier) : Nombre d’objets de butin. - `rogue_items` (entier) : Objets utiles au voleur dans le butin. - `url` (chaîne) : Page du donjon sur WoWDB. - `api_url` (chaîne) : Adresse du donjon dans l’API. Champs de la fiche seulement (`GET …/{id}`) : - `modes` (tableau d’objets) : Modes de difficulté du jeu. - `name` (chaîne ou null) : Libellé (« 10 joueurs héroïque »). - `players` (entier ou null) : Joueurs. - `difficulties` (tableau d’objets) : Difficultés qui ont du butin. - `difficulty` (code ou null) : Code. Valeurs : `normal`, `heroic`, `10_player`, `25_player`, `10_player_heroic`, `25_player_heroic`. - `difficulty_name` (chaîne ou null) : Libellé. - `access` (tableau d’objets) : Conditions d’accès : clé, quête, haut fait. - `type` (chaîne) : item, quest ou achievement. - `heroic` (booléen) : Vrai pour le mode héroïque. - `name` (chaîne ou null) : Nom. - `item` (Ref ou null, facultatif) : La clé (type item). - `quest` (Ref ou null, facultatif) : La quête (type quest). - `encounters` (tableau d’objets) : Rencontres, dans l’ordre du jeu quand il est connu. - `position` (entier) : Place dans le donjon (1 = première). - `name` (chaîne) : Nom de la rencontre. - `npc` (Ref ou null) : Fiche du boss. - `icon` (chaîne ou null) : Icône du boss. - `items` (entier) : Objets de butin. - `rogue_items` (entier) : Objets utiles au voleur. - `difficulties` (tableau de codes) : Difficultés où il a du butin. Valeurs : `normal`, `heroic`, `10_player`, `25_player`, `10_player_heroic`, `25_player_heroic`. - `loot_url` (chaîne) : Son butin : /instances/{id}/loot?encounter=. - `game_order` (booléen) : Vrai si les rencontres suivent l’ordre du jeu (sinon : ordre alphabétique). - `quests` (tableau d’objets) : Quêtes liées au donjon. - `quest` (Ref) : La quête. - `reason` (chaîne ou null) : Lien avec le donjon (« Quête du donjon »). - `level` (entier ou null) : Niveau. - `loot_url` (chaîne) : Tout le butin : /instances/{id}/loot. - `versions` (tableau de InstanceRef) : Le même donjon dans chaque version. - `guides` (tableau d’objets) : Guides de L’Assemblée des Défias qui citent cette fiche. - `title` (chaîne) : Titre du guide. - `url` (chaîne) : Adresse du guide sur assemblee-defias.fr. **Exemple : donjon ou raid** (statut 200) ```json { "object": "instance", "id": 36, "key": "classic:36", "version": "classic", "name": "Mortemines", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_map_01.webp", "type": "dungeon", "type_name": "Donjon", "level_min": 17, "level_max": 20, "required_level": 10, "players": 10, "bosses": 8, "items": 116, "rogue_items": 53, "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36", "modes": [ { "name": "Normal", "players": 10 } ], "difficulties": [ { "difficulty": "normal", "difficulty_name": "Normal" } ], "access": [], "encounters": [ { "position": 1, "name": "Rhahk'Zor", "npc": { "object": "npc", "id": 644, "version": "classic", "name": "Rhahk'Zor", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:644", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/644" }, "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bone_orcskull_01.webp", "items": 1, "rogue_items": 0, "difficulties": [ "normal" ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=644" }, { "position": 2, "name": "Sneed", "npc": { "object": "npc", "id": 643, "version": "classic", "name": "Sneed", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:643", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/643" }, "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bone_orcskull_01.webp", "items": 3, "rogue_items": 0, "difficulties": [ "normal" ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=643" }, { "position": 3, "name": "Gilnid", "npc": { "object": "npc", "id": 1763, "version": "classic", "name": "Gilnid", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:1763", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/1763" }, "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bone_orcskull_01.webp", "items": 2, "rogue_items": 2, "difficulties": [ "normal" ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=1763" }, { "position": 4, "name": "M. Châtiment", "npc": { "object": "npc", "id": 646, "version": "classic", "name": "M. Châtiment", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:646", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/646" }, "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bone_orcskull_01.webp", "items": 3, "rogue_items": 1, "difficulties": [ "normal" ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=646" }, { "position": 5, "name": "Macaron", "npc": { "object": "npc", "id": 645, "version": "classic", "name": "Macaron", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:645", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/645" }, "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bone_orcskull_01.webp", "items": 3, "rogue_items": 2, "difficulties": [ "normal" ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=645" }, { "position": 6, "name": "Capitaine Vertepeau", "npc": { "object": "npc", "id": 647, "version": "classic", "name": "Capitaine Vertepeau", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:647", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/647" }, "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bone_orcskull_01.webp", "items": 3, "rogue_items": 1, "difficulties": [ "normal" ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=647" }, { "position": 7, "name": "Edwin VanCleef", "npc": { "object": "npc", "id": 639, "version": "classic", "name": "Edwin VanCleef", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:639", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639" }, "icon": "https://wowdb.assemblee-defias.fr/database-icons/achievement_boss_edwinvancleef.webp", "items": 4, "rogue_items": 3, "difficulties": [ "normal" ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=639" }, { "position": 8, "name": "Mineur Johnson", "npc": { "object": "npc", "id": 3586, "version": "classic", "name": "Mineur Johnson", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:3586", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/3586" }, "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bone_orcskull_01.webp", "items": 2, "rogue_items": 1, "difficulties": [ "normal" ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=3586" } ], "game_order": true, "quests": [ { "quest": { "object": "quest", "id": 214, "version": "classic", "name": "Les masques rouges en soie", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:214", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/214" }, "reason": "Quête du donjon", "level": 17 }, { "quest": { "object": "quest", "id": 168, "version": "classic", "name": "À la recherche de cartes du syndicat des mineurs", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:168", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/168" }, "reason": "Quête du donjon", "level": 18 }, { "quest": { "object": "quest", "id": 167, "version": "classic", "name": "Adieu mon frère…", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:167", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/167" }, "reason": "Quête du donjon", "level": 20 }, { "quest": { "object": "quest", "id": 2040, "version": "classic", "name": "Assaut souterrain", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:2040", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/2040" }, "reason": "Quête du donjon", "level": 20 }, { "quest": { "object": "quest", "id": 166, "version": "classic", "name": "La Confrérie défias", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:166", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/166" }, "reason": "Quête du donjon", "level": 22 }, { "quest": { "object": "quest", "id": 373, "version": "classic", "name": "La lettre non envoyée", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:373", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/373" }, "reason": "Objet à rapporter qui tombe dans le donjon", "level": 22 }, { "quest": { "object": "quest", "id": 1654, "version": "classic", "name": "Le test de droiture", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:1654", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/1654" }, "reason": "Objet à rapporter qui tombe dans le donjon", "level": 22 }, { "quest": { "object": "quest", "id": 7938, "version": "classic", "name": "Une surprise vous attend...", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:7938", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/7938" }, "reason": "Quête rendue dans le donjon", "level": 60 } ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot", "versions": [ { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" }, { "object": "instance", "id": 36, "version": "tbc", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=tbc:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/instances/36" }, { "object": "instance", "id": 36, "version": "wotlk", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=wotlk:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/wotlk/instances/36" } ], "guides": [] } ``` ## L’objet loot de donjon Une ligne du butin d’un donjon : un objet, une source, une difficulté. - `object` (chaîne) : Toujours « loot ». Valeurs : `loot`. - `item` (ItemRef) : L’objet. - `name` (chaîne) : Nom. - `chance` (nombre ou null) : Chance en pour cent. - `difficulty` (code ou null) : Difficulté. Valeurs : `normal`, `heroic`, `10_player`, `25_player`, `10_player_heroic`, `25_player_heroic`. - `difficulty_name` (chaîne ou null) : Libellé. - `rogue` (booléen) : Utile au voleur. - `source` (objet) : Qui le lâche. - `kind` (chaîne) : encounter (boss), chest (coffre) ou npc (autre monstre). - `name` (chaîne) : Nom. - `boss` (booléen) : Vrai pour un boss. - `npc` (Ref ou null) : Fiche du PNJ. - `npc_ids` (tableau de entiers) : Identifiants du PNJ dans chaque difficulté (filtre encounter). ## Lister les donjons et raids `GET /v1/{version}/instances` Les donjons puis les raids d’une version qui ont du butin, par nom. Identifiant : numéro de carte du jeu. **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `type` (codes séparés par des virgules, facultatif) : Donjon ou raid. Plusieurs valeurs séparées par des virgules. Valeurs : `dungeon`, `raid`. - `rogue` (booléen, facultatif) : true : seulement les donjons qui ont du butin utiles au voleur ; false : seulement les autres. Absent : tout (par défaut). - `limit` (entier, facultatif) : Nombre d’éléments par page, de 1 à 100 (20 par défaut). - `cursor` (chaîne, facultatif) : Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres. - `include_total` (booléen, facultatif) : true : ajoute total_count, le nombre total d’éléments avec ces filtres. **Renvoie** : Une liste (`object: "list"`) d’objets `instance`, paginée par curseur. **Requête (GET /v1/{version}/instances)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/classic/instances \ -d type=dungeon \ -d limit=2 ``` #### JavaScript ```js const params = new URLSearchParams({ type: "dungeon", limit: "2", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/classic/instances?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const instance of page.data) { console.log(instance.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "type": "dungeon", "limit": "2", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/classic/instances?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for instance in page["data"]: print(instance["name"]) ``` #### PHP ```php 'dungeon', 'limit' => '2', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/instances?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $instance) { echo $instance['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/instances") uri.query = URI.encode_www_form( type: "dungeon", limit: "2", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |instance| puts instance["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("type", "dungeon") params.Set("limit", "2") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/instances?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, instance := range page.Data { fmt.Println(instance["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/instances?type=dungeon&limit=2")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/instances?type=dungeon&limit=2"); using var doc = JsonDocument.Parse(json); foreach (var instance in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(instance.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/instances") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("type", "dungeon") .query("limit", "2") .call()? .into_json()?; for instance in page["data"].as_array().into_iter().flatten() { println!("{}", instance["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "instance", "id": 43, "key": "classic:43", "version": "classic", "name": "Cavernes des Lamentations", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_map_01.webp", "type": "dungeon", "type_name": "Donjon", "level_min": 17, "level_max": 20, "required_level": 10, "players": 10, "bosses": 9, "items": 109, "rogue_items": 44, "url": "https://wowdb.assemblee-defias.fr/?instance=classic:43", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/43" }, { "object": "instance", "id": 33, "key": "classic:33", "version": "classic", "name": "Donjon d'Ombrecroc", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_map_01.webp", "type": "dungeon", "type_name": "Donjon", "level_min": 18, "level_max": 21, "required_level": 10, "players": 10, "bosses": 9, "items": 22, "rogue_items": 8, "url": "https://wowdb.assemblee-defias.fr/?instance=classic:33", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/33" } ], "has_more": true, "next_cursor": "eyJvIjoyLCJoIjoiajQ0b1hrdy1BMyJ9", "url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances?type=dungeon" } ``` ## Obtenir un donjon ou raid `GET /v1/{version}/instances/{id}` La fiche complète du donjon : les champs de la liste, plus ceux marqués « fiche seulement ». **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `id` (entier, dans le chemin, obligatoire) : Identifiant du jeu du donjon. **Renvoie** : La fiche complète, objet `instance` (champs du résumé et champs « fiche seulement »), ou une erreur 404. **Requête (GET /v1/{version}/instances/{id})** #### cURL ```bash curl https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36 ``` #### JavaScript ```js const res = await fetch("https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36"); if (!res.ok) throw new Error((await res.json()).error.message); const instance = await res.json(); console.log(instance.name); ``` #### Python ```python import json import urllib.request req = urllib.request.Request( "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: instance = json.load(res) print(instance["name"]) ``` #### PHP ```php ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36', false, $context); $instance = json_decode($json, true); echo $instance['name'], PHP_EOL; ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36") res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) instance = JSON.parse(res.body) puts instance["name"] ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" ) func main() { req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36", nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var instance map[string]any if err := json.NewDecoder(res.Body).Decode(&instance); err != nil { panic(err) } fmt.Println(instance["name"]) } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36"); using var doc = JsonDocument.Parse(json); Console.WriteLine(doc.RootElement.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let instance: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .call()? .into_json()?; println!("{}", instance["name"].as_str().unwrap_or_default()); Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "instance", "id": 36, "key": "classic:36", "version": "classic", "name": "Mortemines", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_map_01.webp", "type": "dungeon", "type_name": "Donjon", "level_min": 17, "level_max": 20, "required_level": 10, "players": 10, "bosses": 8, "items": 116, "rogue_items": 53, "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36", "modes": [ { "name": "Normal", "players": 10 } ], "difficulties": [ { "difficulty": "normal", "difficulty_name": "Normal" } ], "access": [], "encounters": [ { "position": 1, "name": "Rhahk'Zor", "npc": { "object": "npc", "id": 644, "version": "classic", "name": "Rhahk'Zor", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:644", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/644" }, "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bone_orcskull_01.webp", "items": 1, "rogue_items": 0, "difficulties": [ "normal" ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=644" }, { "position": 2, "name": "Sneed", "npc": { "object": "npc", "id": 643, "version": "classic", "name": "Sneed", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:643", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/643" }, "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bone_orcskull_01.webp", "items": 3, "rogue_items": 0, "difficulties": [ "normal" ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=643" }, { "position": 3, "name": "Gilnid", "npc": { "object": "npc", "id": 1763, "version": "classic", "name": "Gilnid", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:1763", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/1763" }, "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bone_orcskull_01.webp", "items": 2, "rogue_items": 2, "difficulties": [ "normal" ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=1763" }, { "position": 4, "name": "M. Châtiment", "npc": { "object": "npc", "id": 646, "version": "classic", "name": "M. Châtiment", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:646", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/646" }, "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bone_orcskull_01.webp", "items": 3, "rogue_items": 1, "difficulties": [ "normal" ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=646" }, { "position": 5, "name": "Macaron", "npc": { "object": "npc", "id": 645, "version": "classic", "name": "Macaron", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:645", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/645" }, "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bone_orcskull_01.webp", "items": 3, "rogue_items": 2, "difficulties": [ "normal" ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=645" }, { "position": 6, "name": "Capitaine Vertepeau", "npc": { "object": "npc", "id": 647, "version": "classic", "name": "Capitaine Vertepeau", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:647", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/647" }, "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bone_orcskull_01.webp", "items": 3, "rogue_items": 1, "difficulties": [ "normal" ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=647" }, { "position": 7, "name": "Edwin VanCleef", "npc": { "object": "npc", "id": 639, "version": "classic", "name": "Edwin VanCleef", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:639", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639" }, "icon": "https://wowdb.assemblee-defias.fr/database-icons/achievement_boss_edwinvancleef.webp", "items": 4, "rogue_items": 3, "difficulties": [ "normal" ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=639" }, { "position": 8, "name": "Mineur Johnson", "npc": { "object": "npc", "id": 3586, "version": "classic", "name": "Mineur Johnson", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:3586", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/3586" }, "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_bone_orcskull_01.webp", "items": 2, "rogue_items": 1, "difficulties": [ "normal" ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=3586" } ], "game_order": true, "quests": [ { "quest": { "object": "quest", "id": 214, "version": "classic", "name": "Les masques rouges en soie", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:214", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/214" }, "reason": "Quête du donjon", "level": 17 }, { "quest": { "object": "quest", "id": 168, "version": "classic", "name": "À la recherche de cartes du syndicat des mineurs", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:168", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/168" }, "reason": "Quête du donjon", "level": 18 }, { "quest": { "object": "quest", "id": 167, "version": "classic", "name": "Adieu mon frère…", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:167", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/167" }, "reason": "Quête du donjon", "level": 20 }, { "quest": { "object": "quest", "id": 2040, "version": "classic", "name": "Assaut souterrain", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:2040", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/2040" }, "reason": "Quête du donjon", "level": 20 }, { "quest": { "object": "quest", "id": 166, "version": "classic", "name": "La Confrérie défias", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:166", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/166" }, "reason": "Quête du donjon", "level": 22 }, { "quest": { "object": "quest", "id": 373, "version": "classic", "name": "La lettre non envoyée", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:373", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/373" }, "reason": "Objet à rapporter qui tombe dans le donjon", "level": 22 }, { "quest": { "object": "quest", "id": 1654, "version": "classic", "name": "Le test de droiture", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:1654", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/1654" }, "reason": "Objet à rapporter qui tombe dans le donjon", "level": 22 }, { "quest": { "object": "quest", "id": 7938, "version": "classic", "name": "Une surprise vous attend...", "url": "https://wowdb.assemblee-defias.fr/?id=classic:quest:7938", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/quests/7938" }, "reason": "Quête rendue dans le donjon", "level": 60 } ], "loot_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot", "versions": [ { "object": "instance", "id": 36, "version": "classic", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=classic:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36" }, { "object": "instance", "id": 36, "version": "tbc", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=tbc:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/tbc/instances/36" }, { "object": "instance", "id": 36, "version": "wotlk", "name": "Mortemines", "type": "dungeon", "url": "https://wowdb.assemblee-defias.fr/?instance=wotlk:36", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/wotlk/instances/36" } ], "guides": [] } ``` ## Lister le butin d’un donjon `GET /v1/{version}/instances/{id}/loot` Tout le butin du donjon ou du raid : une ligne par objet, source et difficulté, rencontres d’abord, dans l’ordre du jeu. Exemple : le butin d’Edwin VanCleef utile au voleur. **Paramètres** - `version` (code, dans le chemin, obligatoire) : Version du jeu : classic (Vanilla 1.12.1), tbc (2.4.3) ou wotlk (3.3.5a). Valeurs : `classic`, `tbc`, `wotlk`. - `id` (entier, dans le chemin, obligatoire) : Identifiant du jeu du donjon (numéro de carte). - `encounter` (entier, facultatif) : Identifiant du PNJ d’une rencontre (encounters[].npc.id ou une de ses variantes) : son butin seulement. - `difficulty` (codes séparés par des virgules, facultatif) : Difficultés. Valeurs : `normal`, `heroic`, `10_player`, `25_player`, `10_player_heroic`, `25_player_heroic`. - `quality` (codes séparés par des virgules, facultatif) : Qualités. Valeurs : `poor`, `common`, `uncommon`, `rare`, `epic`, `legendary`, `artifact`, `heirloom`. - `rogue` (booléen, facultatif) : true : seulement les objets utiles au voleur ; false : seulement les autres. Absent : tout (par défaut). - `limit` (entier, facultatif) : Nombre d’éléments par page, de 1 à 100 (20 par défaut). - `cursor` (chaîne, facultatif) : Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres. - `include_total` (booléen, facultatif) : true : ajoute total_count, le nombre total d’éléments avec ces filtres. **Renvoie** : Une liste (`object: "list"`) d’objets `loot`, paginée par curseur. **Requête (GET /v1/{version}/instances/{id}/loot)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot \ -d encounter=639 \ -d rogue=true \ -d limit=2 ``` #### JavaScript ```js const params = new URLSearchParams({ encounter: "639", rogue: "true", limit: "2", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const loot of page.data) { console.log(loot.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "encounter": "639", "rogue": "true", "limit": "2", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for loot in page["data"]: print(loot["name"]) ``` #### PHP ```php '639', 'rogue' => 'true', 'limit' => '2', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $loot) { echo $loot['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot") uri.query = URI.encode_www_form( encounter: "639", rogue: "true", limit: "2", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |loot| puts loot["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("encounter", "639") params.Set("rogue", "true") params.Set("limit", "2") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, loot := range page.Data { fmt.Println(loot["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=639&rogue=true&limit=2")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=639&rogue=true&limit=2"); using var doc = JsonDocument.Parse(json); foreach (var loot in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(loot.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("encounter", "639") .query("rogue", "true") .query("limit", "2") .call()? .into_json()?; for loot in page["data"].as_array().into_iter().flatten() { println!("{}", loot["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "loot", "item": { "object": "item", "id": 5193, "version": "classic", "name": "Cape de la confrérie", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_cape_08.jpg", "item_level": 25, "slot_name": "Dos", "type_name": "Tissu", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:5193", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5193" }, "name": "Cape de la confrérie", "chance": 30, "difficulty": "normal", "difficulty_name": "Normal", "rogue": true, "source": { "kind": "encounter", "name": "Edwin VanCleef", "boss": true, "npc": { "object": "npc", "id": 639, "version": "classic", "name": "Edwin VanCleef", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:639", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639" }, "npc_ids": [ 639 ] } }, { "object": "loot", "item": { "object": "item", "id": 10399, "version": "classic", "name": "Armure défias noircie", "quality": "rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_chest_leather_08.jpg", "item_level": 24, "slot_name": "Torse", "type_name": "Cuir", "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:10399", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/10399" }, "name": "Armure défias noircie", "chance": 20, "difficulty": "normal", "difficulty_name": "Normal", "rogue": true, "source": { "kind": "encounter", "name": "Edwin VanCleef", "boss": true, "npc": { "object": "npc", "id": 639, "version": "classic", "name": "Edwin VanCleef", "url": "https://wowdb.assemblee-defias.fr/?id=classic:npc:639", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/npcs/639" }, "npc_ids": [ 639 ] } } ], "has_more": true, "next_cursor": "eyJvIjoyLCJoIjoiRFllWTV5OE0yYiJ9", "url": "https://api.wowdb.assemblee-defias.fr/v1/classic/instances/36/loot?encounter=639&rogue=true" } ``` --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Recherche > Recherche plein texte dans toute la base, par pertinence, tous types et toutes versions. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/search ## Recherche Une seule requête pour chercher dans toute la base : noms et infobulles, tous types et toutes versions, ou ceux que vous choisissez. Pour filtrer finement un seul type, préférez sa liste et son paramètre `q`. **Routes** - `GET /v1/search` : Rechercher ## Pertinence 1. Le nom exact (avec ou sans article : « aldor » trouve « L’Aldor »). 2. Les noms qui commencent par le texte cherché. 3. Le score du texte, où le nom pèse dix fois plus que l’infobulle. 4. Le nom, par ordre alphabétique. Chaque mot doit commencer un mot de la fiche ; les mots vides (« de », « la ») sont ignorés quand d’autres mots suffisent. Une recherche d’une ou deux lettres ne porte que sur les noms. Un numéro (`q=5191`) trouve la fiche de ce numéro dans chaque type et chaque version. ## Rechercher `GET /v1/search` 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). **Paramètres** - `q` (chaîne, obligatoire) : Texte à chercher : nom, mot de l’infobulle, ou numéro du jeu. Obligatoire, 120 caractères au plus. - `version` (codes séparés par des virgules, facultatif) : Versions où chercher, séparées par des virgules (toutes par défaut). Valeurs : `classic`, `tbc`, `wotlk`. - `type` (codes séparés par des virgules, facultatif) : Types de fiches, séparés par des virgules : item, spell, quest, npc, game_object, item_set, faction (tous par défaut). Valeurs : `item`, `spell`, `quest`, `npc`, `game_object`, `item_set`, `faction`. - `rogue` (booléen, facultatif) : true : seulement les objets, quêtes et objets du monde utiles au voleur ; false : seulement les autres. Absent : tout (par défaut). - `limit` (entier, facultatif) : Nombre d’éléments par page, de 1 à 100 (20 par défaut). - `cursor` (chaîne, facultatif) : Curseur de la page suivante : la valeur de next_cursor de la page précédente, avec les mêmes filtres. - `include_total` (booléen, facultatif) : true : ajoute total_count, le nombre total d’éléments avec ces filtres. **Renvoie** : Une liste (`object: "list"`) de résumés de fiches de tous types (champ `object` : `item`, `npc`…), par pertinence, paginée par curseur. **Requête (GET /v1/search)** #### cURL ```bash curl -G https://api.wowdb.assemblee-defias.fr/v1/search \ --data-urlencode "q=cape de la confrérie" \ -d type=item \ -d version=classic \ -d limit=1 ``` #### JavaScript ```js const params = new URLSearchParams({ q: "cape de la confrérie", type: "item", version: "classic", limit: "1", }); const res = await fetch(`https://api.wowdb.assemblee-defias.fr/v1/search?${params}`); if (!res.ok) throw new Error((await res.json()).error.message); const page = await res.json(); for (const result of page.data) { console.log(result.name); } ``` #### Python ```python import json import urllib.parse import urllib.request params = urllib.parse.urlencode({ "q": "cape de la confrérie", "type": "item", "version": "classic", "limit": "1", }) req = urllib.request.Request( f"https://api.wowdb.assemblee-defias.fr/v1/search?{params}", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: page = json.load(res) for result in page["data"]: print(result["name"]) ``` #### PHP ```php 'cape de la confrérie', 'type' => 'item', 'version' => 'classic', 'limit' => '1', ]); $context = stream_context_create([ 'http' => ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/search?' . $params, false, $context); $page = json_decode($json, true); foreach ($page['data'] as $result) { echo $result['name'], PHP_EOL; } ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/search") uri.query = URI.encode_www_form( q: "cape de la confrérie", type: "item", version: "classic", limit: "1", ) res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) page = JSON.parse(res.body) page["data"].each do |result| puts result["name"] end ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" "net/url" ) func main() { params := url.Values{} params.Set("q", "cape de la confrérie") params.Set("type", "item") params.Set("version", "classic") params.Set("limit", "1") req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/search?"+params.Encode(), nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var page struct { Data []map[string]any `json:"data"` HasMore bool `json:"has_more"` } if err := json.NewDecoder(res.Body).Decode(&page); err != nil { panic(err) } for _, result := range page.Data { fmt.Println(result["name"]) } } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/search?q=cape%20de%20la%20confr%C3%A9rie&type=item&version=classic&limit=1")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/search?q=cape%20de%20la%20confr%C3%A9rie&type=item&version=classic&limit=1"); using var doc = JsonDocument.Parse(json); foreach (var result in doc.RootElement.GetProperty("data").EnumerateArray()) Console.WriteLine(result.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let page: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/search") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .query("q", "cape de la confrérie") .query("type", "item") .query("version", "classic") .query("limit", "1") .call()? .into_json()?; for result in page["data"].as_array().into_iter().flatten() { println!("{}", result["name"].as_str().unwrap_or_default()); } Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "list", "data": [ { "object": "item", "id": 5193, "key": "classic:item:5193", "version": "classic", "name": "Cape de la confrérie", "quality": "rare", "quality_name": "Rare", "icon": "https://wowdb.assemblee-defias.fr/database-icons/inv_misc_cape_08.jpg", "item_level": 25, "required_level": 20, "slot": "back", "slot_name": "Dos", "type": "cloth", "type_name": "Tissu", "weapon": null, "sell_price": 940, "rogue": true, "internal": false, "tooltip": [ "Cape de la confrérie", "Niveau d'objet 25", "Lié quand ramassé", "Dos", "Tissu", "Armure : 21", "+6 Agilité", "+3 Endurance", "Niveau 20 requis" ], "url": "https://wowdb.assemblee-defias.fr/?id=classic:item:5193", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/classic/items/5193" } ], "has_more": false, "next_cursor": null, "url": "https://api.wowdb.assemblee-defias.fr/v1/search?q=cape%20de%20la%20confr%C3%A9rie&type=item&version=classic" } ``` --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Statistiques > Nombre de fiches par version et par ressource, et date des données. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/stats ## Statistiques Les effectifs de la base, pour afficher « 94 000 objets » ou vérifier la date des données avant de rafraîchir votre cache. **Routes** - `GET /v1/stats` : Obtenir les statistiques ## Obtenir les statistiques `GET /v1/stats` Nombre de fiches par version et par ressource, fiches utiles au voleur, date des données. **Paramètres** Aucun paramètre. **Renvoie** : L’objet `stats`. **Requête (GET /v1/stats)** #### cURL ```bash curl https://api.wowdb.assemblee-defias.fr/v1/stats ``` #### JavaScript ```js const res = await fetch("https://api.wowdb.assemblee-defias.fr/v1/stats"); if (!res.ok) throw new Error((await res.json()).error.message); const stats = await res.json(); console.log(stats.records); ``` #### Python ```python import json import urllib.request req = urllib.request.Request( "https://api.wowdb.assemblee-defias.fr/v1/stats", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: stats = json.load(res) print(stats["records"]) ``` #### PHP ```php ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1/stats', false, $context); $stats = json_decode($json, true); echo $stats['records'], PHP_EOL; ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1/stats") res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) stats = JSON.parse(res.body) puts stats["records"] ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" ) func main() { req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1/stats", nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var stats map[string]any if err := json.NewDecoder(res.Body).Decode(&stats); err != nil { panic(err) } fmt.Println(stats["records"]) } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1/stats")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1/stats"); using var doc = JsonDocument.Parse(json); Console.WriteLine(doc.RootElement.GetProperty("records").GetInt32()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let stats: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1/stats") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .call()? .into_json()?; println!("{}", stats["records"]); Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "stats", "records": 155848, "by_version": { "classic": { "items": 15850, "spells": 265, "quests": 4243, "npcs": 9848, "game_objects": 591, "item_sets": 0, "factions": 37, "instances": 26 }, "tbc": { "items": 25762, "spells": 272, "quests": 6374, "npcs": 16796, "game_objects": 818, "item_sets": 18, "factions": 58, "instances": 51 }, "wotlk": { "items": 39133, "spells": 336, "quests": 9096, "npcs": 25147, "game_objects": 1127, "item_sets": 0, "factions": 77, "instances": 73 } }, "rogue": { "classic": { "items": 3619, "quests": 614, "game_objects": 32 }, "tbc": { "items": 6254, "quests": 1110, "game_objects": 44 }, "wotlk": { "items": 9513, "quests": 1593, "game_objects": 38 } }, "updated_at": "2026-10-01" } ``` ## Racine de l’API `GET /v1` Point d’entrée : version de l’API, liens vers la documentation, la spécification OpenAPI et chaque ressource. - `object` (chaîne) : Toujours « api ». Valeurs : `api`. - `name` (chaîne) : Nom. - `version` (chaîne) : Version de l’API (v1). - `released` (chaîne) : Date de publication de la v1. - `data_updated` (chaîne) : Date des données. - `description` (chaîne) : Présentation. - `documentation` (chaîne) : Documentation. - `openapi` (chaîne) : Spécification OpenAPI. - `llms` (chaîne) : Index pour les assistants IA. - `website` (chaîne) : WoWDB. - `versions` (tableau d’objets) : Versions du jeu (id, api_url). - `endpoints` (objet) : Adresses des ressources. **Requête (GET /v1)** #### cURL ```bash curl https://api.wowdb.assemblee-defias.fr/v1 ``` #### JavaScript ```js const res = await fetch("https://api.wowdb.assemblee-defias.fr/v1"); if (!res.ok) throw new Error((await res.json()).error.message); const api = await res.json(); console.log(api.name); ``` #### Python ```python import json import urllib.request req = urllib.request.Request( "https://api.wowdb.assemblee-defias.fr/v1", headers={"User-Agent": "mon-application/1.0 (contact@example.com)"}, ) with urllib.request.urlopen(req) as res: api = json.load(res) print(api["name"]) ``` #### PHP ```php ['header' => "User-Agent: mon-application/1.0 (contact@example.com)\r\n"], ]); $json = file_get_contents('https://api.wowdb.assemblee-defias.fr/v1', false, $context); $api = json_decode($json, true); echo $api['name'], PHP_EOL; ``` #### Ruby ```ruby require "json" require "net/http" uri = URI("https://api.wowdb.assemblee-defias.fr/v1") res = Net::HTTP.get_response(uri, { "User-Agent" => "mon-application/1.0 (contact@example.com)" }) api = JSON.parse(res.body) puts api["name"] ``` #### Go ```go package main import ( "encoding/json" "fmt" "net/http" ) func main() { req, err := http.NewRequest("GET", "https://api.wowdb.assemblee-defias.fr/v1", nil) if err != nil { panic(err) } req.Header.Set("User-Agent", "mon-application/1.0 (contact@example.com)") res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close() var api map[string]any if err := json.NewDecoder(res.Body).Decode(&api); err != nil { panic(err) } fmt.Println(api["name"]) } ``` #### Java ```java import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; public class Exemple { public static void main(String[] args) throws Exception { HttpRequest request = HttpRequest.newBuilder(URI.create( "https://api.wowdb.assemblee-defias.fr/v1")) .header("User-Agent", "mon-application/1.0 (contact@example.com)") .build(); HttpResponse response = HttpClient.newHttpClient() .send(request, HttpResponse.BodyHandlers.ofString()); // JSON à lire avec Jackson, Gson ou le client WowDb.java (sans dépendance) System.out.println(response.body()); } } ``` #### .NET ```csharp using System.Net.Http; using System.Text.Json; using var http = new HttpClient(); http.DefaultRequestHeaders.UserAgent.ParseAdd("mon-application/1.0 (contact@example.com)"); var json = await http.GetStringAsync( "https://api.wowdb.assemblee-defias.fr/v1"); using var doc = JsonDocument.Parse(json); Console.WriteLine(doc.RootElement.GetProperty("name").GetString()); ``` #### Rust ```rust // Cargo.toml : ureq = { version = "2", features = ["json"] } et serde_json = "1" fn main() -> Result<(), Box> { let api: serde_json::Value = ureq::get("https://api.wowdb.assemblee-defias.fr/v1") .set("User-Agent", "mon-application/1.0 (contact@example.com)") .call()? .into_json()?; println!("{}", api["name"].as_str().unwrap_or_default()); Ok(()) } ``` **Réponse** (statut 200) ```json { "object": "api", "name": "API de WoWDB des Défias", "version": "v1", "released": "2026-10-01", "data_updated": "2026-10-01", "description": "API publique en lecture seule de WoWDB des Défias : objets, sorts, quêtes, PNJ, objets du monde, ensembles, réputations, donjons et raids de World of Warcraft (Vanilla, TBC, WotLK), en français.", "documentation": "https://docs.wowdb.assemblee-defias.fr/", "openapi": "https://api.wowdb.assemblee-defias.fr/v1/openapi.json", "llms": "https://docs.wowdb.assemblee-defias.fr/llms.txt", "website": "https://wowdb.assemblee-defias.fr/", "versions": [ { "id": "classic", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/versions/classic" }, { "id": "tbc", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/versions/tbc" }, { "id": "wotlk", "api_url": "https://api.wowdb.assemblee-defias.fr/v1/versions/wotlk" } ], "endpoints": { "search": "https://api.wowdb.assemblee-defias.fr/v1/search?q={texte}", "stats": "https://api.wowdb.assemblee-defias.fr/v1/stats", "versions": "https://api.wowdb.assemblee-defias.fr/v1/versions", "items": "https://api.wowdb.assemblee-defias.fr/v1/{version}/items", "spells": "https://api.wowdb.assemblee-defias.fr/v1/{version}/spells", "quests": "https://api.wowdb.assemblee-defias.fr/v1/{version}/quests", "npcs": "https://api.wowdb.assemblee-defias.fr/v1/{version}/npcs", "game_objects": "https://api.wowdb.assemblee-defias.fr/v1/{version}/game-objects", "item_sets": "https://api.wowdb.assemblee-defias.fr/v1/{version}/item-sets", "factions": "https://api.wowdb.assemblee-defias.fr/v1/{version}/factions", "instances": "https://api.wowdb.assemblee-defias.fr/v1/{version}/instances" } } ``` --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Bibliothèques clientes > Les clients officiels de WoWDB, d’un seul fichier et sans dépendance, et la génération de clients par OpenAPI. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/bibliotheques ## Bibliothèques officielles Chaque client tient en **un seul fichier sans dépendance** : copiez-le dans votre projet. Tous suivent la même interface : une méthode par ressource, la pagination automatique (`iterate`), une erreur typée avec le `code` de l’API, et une nouvelle tentative après `Retry-After` sur un `429`. > **Bon à savoir** : Ces bibliothèques ne sont pas (encore) publiées sur npm, PyPI, Packagist, RubyGems ou Maven : téléchargez-les ci-dessous, et vérifiez leur somme SHA-256. Le fichier [SHA256SUMS](https://docs.wowdb.assemblee-defias.fr/clients/SHA256SUMS) les réunit (`sha256sum -c SHA256SUMS`). **Avec un client officiel** #### JavaScript ```js import { WowDb } from "./wowdb.mjs"; const wowdb = new WowDb({ userAgent: "bot-de-ma-guilde/1.0" }); const lame = await wowdb.items.retrieve("classic", 5191); console.log(lame.name, lame.weapon.dps); for await (const dague of wowdb.items.iterate("classic", { type: "dagger", rogue: true })) { console.log(dague.name); } ``` #### Python ```python from wowdb import WowDb wowdb = WowDb(user_agent="bot-de-ma-guilde/1.0") lame = wowdb.items.retrieve("classic", 5191) print(lame["name"], lame["weapon"]["dps"]) for dague in wowdb.items.iterate("classic", type="dagger", rogue=True): print(dague["name"]) ``` #### PHP ```php retrieve('classic', 'items', 5191); echo $lame['name'], PHP_EOL; foreach ($wowdb->iterate('/classic/items', ['type' => 'dagger', 'rogue' => 'true']) as $dague) { echo $dague['name'], PHP_EOL; } ``` #### Ruby ```ruby require_relative "wowdb" wowdb = WowDb::Client.new(user_agent: "bot-de-ma-guilde/1.0") lame = wowdb.retrieve("classic", "items", 5191) puts lame["name"] wowdb.iterate("/classic/items", type: "dagger", rogue: true) { |dague| puts dague["name"] } ``` #### Go ```go client := wowdb.New("bot-de-ma-guilde/1.0") lame, err := client.Retrieve(ctx, "classic", "items", 5191) if err != nil { log.Fatal(err) } fmt.Println(lame["name"]) err = client.Iterate(ctx, "/classic/items", url.Values{"type": {"dagger"}, "rogue": {"true"}}, func(dague map[string]any) error { fmt.Println(dague["name"]) return nil }) ``` #### Java ```java WowDb wowdb = new WowDb("bot-de-ma-guilde/1.0"); Map lame = wowdb.retrieve("classic", "items", 5191); System.out.println(lame.get("name")); for (Map dague : wowdb.iterate("/classic/items", Map.of("type", "dagger", "rogue", "true"))) { System.out.println(dague.get("name")); } ``` #### .NET ```csharp var wowdb = new WowDb.Client("bot-de-ma-guilde/1.0"); var lame = await wowdb.RetrieveAsync("classic", "items", 5191); Console.WriteLine(lame.GetProperty("name").GetString()); await foreach (var dague in wowdb.IterateAsync("/classic/items", new() { ["type"] = "dagger", ["rogue"] = "true" })) Console.WriteLine(dague.GetProperty("name").GetString()); ``` ## Téléchargements | Fichier | Langage | Plateformes | Version | Taille | SHA-256 | | --- | --- | --- | --- | --- | --- | | [wowdb.mjs](https://docs.wowdb.assemblee-defias.fr/clients/wowdb.mjs) | JavaScript / TypeScript | Navigateur, Node.js 18+, Deno, Bun (ESM) | 1.0.0 | 6573 octets | `a7b00fe9cf204a05c23ab5f3eaef5607730755d1c40577dff2129d5397c378fb` | | [wowdb.d.ts](https://docs.wowdb.assemblee-defias.fr/clients/wowdb.d.ts) | Types TypeScript | Pour wowdb.mjs | 1.0.0 | 4376 octets | `628c7e3222dedc5b4cfd9bce128303bc07943981651b2d4bc6c341b0a64831de` | | [wowdb.py](https://docs.wowdb.assemblee-defias.fr/clients/wowdb.py) | Python | Python 3.8+, bibliothèque standard | 1.0.0 | 6404 octets | `e6c997523786fc301d38525f0c44ca49fe02bf5eb225a60459882a2d8e2ea100` | | [WowDb.php](https://docs.wowdb.assemblee-defias.fr/clients/WowDb.php) | PHP | PHP 8.1+, extension json | 1.0.0 | 5453 octets | `3ce312657cd8295f76b02101b0836e07ec3b0ebe15caa078ca144820d9d22a0a` | | [wowdb.rb](https://docs.wowdb.assemblee-defias.fr/clients/wowdb.rb) | Ruby | Ruby 3.0+, bibliothèque standard | 1.0.0 | 4214 octets | `b4ce1c7f5971bd4c9852738e32e6951c20dab52bcbd2ec719a165d88239f071a` | | [wowdb.go](https://docs.wowdb.assemblee-defias.fr/clients/wowdb.go) | Go | Go 1.18+, bibliothèque standard | 1.0.0 | 5311 octets | `4c5d45843a156ec6d71b73443b5ca7c0d362d50a7cec3eb5c0681c788c76da80` | | [WowDb.java](https://docs.wowdb.assemblee-defias.fr/clients/WowDb.java) | Java | Java 11+, java.net.http, lecteur JSON intégré | 1.0.0 | 12010 octets | `ac84d831bb2b7a5a0d82b8ef0f76b4cd29f9e43ddabf0aa26573ecf6cc3e02d1` | | [WowDb.cs](https://docs.wowdb.assemblee-defias.fr/clients/WowDb.cs) | C# / .NET | .NET 6+, System.Text.Json | 1.0.0 | 7049 octets | `1e3d47affb44aaf06a51f6ad1046029bcf3c5226166cc392542817d9cedbcaff` | Les clients marqués « testé » sont exécutés contre l’API à chaque série de tests de WoWDB ; les autres suivent la même interface et les mêmes règles (erreurs, pagination, `Retry-After`). Un souci, une amélioration ? Dites-le sur le [forum](https://forum.assemblee-defias.fr/). ## Générer un client depuis OpenAPI Pour un client typé dans un autre langage, ou avec vos conventions, générez-le depuis la [spécification OpenAPI 3.1](https://docs.wowdb.assemblee-defias.fr/openapi). Quelques générateurs connus : | Langage | Outil | Commande | | --- | --- | --- | | TypeScript (types) | openapi-typescript | `npx openapi-typescript https://api.wowdb.assemblee-defias.fr/v1/openapi.json -o wowdb.d.ts` | | TypeScript (client fetch) | OpenAPI Generator | `openapi-generator-cli generate -i https://api.wowdb.assemblee-defias.fr/v1/openapi.json -g typescript-fetch -o wowdb-ts` | | Python | openapi-python-client | `openapi-python-client generate --url https://api.wowdb.assemblee-defias.fr/v1/openapi.json` | | Go | oapi-codegen | `oapi-codegen -package wowdb -generate types,client openapi.json > wowdb.gen.go` | | Java | OpenAPI Generator | `openapi-generator-cli generate -i https://api.wowdb.assemblee-defias.fr/v1/openapi.json -g java -o wowdb-java` | | C# | NSwag | `nswag openapi2csclient /input:https://api.wowdb.assemblee-defias.fr/v1/openapi.json /namespace:WowDb /output:WowDb.cs` | | PHP | OpenAPI Generator | `openapi-generator-cli generate -i https://api.wowdb.assemblee-defias.fr/v1/openapi.json -g php -o wowdb-php` | | Ruby | OpenAPI Generator | `openapi-generator-cli generate -i https://api.wowdb.assemblee-defias.fr/v1/openapi.json -g ruby -o wowdb-ruby` | | Rust | OpenAPI Generator | `openapi-generator-cli generate -i https://api.wowdb.assemblee-defias.fr/v1/openapi.json -g rust -o wowdb-rust` | | Kotlin, Swift, Dart… | OpenAPI Generator | `openapi-generator-cli list` donne les 50 générateurs de clients | > **Bon à savoir** : Pour oapi-codegen, téléchargez d’abord le fichier : `curl -o openapi.json https://api.wowdb.assemblee-defias.fr/v1/openapi.json`. --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # OpenAPI > La spécification OpenAPI 3.1 complète de l’API, vérifiée contre les vraies réponses. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/openapi ## Spécification OpenAPI 3.1 Toute l’API est décrite en OpenAPI 3.1 : chaque route, chaque paramètre avec ses valeurs permises, chaque objet et chaque champ, les erreurs et les en-têtes. La spécification est générée depuis la même source que cette documentation, et un test la confronte aux vraies réponses : chaque route documentée existe, chaque champ documenté est présent. - Adresse : [https://api.wowdb.assemblee-defias.fr/v1/openapi.json](https://api.wowdb.assemblee-defias.fr/v1/openapi.json) - Importez-la dans Postman, Insomnia, Bruno, Hoppscotch ou Swagger UI pour essayer l’API sans écrire de code. - Générez un client typé : [générateurs](https://docs.wowdb.assemblee-defias.fr/bibliotheques#openapi-generator). - Donnez-la à un assistant IA pour qu’il écrive du code juste du premier coup. **Télécharger** ```bash curl -o wowdb-openapi.json https://api.wowdb.assemblee-defias.fr/v1/openapi.json ``` ## Obtenir la spécification OpenAPI `GET /v1/openapi.json` La spécification OpenAPI 3.1 complète de l’API, en JSON. **Paramètres** Aucun paramètre. **Renvoie** : Le document OpenAPI 3.1 (JSON). --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # llms.txt et Markdown > La documentation pour les assistants IA : Markdown de chaque page, llms.txt, llms-full.txt et « Copier pour un LLM ». Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/llms ## Chaque page en Markdown Chaque page de cette documentation existe en Markdown, générée depuis la même source que la page HTML : ajoutez `.md` à l’adresse (`https://docs.wowdb.assemblee-defias.fr/items.md`, et `/index.md` pour l’accueil), ou suivez le lien « Voir en Markdown » en haut de page. Les exemples de **tous les langages** y figurent, avec de vraies réponses. Le bouton « Copier pour un LLM » copie ce Markdown dans le presse-papiers : collez-le dans ChatGPT, Claude, Le Chat ou Copilot, puis posez votre question (« écris-moi un bot Discord qui affiche une dague avec son DPS »). **Une page en Markdown** ```bash curl https://docs.wowdb.assemblee-defias.fr/items.md ``` ## llms.txt et llms-full.txt - [https://docs.wowdb.assemblee-defias.fr/llms.txt](https://docs.wowdb.assemblee-defias.fr/llms.txt) : l’index de la documentation au format [llms.txt](https://llmstxt.org), une ligne par page. - [https://docs.wowdb.assemblee-defias.fr/llms-full.txt](https://docs.wowdb.assemblee-defias.fr/llms-full.txt) : toute la documentation en un seul fichier Markdown. - [https://docs.wowdb.assemblee-defias.fr/openapi.json](https://docs.wowdb.assemblee-defias.fr/openapi.json) : la spécification OpenAPI, aussi servie ici. - [https://wowdb.assemblee-defias.fr/llms.txt](https://wowdb.assemblee-defias.fr/llms.txt) : l’index de WoWDB, qui renvoie vers celui-ci. --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Journal des modifications > Les versions de l’API et leurs changements. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/journal ## v1 : 1er octobre 2026 **Première version publique.** - Ressources : objets, sorts, quêtes, PNJ, objets du monde, ensembles, réputations, donjons et raids, pour Vanilla, TBC et WotLK. - Listes filtrables (dont le filtre voleur `rogue`) et triables, paginées par curseur ; recherche plein texte ; statistiques et versions. - Sous-listes : butin, ventes, quêtes et emplacements des PNJ ; butin et emplacements des objets du monde ; butin des donjons par rencontre et difficulté ; rencontre de boss dans la fiche d’un PNJ. - Lecture seule, sans clé, CORS ouvert ; ETag et 304 ; limite par adresse IP avec en-têtes RateLimit ; erreurs JSON en français. - Spécification OpenAPI 3.1, documentation en Markdown, llms.txt ; clients officiels en JavaScript, Python, PHP, Ruby, Go, Java et C#. ## Stabilité Dans la v1, nous n’enlevons ni ne renommons aucun champ, aucun code, aucune route. Nous pouvons **ajouter** des champs, des valeurs de code et des routes : ignorez ce que vous ne connaissez pas. Un changement incompatible ferait l’objet d’une v2, annoncée ici, la v1 restant en service. --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt. --- # Conditions d’usage > Usage libre et raisonnable, citation de WoWDB des Défias, données du jeu © Blizzard Entertainment. Documentation de l’API de WoWDB des Défias : https://docs.wowdb.assemblee-defias.fr/conditions ## Usage - L’API est **gratuite** et ouverte à tous les projets de la communauté : sites de guilde, bots, addons, outils, assistants. - Usage raisonnable : respectez les [limites de débit](https://docs.wowdb.assemblee-defias.fr/limites), gardez les réponses en cache, identifiez votre application (`User-Agent`). - Citez **WoWDB des Défias** avec un lien vers [https://wowdb.assemblee-defias.fr](https://wowdb.assemblee-defias.fr/) ou vers la fiche (`url`) quand vous affichez nos données. - Les icônes et les cartes sont servies par WoWDB : vous pouvez les afficher via leurs adresses ; pour un usage intensif, gardez-en une copie. ## Données World of Warcraft, ses textes, icônes, cartes et données de jeu sont des marques et des contenus © Blizzard Entertainment, Inc. WoWDB des Défias est un site de fans, sans lien avec Blizzard Entertainment. Les données sont fournies telles quelles, sans garantie : signalez une erreur sur le [forum](https://forum.assemblee-defias.fr/), nous la corrigerons. ## Évolution Le service peut évoluer ; les changements sont annoncés dans le [journal des modifications](https://docs.wowdb.assemblee-defias.fr/journal). En cas d’abus, une adresse IP peut être bloquée. --- API de WoWDB des Défias, v1 (2026-10-01). Adresse de base : https://api.wowdb.assemblee-defias.fr/v1. Index : https://docs.wowdb.assemblee-defias.fr/llms.txt.