# 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 : « <version>:<type>:<id> » (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
<?php
$params = http_build_query([
    'side' => '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<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/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<dyn std::error::Error>> {
    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
<?php
$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/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<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/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<dyn std::error::Error>> {
    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.
