# 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
<?php
$params = http_build_query([
    'type' => '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<String> 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<dyn std::error::Error>> {
    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
<?php
$params = http_build_query([
    'type' => '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<String> 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<dyn std::error::Error>> {
    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.
