{
    "openapi": "3.1.0",
    "info": {
        "title": "API de ludoteca.dev",
        "version": "1",
        "summary": "Fichas de videojuegos con sus tiendas e identificadores en otras bases de datos.",
        "description": "API JSON pública y gratuita, sin registro ni clave, con CORS abierto.\n\n**Versión estable:** en la v1 solo se añadirán campos, nunca se quitarán ni cambiarán de tipo (cabecera `X-API-Version`).\n\n**Límite:** 60 peticiones por minuto e IP; las respuestas llevan `Cache-Control`, respétalo. Para todo el catálogo de golpe usa la [descarga abierta](https://ludoteca.dev/datos/) en vez de recorrer la API.\n\n**Licencia de los datos:** [ODbL 1.0](https://opendatacommons.org/licenses/odbl/1-0/). Portadas, descripciones y marcas pertenecen a sus propietarios.",
        "contact": {
            "name": "ludoteca.dev",
            "url": "https://ludoteca.dev/api"
        },
        "license": {
            "name": "ODbL-1.0 (datos)",
            "identifier": "ODbL-1.0"
        }
    },
    "externalDocs": {
        "description": "Documentación, plugin de WordPress e insignias",
        "url": "https://ludoteca.dev/api"
    },
    "servers": [
        {
            "url": "https://ludoteca.dev/api/v1"
        }
    ],
    "security": [],
    "tags": [
        {
            "name": "fichas",
            "description": "Una ficha completa"
        },
        {
            "name": "equivalencias",
            "description": "Buscar fichas por su id en una tienda u otra base de datos.\n\n| fuente | nombre | id | ejemplo |\n|---|---|---|---|\n| `steam` | Steam | appid | `774361` |\n| `epic` | Epic Games Store | slug de la URL de Epic Games Store | `blasphemous` |\n| `gog` | GOG | slug de la URL de GOG (también game/blasphemous) | `blasphemous` |\n| `itch` | itch.io | usuario/juego, de la URL de itch.io | `kiriboo/dipets` |\n| `playstation` | PlayStation Store | código de producto o id de concepto (también product:<código> o concept:<número>) | `EP4064-CUSA16261_00-BLASPHEMOUS00000` |\n| `xbox` | Xbox | id de producto de la Microsoft Store | `9P0478ZTXLZ4` |\n| `nintendo` | Nintendo eShop | id de la eShop europea (el número del final de la URL) (también eu:1629870; las pocas fichas solo americanas, us:<slug>) | `1629870` |\n| `appstore` | App Store | id de la App Store (sin «id») | `6499431452` |\n| `googleplay` | Google Play | id del paquete | `com.thegamekitchen.blasphemousmobile` |\n| `devuego` | DeVuego | identificador en DeVuego | `DVGO20170817JG002089` |\n| `devuego_lat` | DeVuego LATAM | identificador en DeVuego LATAM |  |\n| `devuego_pt` | DeVuego Portugal | identificador en DeVuego Portugal |  |\n| `doblaje` | DoblajeVideojuegos.es | identificador en DoblajeVideojuegos.es |  |\n| `wikipedia_es` | Wikipedia (es) | identificador en Wikipedia (es) | `Blasphemous` |\n| `wikipedia_en` | Wikipedia (en) | identificador en Wikipedia (en) | `Blasphemous_(video_game)` |\n| `igdb` | IGDB | identificador en IGDB | `blasphemous` |\n| `mobygames` | MobyGames | identificador en MobyGames | `134455` |\n| `hltb` | HowLongToBeat | identificador en HowLongToBeat | `62047` |\n| `opencritic` | OpenCritic | identificador en OpenCritic | `8241` |\n| `metacritic` | Metacritic | identificador en Metacritic | `blasphemous` |\n| `pcgamingwiki` | PCGamingWiki | identificador en PCGamingWiki | `Blasphemous` |\n| `giantbomb` | Giant Bomb | identificador en Giant Bomb | `3030-65435` |\n| `rawg` | RAWG | identificador en RAWG | `blasphemous` |\n| `wikidata` | Wikidata | identificador en Wikidata | `Q67317244` |"
        },
        {
            "name": "listados",
            "description": "Búsquedas, empresas y cifras"
        }
    ],
    "paths": {
        "/id/{id}": {
            "get": {
                "tags": [
                    "fichas"
                ],
                "operationId": "juegoPorId",
                "summary": "Ficha por id de ludoteca.dev",
                "description": "La forma recomendada de guardar una referencia a una ficha: el id no cambia nunca. Si la ficha era un duplicado fusionado, devuelve la que se quedó.",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^(?:[Ll][Dd][Tt]-?)?[1-9][0-9]*$"
                        },
                        "example": "LDT-1819",
                        "description": "LDT-1819, ldt1819 o 1819"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "La ficha",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Juego"
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteSuperado"
                    }
                }
            }
        },
        "/juego/{slug}": {
            "get": {
                "tags": [
                    "fichas"
                ],
                "operationId": "juegoPorSlug",
                "summary": "Ficha por slug",
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "pattern": "^[a-z0-9-]+$"
                        },
                        "example": "blasphemous"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "La ficha",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Juego"
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteSuperado"
                    }
                }
            }
        },
        "/steam/{appid}": {
            "get": {
                "tags": [
                    "fichas"
                ],
                "operationId": "juegoPorAppidSteam",
                "summary": "Ficha por appid de Steam (la crea si no existe)",
                "description": "A diferencia de `/externo/steam/{id}`, si el juego aún no está en ludoteca.dev se importa de Steam: responde 202 y la ficha está lista en unos minutos.",
                "parameters": [
                    {
                        "name": "appid",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        },
                        "example": 774361
                    }
                ],
                "responses": {
                    "200": {
                        "description": "La ficha",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Juego"
                                }
                            }
                        }
                    },
                    "202": {
                        "$ref": "#/components/responses/EnPreparacion"
                    },
                    "404": {
                        "$ref": "#/components/responses/NoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteSuperado"
                    }
                }
            }
        },
        "/externo/{fuente}/{id}": {
            "get": {
                "tags": [
                    "equivalencias"
                ],
                "operationId": "juegoPorIdExterno",
                "summary": "Ficha por id en otra tienda o base de datos",
                "description": "Con el id de un juego en cualquier fuente, su ficha con los ids de todas las demás. Solo consulta: no crea fichas.\n\nSe acepta el id tal como aparece en la URL de la tienda (p. ej. `1629870` en la eShop) o en el formato del campo `tiendas[].id` (`eu:1629870`).",
                "parameters": [
                    {
                        "name": "fuente",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "$ref": "#/components/schemas/Fuente"
                        },
                        "example": "xbox"
                    },
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "example": "9P0478ZTXLZ4",
                        "description": "Puede llevar barras (itch: `usuario/juego`); los caracteres especiales, codificados como en cualquier URL."
                    }
                ],
                "responses": {
                    "200": {
                        "description": "La ficha",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Juego"
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/PeticionErronea"
                    },
                    "404": {
                        "$ref": "#/components/responses/NoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteSuperado"
                    }
                }
            }
        },
        "/externo/{fuente}": {
            "get": {
                "tags": [
                    "equivalencias"
                ],
                "operationId": "equivalenciasLote",
                "summary": "Equivalencias de hasta 100 ids de una fuente",
                "description": "Cuenta como una sola petición para el límite. Para más de unos miles de ids, mejor la descarga abierta.",
                "parameters": [
                    {
                        "name": "fuente",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "$ref": "#/components/schemas/Fuente"
                        },
                        "example": "wikidata"
                    },
                    {
                        "name": "ids",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "example": "Q67317244,Q55641138",
                        "description": "Entre 1 y 100 ids separados por comas"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Los encontrados y los que no",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "juegos": {
                                            "type": "object",
                                            "description": "Los encontrados, con el id tal como se pidió como clave",
                                            "additionalProperties": {
                                                "$ref": "#/components/schemas/JuegoLote"
                                            }
                                        },
                                        "no_encontrados": {
                                            "type": "array",
                                            "items": {
                                                "type": "string"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/PeticionErronea"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteSuperado"
                    }
                }
            }
        },
        "/externo": {
            "get": {
                "tags": [
                    "equivalencias"
                ],
                "operationId": "fuentes",
                "summary": "Fuentes que se pueden consultar",
                "responses": {
                    "200": {
                        "description": "Cada fuente con el formato de su id y un ejemplo",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "fuentes": {
                                            "type": "object",
                                            "additionalProperties": {
                                                "type": "object",
                                                "properties": {
                                                    "nombre": {
                                                        "type": "string"
                                                    },
                                                    "tipo": {
                                                        "type": "string",
                                                        "enum": [
                                                            "tienda",
                                                            "ids"
                                                        ]
                                                    },
                                                    "id": {
                                                        "type": "string"
                                                    },
                                                    "ejemplo": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "nota": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "url_ejemplo": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ],
                                                        "format": "uri"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteSuperado"
                    }
                }
            }
        },
        "/steam": {
            "get": {
                "tags": [
                    "equivalencias"
                ],
                "operationId": "steamLote",
                "summary": "Fichas de hasta 100 appids de Steam",
                "description": "Lo mismo que `/externo/steam?ids=`, con otro nombre de parámetro (se mantiene por compatibilidad).",
                "parameters": [
                    {
                        "name": "appids",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "example": "774361,606150"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Los encontrados y los que no",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "juegos": {
                                            "type": "object",
                                            "description": "Los encontrados, con el appid tal como se pidió como clave",
                                            "additionalProperties": {
                                                "$ref": "#/components/schemas/JuegoLote"
                                            }
                                        },
                                        "no_encontrados": {
                                            "type": "array",
                                            "items": {
                                                "type": "string"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/PeticionErronea"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteSuperado"
                    }
                }
            }
        },
        "/buscar": {
            "get": {
                "tags": [
                    "listados"
                ],
                "operationId": "buscar",
                "summary": "Buscar por título y filtrar",
                "description": "Sin `q` devuelve los últimos publicados (con los filtros que se indiquen).",
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "minLength": 2,
                            "maxLength": 100
                        },
                        "example": "blasphemous"
                    },
                    {
                        "name": "tienda",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "steam",
                                "epic",
                                "gog",
                                "itch",
                                "playstation",
                                "xbox",
                                "nintendo",
                                "appstore",
                                "googleplay"
                            ]
                        }
                    },
                    {
                        "name": "pais",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "pattern": "^[A-Za-z]{2}$"
                        },
                        "description": "Código ISO 3166-1 del país del estudio",
                        "example": "ES"
                    },
                    {
                        "name": "ano",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "minimum": 1950,
                            "maximum": 2099
                        }
                    },
                    {
                        "name": "genero",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Clave de género (ver `/indice/generos`)",
                        "example": "rol"
                    },
                    {
                        "name": "saga",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Clave de saga (ver `/indice/sagas`)"
                    },
                    {
                        "name": "motor",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Clave de motor (ver `/indice/motores`)",
                        "example": "unity"
                    },
                    {
                        "name": "fisico",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        },
                        "description": "Con edición física: `1` en cualquier plataforma o la clave de una (ver `/indice/fisico`). Solo consta el «sí» (eShop de Nintendo y DeVuego).",
                        "example": "switch"
                    },
                    {
                        "name": "proximamente",
                        "in": "query",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "1"
                            ]
                        },
                        "description": "Solo próximos lanzamientos (sin q: el más cercano primero)"
                    },
                    {
                        "name": "limite",
                        "in": "query",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 100,
                            "default": 20
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Resultados",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "resultados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "id": {
                                                        "type": "string"
                                                    },
                                                    "slug": {
                                                        "type": "string"
                                                    },
                                                    "titulo": {
                                                        "type": "string"
                                                    },
                                                    "ano": {
                                                        "type": [
                                                            "integer",
                                                            "null"
                                                        ]
                                                    },
                                                    "proximamente": {
                                                        "type": "boolean"
                                                    },
                                                    "estudio": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    },
                                                    "pais": {
                                                        "type": [
                                                            "string",
                                                            "null"
                                                        ]
                                                    }
                                                }
                                            }
                                        },
                                        "hay_mas": {
                                            "type": "boolean"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "400": {
                        "$ref": "#/components/responses/PeticionErronea"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteSuperado"
                    }
                }
            }
        },
        "/empresa/{slug}": {
            "get": {
                "tags": [
                    "listados"
                ],
                "operationId": "empresa",
                "summary": "Estudio o editora con su país y sus juegos",
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "example": "the-game-kitchen"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "La empresa",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Empresa"
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteSuperado"
                    }
                }
            }
        },
        "/indice/{tipo}": {
            "get": {
                "tags": [
                    "listados"
                ],
                "operationId": "indice",
                "summary": "Géneros, sagas, motores, países, años o plataformas con edición física, con su número de juegos",
                "description": "La `clave` de cada resultado es el valor del filtro correspondiente en `/buscar` (`genero`, `saga`, `motor`, `pais`, `ano`, `fisico`).",
                "parameters": [
                    {
                        "name": "tipo",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string",
                            "enum": [
                                "generos",
                                "sagas",
                                "motores",
                                "paises",
                                "anos",
                                "fisico"
                            ]
                        },
                        "example": "generos"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "El índice",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "indice": {
                                            "type": "string"
                                        },
                                        "filtro": {
                                            "type": "string"
                                        },
                                        "resultados": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "clave": {
                                                        "type": "string"
                                                    },
                                                    "nombre": {
                                                        "type": "string"
                                                    },
                                                    "juegos": {
                                                        "type": "integer"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteSuperado"
                    }
                }
            }
        },
        "/info": {
            "get": {
                "tags": [
                    "listados"
                ],
                "operationId": "info",
                "summary": "Cifras generales y tiendas",
                "responses": {
                    "200": {
                        "description": "Cifras",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "publicados": {
                                            "type": "integer"
                                        },
                                        "importados": {
                                            "type": "integer"
                                        },
                                        "en_cola": {
                                            "type": "integer"
                                        },
                                        "actualizado": {
                                            "type": [
                                                "string",
                                                "null"
                                            ]
                                        },
                                        "tiendas": {
                                            "type": "array",
                                            "items": {
                                                "type": "object",
                                                "properties": {
                                                    "clave": {
                                                        "type": "string"
                                                    },
                                                    "nombre": {
                                                        "type": "string"
                                                    },
                                                    "juegos": {
                                                        "type": "integer"
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteSuperado"
                    }
                }
            }
        },
        "/aleatorio": {
            "get": {
                "tags": [
                    "fichas"
                ],
                "operationId": "aleatorio",
                "summary": "Una ficha al azar",
                "responses": {
                    "200": {
                        "description": "La ficha",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Juego"
                                }
                            }
                        }
                    },
                    "404": {
                        "$ref": "#/components/responses/NoEncontrado"
                    },
                    "429": {
                        "$ref": "#/components/responses/LimiteSuperado"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "Fuente": {
                "type": "string",
                "enum": [
                    "steam",
                    "epic",
                    "gog",
                    "itch",
                    "playstation",
                    "xbox",
                    "nintendo",
                    "appstore",
                    "googleplay",
                    "devuego",
                    "devuego_lat",
                    "devuego_pt",
                    "doblaje",
                    "wikipedia_es",
                    "wikipedia_en",
                    "igdb",
                    "mobygames",
                    "hltb",
                    "opencritic",
                    "metacritic",
                    "pcgamingwiki",
                    "giantbomb",
                    "rawg",
                    "wikidata"
                ],
                "description": "Tienda o base de datos"
            },
            "Juego": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "Id de ludoteca.dev: estable, no cambia aunque cambie el slug",
                        "example": "LDT-1819"
                    },
                    "titulo": {
                        "type": "string",
                        "description": "Título",
                        "example": "Blasphemous"
                    },
                    "titulo_original": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Título en chino, japonés o coreano cuando el título es la traducción inglesa de Steam",
                        "example": "伊始之猫"
                    },
                    "ano": {
                        "type": [
                            "integer",
                            "null"
                        ],
                        "description": "Año de lanzamiento",
                        "example": 2019
                    },
                    "lanzamiento": {
                        "type": "object",
                        "properties": {
                            "fecha": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Tal como la da la tienda (\"10 SEP 2019\", \"Por confirmarse\")"
                            },
                            "proximamente": {
                                "type": "boolean"
                            }
                        }
                    },
                    "url_ficha": {
                        "type": "string",
                        "description": "URL de la ficha",
                        "format": "uri"
                    },
                    "url_permanente": {
                        "type": "string",
                        "description": "URL que redirige siempre a la ficha (/id/LDT-n)",
                        "format": "uri"
                    },
                    "descripcion": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "idioma_descripcion": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "es",
                            "en",
                            null
                        ],
                        "description": "\"en\" cuando la única descripción disponible es en inglés"
                    },
                    "traduccion_automatica": {
                        "type": "boolean",
                        "description": "La descripción es una traducción automática del inglés (no había ninguna en español en las tiendas)"
                    },
                    "portada": {
                        "type": "object",
                        "description": "Copias reducidas servidas por ludoteca.dev (WebP); las originales de la tienda, en origen",
                        "properties": {
                            "grande": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "uri"
                            },
                            "mini": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "uri"
                            },
                            "vertical": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "uri"
                            },
                            "horizontal": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "format": "uri"
                            },
                            "origen": {
                                "type": "object",
                                "properties": {
                                    "vertical": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    },
                                    "horizontal": {
                                        "type": [
                                            "string",
                                            "null"
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "captura": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "Una captura del juego en marcha (de momento, de Steam): imagen reducida servida por ludoteca.dev y la original de la tienda",
                        "properties": {
                            "imagen": {
                                "type": "string",
                                "format": "uri"
                            },
                            "origen": {
                                "type": "string",
                                "format": "uri"
                            }
                        }
                    },
                    "estudio": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Desarrollador, como texto"
                    },
                    "desarrollador": {
                        "type": "null",
                        "description": "Siempre null (compatibilidad con el formato de DeVuego, donde es una persona)"
                    },
                    "editora": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "pais": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "ISO 3166-1 del estudio desarrollador",
                        "example": "ES"
                    },
                    "pais_fuente": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "enum": [
                            "estudio",
                            "editora",
                            "wikidata",
                            "devuego",
                            "manual",
                            null
                        ],
                        "description": "De dónde sale el país. «editora»: la tienda no dice qué estudio lo desarrolla y es el de su editora (deducción)"
                    },
                    "empresas": {
                        "type": "object",
                        "properties": {
                            "desarrolladores": {
                                "type": "array",
                                "items": {
                                    "$ref": "#/components/schemas/EmpresaCorta"
                                }
                            },
                            "editoras": {
                                "type": "array",
                                "items": {
                                    "$ref": "#/components/schemas/EmpresaCorta"
                                }
                            }
                        }
                    },
                    "tiendas": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Tienda"
                        }
                    },
                    "otras_versiones": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Version"
                        }
                    },
                    "tiendas_retiradas": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/TiendaRetirada"
                        },
                        "description": "Tiendas en las que estuvo y ya no se vende (delisted). Aparte de tiendas para no enlazarlas como sitio donde comprar."
                    },
                    "compra_fisica": {
                        "type": "array",
                        "description": "Dónde comprar la edición física: tiendas de ediciones físicas (GAME, Tesura Games) que la tienen en su catálogo, una entrada por tienda y plataforma.",
                        "items": {
                            "type": "object",
                            "properties": {
                                "tienda": {
                                    "type": "string",
                                    "example": "game"
                                },
                                "nombre": {
                                    "type": "string",
                                    "example": "GAME"
                                },
                                "plataforma": {
                                    "type": "string",
                                    "description": "Clave de la plataforma (la de etiquetas.fisico)",
                                    "example": "playstation-5"
                                },
                                "url": {
                                    "type": "string",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "ids": {
                        "type": "object",
                        "description": "Ids en otras bases de datos",
                        "additionalProperties": {
                            "type": "object",
                            "properties": {
                                "id": {
                                    "type": "string"
                                },
                                "url": {
                                    "type": "string",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "valoraciones": {
                        "type": "object",
                        "description": "Solo las que existen. steam: la de los jugadores (se refresca con la cola de Steam). opencritic: media de la crítica sobre 100 según Wikidata (CC0), con la fecha de ese dato: no siempre es la actual, la vigente está en url.",
                        "properties": {
                            "steam": {
                                "type": "object",
                                "properties": {
                                    "categoria": {
                                        "type": "string",
                                        "enum": [
                                            "extremadamente_positivas",
                                            "muy_positivas",
                                            "positivas",
                                            "mayormente_positivas",
                                            "variadas",
                                            "mayormente_negativas",
                                            "negativas",
                                            "muy_negativas",
                                            "extremadamente_negativas"
                                        ]
                                    },
                                    "texto": {
                                        "type": "string",
                                        "example": "Muy positivas"
                                    },
                                    "resenas": {
                                        "type": "integer",
                                        "example": 148320
                                    },
                                    "url": {
                                        "type": "string",
                                        "format": "uri"
                                    }
                                }
                            },
                            "opencritic": {
                                "type": "object",
                                "properties": {
                                    "nota": {
                                        "type": "integer",
                                        "minimum": 0,
                                        "maximum": 100,
                                        "example": 84
                                    },
                                    "fecha": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "date"
                                    },
                                    "url": {
                                        "type": [
                                            "string",
                                            "null"
                                        ],
                                        "format": "uri"
                                    },
                                    "fuente": {
                                        "type": "string",
                                        "enum": [
                                            "wikidata"
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "compatibilidad": {
                        "type": "object",
                        "description": "Solo lo que se sabe, de la versión de Steam. Se comprueba cada ~90 días (comprobado = fecha).",
                        "properties": {
                            "steam_deck": {
                                "type": "object",
                                "description": "Veredicto de Valve",
                                "properties": {
                                    "nivel": {
                                        "type": "string",
                                        "enum": [
                                            "verificado",
                                            "jugable",
                                            "no_compatible"
                                        ]
                                    },
                                    "texto": {
                                        "type": "string",
                                        "example": "Verificado"
                                    },
                                    "url": {
                                        "type": "string",
                                        "format": "uri"
                                    },
                                    "comprobado": {
                                        "type": "string",
                                        "format": "date"
                                    }
                                }
                            },
                            "protondb": {
                                "type": "object",
                                "description": "Linux vía Proton, según los informes de la comunidad en ProtonDB",
                                "properties": {
                                    "nivel": {
                                        "type": "string",
                                        "enum": [
                                            "native",
                                            "platinum",
                                            "gold",
                                            "silver",
                                            "bronze",
                                            "borked",
                                            "pending"
                                        ]
                                    },
                                    "url": {
                                        "type": "string",
                                        "format": "uri"
                                    },
                                    "comprobado": {
                                        "type": "string",
                                        "format": "date"
                                    }
                                }
                            }
                        }
                    },
                    "etiquetas": {
                        "type": "object",
                        "description": "generos: unificados de los de cada tienda. saga y motor: de Wikidata. acceso: game-pass y ea-play (Xbox), ps-plus (catálogo de PS Plus Extra), gratis, demo, acceso-anticipado. fisico: plataformas con edición física (eShop de Nintendo y DeVuego; solo consta el «sí»). Cada una con la URL de su listado en ludoteca.dev (o null).",
                        "properties": {
                            "generos": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "clave": {
                                            "type": "string",
                                            "example": "rol"
                                        },
                                        "nombre": {
                                            "type": "string",
                                            "example": "Rol"
                                        },
                                        "url": {
                                            "type": [
                                                "string",
                                                "null"
                                            ],
                                            "format": "uri"
                                        }
                                    }
                                }
                            },
                            "saga": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "clave": {
                                            "type": "string",
                                            "example": "rol"
                                        },
                                        "nombre": {
                                            "type": "string",
                                            "example": "Rol"
                                        },
                                        "url": {
                                            "type": [
                                                "string",
                                                "null"
                                            ],
                                            "format": "uri"
                                        }
                                    }
                                }
                            },
                            "motor": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "clave": {
                                            "type": "string",
                                            "example": "rol"
                                        },
                                        "nombre": {
                                            "type": "string",
                                            "example": "Rol"
                                        },
                                        "url": {
                                            "type": [
                                                "string",
                                                "null"
                                            ],
                                            "format": "uri"
                                        }
                                    }
                                }
                            },
                            "acceso": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "clave": {
                                            "type": "string",
                                            "example": "rol"
                                        },
                                        "nombre": {
                                            "type": "string",
                                            "example": "Rol"
                                        },
                                        "url": {
                                            "type": [
                                                "string",
                                                "null"
                                            ],
                                            "format": "uri"
                                        }
                                    }
                                }
                            },
                            "fisico": {
                                "type": "array",
                                "items": {
                                    "type": "object",
                                    "properties": {
                                        "clave": {
                                            "type": "string",
                                            "example": "rol"
                                        },
                                        "nombre": {
                                            "type": "string",
                                            "example": "Rol"
                                        },
                                        "url": {
                                            "type": [
                                                "string",
                                                "null"
                                            ],
                                            "format": "uri"
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "tecnico": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "Datos técnicos. Cada tienda describe su versión (el tamaño en Switch no es el de PC), así que van por tienda; solo aparecen los campos que esa tienda da. null si no hay ninguno.",
                        "properties": {
                            "pegi": {
                                "type": [
                                    "object",
                                    "null"
                                ],
                                "description": "La edad que dan más tiendas",
                                "properties": {
                                    "edad": {
                                        "type": "integer",
                                        "enum": [
                                            3,
                                            7,
                                            12,
                                            16,
                                            18
                                        ]
                                    },
                                    "descriptores": {
                                        "type": "array",
                                        "items": {
                                            "type": "string",
                                            "enum": [
                                                "violencia",
                                                "lenguaje",
                                                "miedo",
                                                "drogas",
                                                "sexo",
                                                "discriminacion",
                                                "juego",
                                                "compras"
                                            ]
                                        }
                                    }
                                }
                            },
                            "idiomas": {
                                "type": "object",
                                "description": "Códigos BCP 47 (en, es-ES, es-419, zh-Hans...) de todas las tiendas",
                                "properties": {
                                    "textos": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        }
                                    },
                                    "voces": {
                                        "type": "array",
                                        "items": {
                                            "type": "string"
                                        },
                                        "description": "Doblaje (solo lo da Steam)"
                                    }
                                }
                            },
                            "tiendas": {
                                "type": "object",
                                "description": "Por clave de tienda (steam, nintendo, xbox, playstation...)",
                                "additionalProperties": {
                                    "type": "object",
                                    "properties": {
                                        "plataformas": {
                                            "type": "array",
                                            "items": {
                                                "type": "string"
                                            },
                                            "example": [
                                                "windows",
                                                "macos",
                                                "linux"
                                            ]
                                        },
                                        "tamano_mb": {
                                            "type": "integer",
                                            "example": 4096
                                        },
                                        "tamano_tipo": {
                                            "type": "string",
                                            "enum": [
                                                "disco",
                                                "descarga"
                                            ],
                                            "description": "disco: espacio que pide en PC; descarga: lo que ocupa al bajarlo"
                                        },
                                        "requisitos": {
                                            "type": "object",
                                            "description": "{\"min\": {\"so\", \"cpu\", \"ram\", \"gpu\", \"directx\", \"disco\"}, \"rec\": {...}} (PC, de Steam)"
                                        },
                                        "mando": {
                                            "type": "string",
                                            "enum": [
                                                "total",
                                                "parcial"
                                            ]
                                        },
                                        "logros": {
                                            "type": "integer"
                                        },
                                        "jugadores": {
                                            "type": "integer",
                                            "description": "Máximo de jugadores"
                                        },
                                        "funciones": {
                                            "type": "array",
                                            "items": {
                                                "type": "string",
                                                "enum": [
                                                    "un_jugador",
                                                    "multijugador",
                                                    "multijugador_online",
                                                    "multijugador_local",
                                                    "cooperativo",
                                                    "coop_online",
                                                    "coop_local",
                                                    "pantalla_partida",
                                                    "pvp",
                                                    "pvp_online",
                                                    "pvp_local",
                                                    "mmo",
                                                    "juego_cruzado",
                                                    "modo_tv",
                                                    "modo_sobremesa",
                                                    "modo_portatil",
                                                    "nube",
                                                    "necesita_conexion",
                                                    "chat_voz",
                                                    "remote_play",
                                                    "remote_play_together",
                                                    "play_anywhere",
                                                    "optimizado_series",
                                                    "mejorado_ps5pro",
                                                    "vibracion_dualsense",
                                                    "gatillos_adaptativos",
                                                    "4k",
                                                    "hdr",
                                                    "120fps",
                                                    "raytracing",
                                                    "vr",
                                                    "workshop",
                                                    "subtitulos",
                                                    "compras",
                                                    "demo",
                                                    "version_fisica",
                                                    "gratis",
                                                    "acceso_anticipado"
                                                ]
                                            }
                                        },
                                        "pegi": {
                                            "type": "integer"
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            },
            "JuegoLote": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string",
                        "description": "Id de ludoteca.dev",
                        "example": "LDT-1819"
                    },
                    "slug": {
                        "type": "string",
                        "description": "Slug de la ficha",
                        "example": "blasphemous"
                    },
                    "titulo": {
                        "type": "string",
                        "description": "Título",
                        "example": "Blasphemous"
                    },
                    "url_ficha": {
                        "type": "string",
                        "description": "URL de la ficha",
                        "format": "uri"
                    },
                    "tiendas": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/Tienda"
                        }
                    },
                    "ids": {
                        "type": "object",
                        "description": "Ids en otras bases de datos: {\"wikidata\": \"Q67317244\", \"igdb\": \"blasphemous\", ...}",
                        "additionalProperties": {
                            "type": "string"
                        }
                    }
                }
            },
            "Tienda": {
                "type": "object",
                "properties": {
                    "clave": {
                        "type": "string",
                        "enum": [
                            "steam",
                            "epic",
                            "gog",
                            "itch",
                            "playstation",
                            "xbox",
                            "nintendo",
                            "appstore",
                            "googleplay"
                        ]
                    },
                    "nombre": {
                        "type": "string",
                        "example": "Xbox"
                    },
                    "id": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Id en la tienda, en el formato que acepta /externo/{clave}/{id}; null si no se conoce",
                        "example": "9P0478ZTXLZ4"
                    },
                    "url": {
                        "type": "string",
                        "format": "uri"
                    },
                    "icono": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "uri"
                    },
                    "color": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "fuente": {
                        "type": "string",
                        "description": "De dónde salió el enlace: la tienda de origen, catalogo, wikidata, busqueda, devuego o revisado (confirmado a mano)"
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Título en esa tienda (puede llevar la edición o la plataforma)",
                        "example": "Blasphemous"
                    },
                    "editora": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Editora según esa tienda (cambia a menudo en consolas y GOG)"
                    },
                    "desarrollador": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Desarrollador según esa tienda"
                    },
                    "fecha": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Fecha de lanzamiento en esa tienda, tal como la da"
                    }
                }
            },
            "TiendaRetirada": {
                "type": "object",
                "properties": {
                    "clave": {
                        "type": "string",
                        "enum": [
                            "steam",
                            "epic",
                            "gog",
                            "itch",
                            "playstation",
                            "xbox",
                            "nintendo",
                            "appstore",
                            "googleplay"
                        ]
                    },
                    "nombre": {
                        "type": "string"
                    },
                    "id": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "url": {
                        "type": "string",
                        "format": "uri",
                        "description": "La URL que tenía (probablemente ya no funciona)"
                    },
                    "url_archivo": {
                        "type": "string",
                        "format": "uri",
                        "description": "Copia en Wayback Machine (archive.org), la más cercana a la retirada"
                    },
                    "retirado_desde": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "format": "date",
                        "description": "Cuándo se detectó o se marcó la retirada (no la fecha exacta)"
                    }
                }
            },
            "Version": {
                "type": "object",
                "description": "Otra versión del juego en una tienda que ya tiene enlace (PS4 y PS5, Xbox One y Series...)",
                "properties": {
                    "clave": {
                        "type": "string",
                        "enum": [
                            "steam",
                            "epic",
                            "gog",
                            "itch",
                            "playstation",
                            "xbox",
                            "nintendo",
                            "appstore",
                            "googleplay"
                        ]
                    },
                    "nombre": {
                        "type": "string"
                    },
                    "id": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "url": {
                        "type": "string",
                        "format": "uri"
                    },
                    "titulo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "editora": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "desarrollador": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "fecha": {
                        "type": [
                            "string",
                            "null"
                        ]
                    }
                }
            },
            "EmpresaCorta": {
                "type": "object",
                "properties": {
                    "nombre": {
                        "type": "string"
                    },
                    "nombre_original": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "En chino, japonés o coreano, si «nombre» es el nombre latino"
                    },
                    "slug": {
                        "type": "string"
                    },
                    "pais": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "url": {
                        "type": "string",
                        "format": "uri"
                    }
                }
            },
            "Empresa": {
                "type": "object",
                "properties": {
                    "nombre": {
                        "type": "string"
                    },
                    "nombre_original": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "En chino, japonés o coreano, si «nombre» es el nombre latino"
                    },
                    "slug": {
                        "type": "string"
                    },
                    "pais": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "wikidata": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "url": {
                        "type": "string",
                        "format": "uri"
                    },
                    "desarrollados": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/JuegoCorto"
                        }
                    },
                    "editados": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/JuegoCorto"
                        }
                    }
                }
            },
            "JuegoCorto": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string"
                    },
                    "slug": {
                        "type": "string"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "ano": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "proximamente": {
                        "type": "boolean"
                    },
                    "url_ficha": {
                        "type": "string",
                        "format": "uri"
                    },
                    "solo_en": {
                        "type": [
                            "array",
                            "null"
                        ],
                        "items": {
                            "type": "string"
                        },
                        "description": "Claves de las tiendas en las que la empresa edita este juego, cuando no es la editora principal; null si lo es"
                    }
                }
            },
            "Error": {
                "type": "object",
                "properties": {
                    "error": {
                        "type": "string"
                    }
                }
            }
        },
        "responses": {
            "NoEncontrado": {
                "description": "No existe",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        }
                    }
                }
            },
            "PeticionErronea": {
                "description": "Petición mal formada",
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        }
                    }
                }
            },
            "EnPreparacion": {
                "description": "Ficha en preparación: reintenta en unos minutos",
                "headers": {
                    "Retry-After": {
                        "schema": {
                            "type": "integer"
                        }
                    }
                },
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        }
                    }
                }
            },
            "LimiteSuperado": {
                "description": "Límite de peticiones superado",
                "headers": {
                    "Retry-After": {
                        "schema": {
                            "type": "integer"
                        }
                    }
                },
                "content": {
                    "application/json": {
                        "schema": {
                            "$ref": "#/components/schemas/Error"
                        }
                    }
                }
            }
        }
    }
}