{
  "openapi": "3.1.0",
  "info": {
    "title": "ROB RUN Companion API (non officielle)",
    "version": "1.0.0",
    "description": "API REST JSON en lecture seule pour ROB RUN (Kefir, Steam App 4262460).\n\nDonnées : Steam Web API (joueurs, actualités, fiche store, avis) et datasets communautaires extraits des fichiers du jeu (objets, carte, recettes).\n\nCORS ouvert, ETag + Cache-Control sur toutes les réponses, pagination `page`/`limit` (max 100).\n\nChaque objet porte sa provenance (`sources`). Les champs inconnus valent `null` : rien n'est inventé.\n\n**Site de fans non commercial, sans lien avec Kefir.**",
    "license": {
      "name": "Données de jeu : © leurs propriétaires (usage non commercial)",
      "url": "https://store.steampowered.com/app/4262460/"
    }
  },
  "servers": [
    {
      "url": "/api",
      "description": "Alias court disponible : /v1/…"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "Steam",
      "description": "Données de la Steam Web API, mises en cache côté serveur (5 à 30 min)."
    },
    {
      "name": "Objets",
      "description": "Objets, catégories et recettes issus des datasets communautaires."
    },
    {
      "name": "Carte",
      "description": "Points de la carte de Looty Bay (coordonnées en pixels de l'image 4096×3355)."
    },
    {
      "name": "Méta",
      "description": "Versions et dates d'import."
    }
  ],
  "paths": {
    "/v1/stats/players/current": {
      "get": {
        "summary": "Joueurs connectés (cache 5 min) + pics",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlayersCurrent"
                }
              }
            }
          },
          "304": {
            "description": "Non modifié (If-None-Match)"
          },
          "400": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "tags": [
          "Steam"
        ],
        "operationId": "joueursConnectesCache5MinPics"
      }
    },
    "/v1/stats/players/history": {
      "get": {
        "summary": "Historique des joueurs agrégé",
        "parameters": [
          {
            "name": "range",
            "in": "query",
            "description": "24h (pas 15 min), 7d (2 h), 30d (6 h)",
            "schema": {
              "type": "string",
              "enum": [
                "24h",
                "7d",
                "30d"
              ],
              "default": "24h"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlayersHistory"
                }
              }
            }
          },
          "304": {
            "description": "Non modifié (If-None-Match)"
          },
          "400": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "tags": [
          "Steam"
        ],
        "operationId": "historiqueDesJoueursAgrege"
      }
    },
    "/v1/news": {
      "get": {
        "summary": "Actualités et patch notes Steam",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "description": "Page (≥ 1)",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Taille de page (max 100)",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          {
            "name": "full",
            "in": "query",
            "description": "1 = inclure le HTML nettoyé",
            "schema": {
              "type": "string",
              "enum": [
                "0",
                "1"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NewsList"
                }
              }
            }
          },
          "304": {
            "description": "Non modifié (If-None-Match)"
          },
          "400": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "tags": [
          "Steam"
        ],
        "operationId": "actualitesEtPatchNotesSteam"
      }
    },
    "/v1/news/{gid}": {
      "get": {
        "summary": "Une actualité (HTML nettoyé)",
        "parameters": [
          {
            "name": "gid",
            "in": "path",
            "required": true,
            "description": "gid Steam",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NewsEntry"
                }
              }
            }
          },
          "304": {
            "description": "Non modifié (If-None-Match)"
          },
          "400": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "tags": [
          "Steam"
        ],
        "operationId": "uneActualiteHTMLNettoye"
      }
    },
    "/v1/store": {
      "get": {
        "summary": "Fiche store Steam (fr, cache 30 min)",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "304": {
            "description": "Non modifié (If-None-Match)"
          },
          "400": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "tags": [
          "Steam"
        ],
        "operationId": "ficheStoreSteamFrCache30Min"
      }
    },
    "/v1/reviews/summary": {
      "get": {
        "summary": "Résumé des avis Steam (cache 30 min)",
        "description": "`data` vaut null si l'endpoint Steam est indisponible ; voir `error`.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReviewsSummary"
                }
              }
            }
          },
          "304": {
            "description": "Non modifié (If-None-Match)"
          },
          "400": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "tags": [
          "Steam"
        ],
        "operationId": "resumeDesAvisSteamCache30Min"
      }
    },
    "/v1/items": {
      "get": {
        "summary": "Liste des objets",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "description": "Recherche FR/EN/RU/slug, insensible aux accents, tolérante aux fautes",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "category",
            "in": "query",
            "description": "Catégorie",
            "schema": {
              "type": "string",
              "enum": [
                "weapons",
                "ammo",
                "gear",
                "meds",
                "grenades",
                "tools",
                "keys",
                "barter",
                "base",
                "upgrades",
                "raid",
                "loot"
              ]
            }
          },
          {
            "name": "rarity",
            "in": "query",
            "description": "Rareté",
            "schema": {
              "type": "string",
              "enum": [
                "none",
                "common",
                "uncommon",
                "rare",
                "epic",
                "legendary",
                "exotic"
              ]
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Langue du champ `name` (repli : nom russe, jamais de traduction automatique)",
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en"
              ],
              "default": "fr"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "description": "Tri (préfixe - = décroissant). Par défaut : pertinence si q, sinon nom.",
            "schema": {
              "type": "string",
              "enum": [
                "name",
                "-name",
                "rarity",
                "-rarity",
                "price_sell",
                "-price_sell",
                "category"
              ]
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "Page (≥ 1)",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Taille de page (max 100)",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ItemList"
                }
              }
            }
          },
          "304": {
            "description": "Non modifié (If-None-Match)"
          },
          "400": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "tags": [
          "Objets"
        ],
        "operationId": "listeDesObjets"
      }
    },
    "/v1/items/{id}": {
      "get": {
        "summary": "Fiche complète d'un objet (+ emplacements, recettes, provenance)",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Slug, ex. vulture50_m1",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9_]+$"
            }
          },
          {
            "name": "lang",
            "in": "query",
            "description": "Langue du champ `name` (repli : nom russe, jamais de traduction automatique)",
            "schema": {
              "type": "string",
              "enum": [
                "fr",
                "en"
              ],
              "default": "fr"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ItemDetail"
                }
              }
            }
          },
          "304": {
            "description": "Non modifié (If-None-Match)"
          },
          "400": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "tags": [
          "Objets"
        ],
        "operationId": "ficheCompleteDUnObjetEmplacementsRecettesProvenance"
      }
    },
    "/v1/categories": {
      "get": {
        "summary": "Catégories et nombre d'objets",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CategoryList"
                }
              }
            }
          },
          "304": {
            "description": "Non modifié (If-None-Match)"
          },
          "400": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "tags": [
          "Objets"
        ],
        "operationId": "categoriesEtNombreDObjets"
      }
    },
    "/v1/recipes": {
      "get": {
        "summary": "Recettes (troc, remplissage)",
        "parameters": [
          {
            "name": "type",
            "in": "query",
            "description": "Type",
            "schema": {
              "type": "string",
              "enum": [
                "barter",
                "upgrade",
                "fill"
              ]
            }
          },
          {
            "name": "item",
            "in": "query",
            "description": "Recettes impliquant cet objet",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "Page (≥ 1)",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Taille de page (max 100)",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecipeList"
                }
              }
            }
          },
          "304": {
            "description": "Non modifié (If-None-Match)"
          },
          "400": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "tags": [
          "Objets"
        ],
        "operationId": "recettesTrocRemplissage"
      }
    },
    "/v1/locations": {
      "get": {
        "summary": "Emplacements d'objets sur la carte",
        "parameters": [
          {
            "name": "bbox",
            "in": "query",
            "description": "minX,minY,maxX,maxY en pixels de la carte de l'atlas (4096×3355, origine en haut à gauche)",
            "schema": {
              "type": "string",
              "example": "900,700,1100,900"
            }
          },
          {
            "name": "item",
            "in": "query",
            "description": "Slug d'objet",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "Page (≥ 1)",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "default": 1
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Taille de page (max 100)",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/LocationList"
                }
              }
            }
          },
          "304": {
            "description": "Non modifié (If-None-Match)"
          },
          "400": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "tags": [
          "Carte"
        ],
        "operationId": "emplacementsDObjetsSurLaCarte"
      }
    },
    "/v1/map/points": {
      "get": {
        "summary": "Tous les points de la carte (conteneurs, portes, ordinateurs…)",
        "parameters": [
          {
            "name": "bbox",
            "in": "query",
            "description": "minX,minY,maxX,maxY en pixels de la carte de l'atlas (4096×3355, origine en haut à gauche)",
            "schema": {
              "type": "string",
              "example": "900,700,1100,900"
            }
          },
          {
            "name": "cat",
            "in": "query",
            "description": "Catégories séparées par des virgules (nodes,access,open,random,containers,cargo,actions,cash,atm)",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MapPointList"
                }
              }
            }
          },
          "304": {
            "description": "Non modifié (If-None-Match)"
          },
          "400": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "tags": [
          "Carte"
        ],
        "operationId": "tousLesPointsDeLaCarteConteneursPortesOrdinateurs"
      }
    },
    "/v1/meta": {
      "get": {
        "summary": "Version des données, build Steam source, dates d'import",
        "parameters": [],
        "responses": {
          "200": {
            "description": "OK",
            "headers": {
              "ETag": {
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Meta"
                }
              }
            }
          },
          "304": {
            "description": "Non modifié (If-None-Match)"
          },
          "400": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Erreur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        },
        "tags": [
          "Méta"
        ],
        "operationId": "versionDesDonneesBuildSteamSourceDatesDImport"
      }
    }
  },
  "components": {
    "schemas": {
      "PlayersCurrent": {
        "type": "object",
        "properties": {
          "appid": {
            "type": "number"
          },
          "playerCount": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "ts": {
            "type": "string"
          },
          "cached": {
            "type": "boolean"
          },
          "stale": {
            "type": "boolean"
          },
          "peaks": {
            "type": "object",
            "properties": {
              "peak24h": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "peak7d": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "record": {
                "type": [
                  "number",
                  "null"
                ]
              }
            },
            "required": [
              "peak24h",
              "peak7d",
              "record"
            ],
            "additionalProperties": false
          },
          "source": {
            "type": "string",
            "const": "steam"
          }
        },
        "required": [
          "appid",
          "playerCount",
          "ts",
          "cached",
          "stale",
          "peaks",
          "source"
        ],
        "additionalProperties": false
      },
      "PlayersHistory": {
        "type": "object",
        "properties": {
          "range": {
            "type": "string",
            "enum": [
              "24h",
              "7d",
              "30d"
            ]
          },
          "bucketMinutes": {
            "type": "number"
          },
          "since": {
            "type": "string"
          },
          "points": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "ts": {
                  "type": "string"
                },
                "avg": {
                  "type": "number"
                },
                "min": {
                  "type": "number"
                },
                "max": {
                  "type": "number"
                },
                "samples": {
                  "type": "number"
                }
              },
              "required": [
                "ts",
                "avg",
                "min",
                "max",
                "samples"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "range",
          "bucketMinutes",
          "since",
          "points"
        ],
        "additionalProperties": false
      },
      "NewsList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "gid": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "author": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "publishedAt": {
                  "type": "string"
                },
                "feedLabel": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "tags": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "official": {
                  "type": "boolean"
                },
                "contents": {
                  "type": "string"
                }
              },
              "required": [
                "gid",
                "title",
                "url",
                "author",
                "publishedAt",
                "feedLabel",
                "tags",
                "official"
              ],
              "additionalProperties": false
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "page": {
                "type": "number"
              },
              "limit": {
                "type": "number"
              },
              "total": {
                "type": "number"
              },
              "pages": {
                "type": "number"
              }
            },
            "required": [
              "page",
              "limit",
              "total",
              "pages"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "meta"
        ],
        "additionalProperties": false
      },
      "NewsEntry": {
        "type": "object",
        "properties": {
          "gid": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "author": {
            "type": [
              "string",
              "null"
            ]
          },
          "publishedAt": {
            "type": "string"
          },
          "feedLabel": {
            "type": [
              "string",
              "null"
            ]
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "official": {
            "type": "boolean"
          },
          "contents": {
            "type": "string"
          }
        },
        "required": [
          "gid",
          "title",
          "url",
          "author",
          "publishedAt",
          "feedLabel",
          "tags",
          "official"
        ],
        "additionalProperties": false
      },
      "ReviewsSummary": {
        "type": "object",
        "properties": {
          "data": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "totalReviews": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "totalPositive": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "totalNegative": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "positiveRatio": {
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "scoreDesc": {
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "sample": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "id": {
                          "type": "string"
                        },
                        "language": {
                          "type": [
                            "string",
                            "null"
                          ]
                        },
                        "votedUp": {
                          "type": "boolean"
                        },
                        "excerpt": {
                          "type": "string"
                        },
                        "createdAt": {
                          "type": [
                            "string",
                            "null"
                          ]
                        }
                      },
                      "required": [
                        "id",
                        "language",
                        "votedUp",
                        "excerpt",
                        "createdAt"
                      ],
                      "additionalProperties": false
                    }
                  }
                },
                "required": [
                  "totalReviews",
                  "totalPositive",
                  "totalNegative",
                  "positiveRatio",
                  "scoreDesc",
                  "sample"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "fetchedAt": {
            "type": [
              "string",
              "null"
            ]
          },
          "stale": {
            "type": "boolean"
          },
          "error": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "data",
          "fetchedAt",
          "stale",
          "error"
        ],
        "additionalProperties": false
      },
      "ItemList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "name": {
                  "type": "string",
                  "description": "Nom affiché : FR si connu, sinon RU, sinon slug"
                },
                "names": {
                  "type": "object",
                  "properties": {
                    "ru": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "fr": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "en": {
                      "type": [
                        "string",
                        "null"
                      ]
                    },
                    "frSource": {
                      "anyOf": [
                        {
                          "type": "string",
                          "enum": [
                            "official",
                            "override"
                          ]
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "official = localisation du jeu ; override = table éditable"
                    }
                  },
                  "required": [
                    "ru",
                    "fr",
                    "en",
                    "frSource"
                  ],
                  "additionalProperties": false
                },
                "category": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "subcategory": {
                  "description": "typeId du jeu",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "rarity": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "priceBuy": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "priceSell": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "iconUrl": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "updatedAt": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "name",
                "names",
                "category",
                "subcategory",
                "rarity",
                "priceBuy",
                "priceSell",
                "iconUrl",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "page": {
                "type": "number"
              },
              "limit": {
                "type": "number"
              },
              "total": {
                "type": "number"
              },
              "pages": {
                "type": "number"
              }
            },
            "required": [
              "page",
              "limit",
              "total",
              "pages"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "meta"
        ],
        "additionalProperties": false
      },
      "ItemDetail": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string",
            "description": "Nom affiché : FR si connu, sinon RU, sinon slug"
          },
          "names": {
            "type": "object",
            "properties": {
              "ru": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "fr": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "en": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "frSource": {
                "anyOf": [
                  {
                    "type": "string",
                    "enum": [
                      "official",
                      "override"
                    ]
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "official = localisation du jeu ; override = table éditable"
              }
            },
            "required": [
              "ru",
              "fr",
              "en",
              "frSource"
            ],
            "additionalProperties": false
          },
          "category": {
            "type": [
              "string",
              "null"
            ]
          },
          "subcategory": {
            "description": "typeId du jeu",
            "type": [
              "string",
              "null"
            ]
          },
          "rarity": {
            "type": [
              "string",
              "null"
            ]
          },
          "priceBuy": {
            "type": [
              "number",
              "null"
            ]
          },
          "priceSell": {
            "type": [
              "number",
              "null"
            ]
          },
          "iconUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "updatedAt": {
            "type": "string"
          },
          "descriptionRu": {
            "description": "Description du jeu (russe, seule langue disponible dans les sources)",
            "type": [
              "string",
              "null"
            ]
          },
          "descriptionFr": {
            "description": "Traduction du site, non officielle (data/translations/fr.json)",
            "type": [
              "string",
              "null"
            ]
          },
          "stats": {
            "anyOf": [
              {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {}
              },
              {
                "type": "null"
              }
            ]
          },
          "barter": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "producedBy": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "usedIn": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                },
                "required": [
                  "producedBy",
                  "usedIn"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "source": {
                  "type": "string"
                },
                "url": {
                  "type": "string"
                },
                "commit": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "importedAt": {
                  "type": "string"
                },
                "fields": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "source",
                "url",
                "commit",
                "importedAt"
              ],
              "additionalProperties": false
            }
          },
          "locations": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "itemId": {
                  "type": "string"
                },
                "pointId": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "amountMin": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "amountMax": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "mapPx": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "mapPy": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "locationName": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "locationNameFr": {
                  "description": "Traduction du site, non officielle",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "containerType": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "confirmed": {
                  "type": "boolean"
                },
                "source": {
                  "type": "string"
                }
              },
              "required": [
                "itemId",
                "pointId",
                "amountMin",
                "amountMax",
                "mapPx",
                "mapPy",
                "locationName",
                "locationNameFr",
                "containerType",
                "confirmed",
                "source"
              ],
              "additionalProperties": false
            }
          },
          "recipes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "type": {
                  "type": "string",
                  "enum": [
                    "barter",
                    "upgrade",
                    "fill"
                  ]
                },
                "inputs": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "itemId": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "name": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "qty": {
                        "type": [
                          "number",
                          "null"
                        ]
                      }
                    },
                    "required": [
                      "itemId",
                      "name",
                      "qty"
                    ],
                    "additionalProperties": false
                  }
                },
                "outputs": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "itemId": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "name": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "qty": {
                        "type": [
                          "number",
                          "null"
                        ]
                      }
                    },
                    "required": [
                      "itemId",
                      "name",
                      "qty"
                    ],
                    "additionalProperties": false
                  }
                },
                "details": {
                  "anyOf": [
                    {
                      "type": "object",
                      "propertyNames": {
                        "type": "string"
                      },
                      "additionalProperties": {}
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "source": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "type",
                "inputs",
                "outputs",
                "details",
                "source"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "id",
          "name",
          "names",
          "category",
          "subcategory",
          "rarity",
          "priceBuy",
          "priceSell",
          "iconUrl",
          "updatedAt",
          "descriptionRu",
          "descriptionFr",
          "stats",
          "barter",
          "sources",
          "locations",
          "recipes"
        ],
        "additionalProperties": false
      },
      "CategoryList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "key": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                },
                "gameTypeIds": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "count": {
                  "type": "number"
                }
              },
              "required": [
                "key",
                "label",
                "gameTypeIds",
                "count"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "data"
        ],
        "additionalProperties": false
      },
      "RecipeList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "type": {
                  "type": "string",
                  "enum": [
                    "barter",
                    "upgrade",
                    "fill"
                  ]
                },
                "inputs": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "itemId": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "name": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "qty": {
                        "type": [
                          "number",
                          "null"
                        ]
                      }
                    },
                    "required": [
                      "itemId",
                      "name",
                      "qty"
                    ],
                    "additionalProperties": false
                  }
                },
                "outputs": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "itemId": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "name": {
                        "type": [
                          "string",
                          "null"
                        ]
                      },
                      "qty": {
                        "type": [
                          "number",
                          "null"
                        ]
                      }
                    },
                    "required": [
                      "itemId",
                      "name",
                      "qty"
                    ],
                    "additionalProperties": false
                  }
                },
                "details": {
                  "anyOf": [
                    {
                      "type": "object",
                      "propertyNames": {
                        "type": "string"
                      },
                      "additionalProperties": {}
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "source": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "type",
                "inputs",
                "outputs",
                "details",
                "source"
              ],
              "additionalProperties": false
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "page": {
                "type": "number"
              },
              "limit": {
                "type": "number"
              },
              "total": {
                "type": "number"
              },
              "pages": {
                "type": "number"
              }
            },
            "required": [
              "page",
              "limit",
              "total",
              "pages"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "meta"
        ],
        "additionalProperties": false
      },
      "LocationList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "itemId": {
                  "type": "string"
                },
                "pointId": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "amountMin": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "amountMax": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "mapPx": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "mapPy": {
                  "type": [
                    "number",
                    "null"
                  ]
                },
                "locationName": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "locationNameFr": {
                  "description": "Traduction du site, non officielle",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "containerType": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "confirmed": {
                  "type": "boolean"
                },
                "source": {
                  "type": "string"
                }
              },
              "required": [
                "itemId",
                "pointId",
                "amountMin",
                "amountMax",
                "mapPx",
                "mapPy",
                "locationName",
                "locationNameFr",
                "containerType",
                "confirmed",
                "source"
              ],
              "additionalProperties": false
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "page": {
                "type": "number"
              },
              "limit": {
                "type": "number"
              },
              "total": {
                "type": "number"
              },
              "pages": {
                "type": "number"
              }
            },
            "required": [
              "page",
              "limit",
              "total",
              "pages"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "meta"
        ],
        "additionalProperties": false
      },
      "MapPointList": {
        "type": "object",
        "properties": {
          "map": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "width": {
                    "type": "number"
                  },
                  "height": {
                    "type": "number"
                  },
                  "imageUrl": {
                    "type": [
                      "string",
                      "null"
                    ]
                  }
                },
                "required": [
                  "width",
                  "height",
                  "imageUrl"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "data": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "number"
                },
                "cat": {
                  "type": "string"
                },
                "nameRu": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "nameFr": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "building": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "buildingFr": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "region": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "regionFr": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "mapPx": {
                  "type": "number"
                },
                "mapPy": {
                  "type": "number"
                },
                "lootStatus": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "requiredItems": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "items": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "string"
                      },
                      "amountMin": {
                        "type": [
                          "number",
                          "null"
                        ]
                      },
                      "amountMax": {
                        "type": [
                          "number",
                          "null"
                        ]
                      }
                    },
                    "required": [
                      "id",
                      "amountMin",
                      "amountMax"
                    ],
                    "additionalProperties": false
                  }
                }
              },
              "required": [
                "id",
                "cat",
                "nameRu",
                "nameFr",
                "building",
                "buildingFr",
                "region",
                "regionFr",
                "mapPx",
                "mapPy",
                "lootStatus",
                "requiredItems",
                "items"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "map",
          "data"
        ],
        "additionalProperties": false
      },
      "Meta": {
        "type": "object",
        "properties": {
          "api": {
            "type": "object",
            "properties": {
              "version": {
                "type": "string",
                "const": "v1"
              },
              "docs": {
                "type": "string"
              },
              "openapi": {
                "type": "string"
              }
            },
            "required": [
              "version",
              "docs",
              "openapi"
            ],
            "additionalProperties": false
          },
          "data": {
            "type": "object",
            "properties": {
              "steamBuild": {
                "description": "Build Steam dont sont extraites les données communautaires",
                "type": [
                  "string",
                  "null"
                ]
              },
              "lastItemsImport": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "counts": {
                "anyOf": [
                  {
                    "type": "object",
                    "propertyNames": {
                      "type": "string"
                    },
                    "additionalProperties": {
                      "type": "number"
                    }
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "sources": {
                "type": "array",
                "items": {
                  "type": "object",
                  "propertyNames": {
                    "type": "string"
                  },
                  "additionalProperties": {}
                }
              }
            },
            "required": [
              "steamBuild",
              "lastItemsImport",
              "counts",
              "sources"
            ],
            "additionalProperties": false
          },
          "steam": {
            "type": "object",
            "properties": {
              "appid": {
                "type": "number"
              },
              "lastPlayerSnapshot": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "lastNewsSync": {
                "type": [
                  "string",
                  "null"
                ]
              }
            },
            "required": [
              "appid",
              "lastPlayerSnapshot",
              "lastNewsSync"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "api",
          "data",
          "steam"
        ],
        "additionalProperties": false
      },
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "details": {}
            },
            "required": [
              "code",
              "message"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "error"
        ],
        "additionalProperties": false
      }
    }
  }
}
