{
    "openapi": "3.0.0",
    "info": {
        "title": "MultiResultados API",
        "description": "API privada de alto rendimiento para consulta de resultados de Animalitos (tabla `resultadosAnimalitosOficial`) y Loterías (tabla `resultadosLoteriasOficial`).",
        "version": "1.0.0",
        "contact": {
            "name": "Soporte MultiResultados",
            "url": "https://multiresultados.com"
        }
    },
    "servers": [
        {
            "url": "https://api.multiresultados.com",
            "description": "Servidor de Producción"
        }
    ],
    "security": [
        {
            "ApiKeyAuth": []
        },
        {
            "BearerAuth": []
        },
        {
            "ApiKeyQuery": []
        }
    ],
    "paths": {
        "/v1/animalitos": {
            "get": {
                "summary": "Listar resultados de Animalitos",
                "description": "Obtiene los resultados de la tabla `resultadosAnimalitosOficial`. Por defecto filtra por la fecha actual si no se especifica otra.",
                "parameters": [
                    {
                        "name": "fecha",
                        "in": "query",
                        "required": false,
                        "description": "Fecha específica en formato YYYY-MM-DD (ej: 2026-10-31), o \"all\" para ignorar filtro de fecha.",
                        "schema": {
                            "type": "string",
                            "example": "2026-10-31"
                        }
                    },
                    {
                        "name": "fecha_inicio",
                        "in": "query",
                        "required": false,
                        "description": "Rango inicial de fecha (YYYY-MM-DD)",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "fecha_fin",
                        "in": "query",
                        "required": false,
                        "description": "Rango final de fecha (YYYY-MM-DD)",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "sorteo",
                        "in": "query",
                        "required": false,
                        "description": "Nombre del sorteo (ej: Lotto Activo, Ruleta Royal, Panda Plus, El Granjazo)",
                        "schema": {
                            "type": "string",
                            "example": "Lotto Activo"
                        }
                    },
                    {
                        "name": "exact",
                        "in": "query",
                        "required": false,
                        "description": "Si es 1/true, busca el nombre del sorteo exacto en vez de coincidencia parcial",
                        "schema": {
                            "type": "boolean"
                        }
                    },
                    {
                        "name": "numero",
                        "in": "query",
                        "required": false,
                        "description": "Número del animalito sorteado",
                        "schema": {
                            "type": "integer",
                            "example": 47
                        }
                    },
                    {
                        "name": "figura",
                        "in": "query",
                        "required": false,
                        "description": "Nombre del animal o figura (ej: Perro, Leon, PavoReal)",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "hora",
                        "in": "query",
                        "required": false,
                        "description": "Hora del sorteo (HH:MM o HH:MM:SS, ej: 13:30 o 13:30:00)",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "group_by",
                        "in": "query",
                        "required": false,
                        "description": "Agrupar resultados por sorteo si se establece en \"sorteo\"",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "sorteo"
                            ]
                        }
                    },
                    {
                        "name": "order",
                        "in": "query",
                        "required": false,
                        "description": "Orden de resultados (ASC o DESC, default DESC)",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "ASC",
                                "DESC"
                            ],
                            "default": "DESC"
                        }
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "required": false,
                        "description": "Cantidad de resultados por página (1-500, default 50)",
                        "schema": {
                            "type": "integer",
                            "default": 50
                        }
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Número de página para paginación (default 1)",
                        "schema": {
                            "type": "integer",
                            "default": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Lista de resultados obtenida con éxito"
                    },
                    "401": {
                        "description": "No autorizado / API Key inválida"
                    },
                    "400": {
                        "description": "Parámetros inválidos"
                    }
                }
            }
        },
        "/v1/animalitos/{id}": {
            "get": {
                "summary": "Obtener un resultado de animalito por ID",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "ID numérico del registro"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Detalle del registro"
                    },
                    "404": {
                        "description": "Registro no encontrado"
                    },
                    "401": {
                        "description": "No autorizado"
                    }
                }
            }
        },
        "/v1/animalitos/sorteos": {
            "get": {
                "summary": "Lista de sorteos de animalitos disponibles",
                "description": "Retorna la lista única de sorteos registrados con estadísticas.",
                "responses": {
                    "200": {
                        "description": "Lista de sorteos"
                    },
                    "401": {
                        "description": "No autorizado"
                    }
                }
            }
        },
        "/v1/loterias": {
            "get": {
                "summary": "Listar resultados de Loterías",
                "description": "Obtiene los resultados de la tabla `resultadosLoteriasOficial`. Por defecto filtra por la fecha actual si no se especifica otra.",
                "parameters": [
                    {
                        "name": "fecha",
                        "in": "query",
                        "required": false,
                        "description": "Fecha específica en formato YYYY-MM-DD (ej: 2026-10-31), o \"all\" para ignorar filtro de fecha.",
                        "schema": {
                            "type": "string",
                            "example": "2026-10-31"
                        }
                    },
                    {
                        "name": "fecha_inicio",
                        "in": "query",
                        "required": false,
                        "description": "Rango inicial de fecha (YYYY-MM-DD)",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "fecha_fin",
                        "in": "query",
                        "required": false,
                        "description": "Rango final de fecha (YYYY-MM-DD)",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "sorteo",
                        "in": "query",
                        "required": false,
                        "description": "Nombre del sorteo (ej: Triple Caracas, Triple Caliente, Táchira Zodiacal, La Ruca)",
                        "schema": {
                            "type": "string",
                            "example": "Triple Caracas"
                        }
                    },
                    {
                        "name": "resultado",
                        "in": "query",
                        "required": false,
                        "description": "Número o resultado sorteado (ej: 401)",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "hora",
                        "in": "query",
                        "required": false,
                        "description": "Hora del sorteo (HH:MM o HH:MM:SS, ej: 13:00)",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "group_by",
                        "in": "query",
                        "required": false,
                        "description": "Agrupar resultados por sorteo si se establece en \"sorteo\"",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "sorteo"
                            ]
                        }
                    },
                    {
                        "name": "order",
                        "in": "query",
                        "required": false,
                        "description": "Orden de resultados (ASC o DESC, default DESC)",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "ASC",
                                "DESC"
                            ],
                            "default": "DESC"
                        }
                    },
                    {
                        "name": "limit",
                        "in": "query",
                        "required": false,
                        "description": "Cantidad de resultados por página (1-500, default 50)",
                        "schema": {
                            "type": "integer",
                            "default": 50
                        }
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Número de página para paginación (default 1)",
                        "schema": {
                            "type": "integer",
                            "default": 1
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Lista de resultados obtenida con éxito"
                    },
                    "401": {
                        "description": "No autorizado / API Key inválida"
                    },
                    "400": {
                        "description": "Parámetros inválidos"
                    }
                }
            }
        },
        "/v1/loterias/{id}": {
            "get": {
                "summary": "Obtener un resultado de lotería por ID",
                "parameters": [
                    {
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "integer"
                        },
                        "description": "ID numérico del registro"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Detalle del registro"
                    },
                    "404": {
                        "description": "Registro no encontrado"
                    },
                    "401": {
                        "description": "No autorizado"
                    }
                }
            }
        },
        "/v1/loterias/sorteos": {
            "get": {
                "summary": "Lista de sorteos de loterías disponibles",
                "description": "Retorna la lista única de sorteos registrados con estadísticas.",
                "responses": {
                    "200": {
                        "description": "Lista de sorteos"
                    },
                    "401": {
                        "description": "No autorizado"
                    }
                }
            }
        },
        "/v1/health": {
            "get": {
                "summary": "Health check y estado del sistema",
                "description": "Verifica la conexión a base de datos, conteo de registros y latencia.",
                "security": [],
                "responses": {
                    "200": {
                        "description": "Estado del servicio"
                    }
                }
            }
        }
    },
    "components": {
        "securitySchemes": {
            "ApiKeyAuth": {
                "type": "apiKey",
                "in": "header",
                "name": "X-API-Key",
                "description": "Encabezado con la clave API privada"
            },
            "BearerAuth": {
                "type": "http",
                "scheme": "bearer",
                "bearerFormat": "API-Key",
                "description": "Token Bearer con la clave API"
            },
            "ApiKeyQuery": {
                "type": "apiKey",
                "in": "query",
                "name": "api_key",
                "description": "Parámetro de consulta URL con la clave API"
            }
        }
    }
}