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