{
  "openapi": "3.1.0",
  "info": {
    "title": "CBA HOY API",
    "version": "1.0.0",
    "description": "API pública de solo lectura de CBA HOY (https://cbahoy.com), la agenda cultural de Córdoba, Argentina. Devuelve eventos (recitales, teatro, fiestas, ferias, stand up), lugares y la cartelera de cine de la ciudad, agregados desde las plataformas de venta de entradas y actualizados cada 2 horas.\n\nNo requiere autenticación ni API key. Sólo se aceptan GET y HEAD: cualquier método de escritura devuelve 405. Las respuestas se cachean 60 segundos en el edge.\n\nDocumentación: https://cbahoy.com/docs/api",
    "contact": {
      "name": "CBA HOY",
      "url": "https://cbahoy.com/docs/api"
    }
  },
  "servers": [
    {
      "url": "https://cbahoy.com/api/v1",
      "description": "Producción"
    }
  ],
  "paths": {
    "/events": {
      "get": {
        "tags": [
          "events"
        ],
        "summary": "Get Events",
        "operationId": "get_events_api_v1_events_get",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "description": "Page number",
              "default": 1,
              "title": "Page"
            },
            "description": "Page number"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 100,
              "minimum": 1,
              "description": "Items per page",
              "default": 20,
              "title": "Per Page"
            },
            "description": "Items per page"
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Precise search over the title and the Lugar (name or alias), typo tolerant; results come back best match first",
              "title": "Search"
            },
            "description": "Precise search over the title and the Lugar (name or alias), typo tolerant; results come back best match first"
          },
          {
            "name": "sort_by",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "start_iso",
                "min_price",
                "created_at",
                "title"
              ],
              "type": "string",
              "description": "Sort by field",
              "default": "start_iso",
              "title": "Sort By"
            },
            "description": "Sort by field"
          },
          {
            "name": "sort_order",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "asc",
                "desc"
              ],
              "type": "string",
              "description": "Sort order: asc or desc",
              "default": "asc",
              "title": "Sort Order"
            },
            "description": "Sort order: asc or desc"
          },
          {
            "name": "group",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "const": "show"
                },
                {
                  "type": "null"
                }
              ],
              "description": "'show': one item per Evento (series_key) with its next Funcion Vigente as representative, occurrence_count, series_min_price and last_start_iso; total counts Eventos",
              "title": "Group"
            },
            "description": "'show': one item per Evento (series_key) with its next Funcion Vigente as representative, occurrence_count, series_min_price and last_start_iso; total counts Eventos"
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Tipo de plan slug or comma-separated list (case-insensitive); 422 on an unknown slug",
              "title": "Category"
            },
            "description": "Tipo de plan slug or comma-separated list (case-insensitive); 422 on an unknown slug"
          },
          {
            "name": "date_from",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Funciones starting on/after this day (YYYY-MM-DD, Cordoba)",
              "title": "Date From"
            },
            "description": "Funciones starting on/after this day (YYYY-MM-DD, Cordoba)"
          },
          {
            "name": "date_to",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Funciones starting on/before this day (YYYY-MM-DD, Cordoba)",
              "title": "Date To"
            },
            "description": "Funciones starting on/before this day (YYYY-MM-DD, Cordoba)"
          },
          {
            "name": "venue",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Lugar name or raw string (substring, case-insensitive)",
              "title": "Venue"
            },
            "description": "Lugar name or raw string (substring, case-insensitive)"
          },
          {
            "name": "venue_id",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Lugar id; a Lugar padre (Quality) includes its salas hijas (Quality Arena, ...)",
              "title": "Venue Id"
            },
            "description": "Lugar id; a Lugar padre (Quality) includes its salas hijas (Quality Arena, ...)"
          },
          {
            "name": "exclude_series",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Drop the Evento with this series_key ('Mas en {Lugar}')",
              "title": "Exclude Series"
            },
            "description": "Drop the Evento with this series_key ('Mas en {Lugar}')"
          },
          {
            "name": "min_price",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Minimum known price",
              "title": "Min Price"
            },
            "description": "Minimum known price"
          },
          {
            "name": "max_price",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Maximum known price",
              "title": "Max Price"
            },
            "description": "Maximum known price"
          },
          {
            "name": "source",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Plataforma slug (case-insensitive)",
              "title": "Source"
            },
            "description": "Plataforma slug (case-insensitive)"
          },
          {
            "name": "include_past",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Include Eventos that are no longer Vigentes",
              "default": false,
              "title": "Include Past"
            },
            "description": "Include Eventos that are no longer Vigentes"
          },
          {
            "name": "free_only",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Only Eventos the Plataforma confirms as Gratis (is_free)",
              "default": false,
              "title": "Free Only"
            },
            "description": "Only Eventos the Plataforma confirms as Gratis (is_free)"
          },
          {
            "name": "hide_sold_out",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Drop Eventos marked Agotado (is_sold_out)",
              "default": false,
              "title": "Hide Sold Out"
            },
            "description": "Drop Eventos marked Agotado (is_sold_out)"
          },
          {
            "name": "in_capital",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "true (default): only Lugares in Capital (Cordoba + Gran Cordoba; unknown locality counts as Capital). false: no locality filter ('Incluir interior provincial')",
              "default": true,
              "title": "In Capital"
            },
            "description": "true (default): only Lugares in Capital (Cordoba + Gran Cordoba; unknown locality counts as Capital). false: no locality filter ('Incluir interior provincial')"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EventsResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Lista los Eventos vigentes de Córdoba (recitales, teatro, fiestas, stand up, danza, ferias e infantiles), paginados y ordenados por fecha de inicio. Acepta filtros por rango de fechas (`date_from`, `date_to`), tipo de plan (`category`, uno o varios slugs separados por coma), lugar (`venue_id` por identidad o `venue` por nombre parcial), precio (`free_only`), zona (`in_capital`) y texto libre (`search`). Con `group=show` devuelve una fila por Evento —la próxima función vigente como representante, más `occurrence_count`— en vez de una fila por función. La respuesta trae `items`, `total`, `page`, `per_page` y `has_more`."
      }
    },
    "/events/count": {
      "get": {
        "tags": [
          "events"
        ],
        "summary": "Get Events Count",
        "description": "How many Funciones (or Eventos with group=show) GET /events would return\nfor the same parameters; ``count`` equals its ``total``. With ``facets``\nadds per-chip counts (each facet ignores the filter of its own dimension).",
        "operationId": "get_events_count_api_v1_events_count_get",
        "parameters": [
          {
            "name": "search",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Same search as /events",
              "title": "Search"
            },
            "description": "Same search as /events"
          },
          {
            "name": "group",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "const": "show"
                },
                {
                  "type": "null"
                }
              ],
              "description": "show: count Eventos (series_key), not Funciones",
              "title": "Group"
            },
            "description": "show: count Eventos (series_key), not Funciones"
          },
          {
            "name": "facets",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated: day, category, venue",
              "title": "Facets"
            },
            "description": "Comma-separated: day, category, venue"
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Tipo de plan slug or comma-separated list (case-insensitive); 422 on an unknown slug",
              "title": "Category"
            },
            "description": "Tipo de plan slug or comma-separated list (case-insensitive); 422 on an unknown slug"
          },
          {
            "name": "date_from",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Funciones starting on/after this day (YYYY-MM-DD, Cordoba)",
              "title": "Date From"
            },
            "description": "Funciones starting on/after this day (YYYY-MM-DD, Cordoba)"
          },
          {
            "name": "date_to",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Funciones starting on/before this day (YYYY-MM-DD, Cordoba)",
              "title": "Date To"
            },
            "description": "Funciones starting on/before this day (YYYY-MM-DD, Cordoba)"
          },
          {
            "name": "venue",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Lugar name or raw string (substring, case-insensitive)",
              "title": "Venue"
            },
            "description": "Lugar name or raw string (substring, case-insensitive)"
          },
          {
            "name": "venue_id",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Lugar id; a Lugar padre (Quality) includes its salas hijas (Quality Arena, ...)",
              "title": "Venue Id"
            },
            "description": "Lugar id; a Lugar padre (Quality) includes its salas hijas (Quality Arena, ...)"
          },
          {
            "name": "exclude_series",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Drop the Evento with this series_key ('Mas en {Lugar}')",
              "title": "Exclude Series"
            },
            "description": "Drop the Evento with this series_key ('Mas en {Lugar}')"
          },
          {
            "name": "min_price",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Minimum known price",
              "title": "Min Price"
            },
            "description": "Minimum known price"
          },
          {
            "name": "max_price",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Maximum known price",
              "title": "Max Price"
            },
            "description": "Maximum known price"
          },
          {
            "name": "source",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Plataforma slug (case-insensitive)",
              "title": "Source"
            },
            "description": "Plataforma slug (case-insensitive)"
          },
          {
            "name": "include_past",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Include Eventos that are no longer Vigentes",
              "default": false,
              "title": "Include Past"
            },
            "description": "Include Eventos that are no longer Vigentes"
          },
          {
            "name": "free_only",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Only Eventos the Plataforma confirms as Gratis (is_free)",
              "default": false,
              "title": "Free Only"
            },
            "description": "Only Eventos the Plataforma confirms as Gratis (is_free)"
          },
          {
            "name": "hide_sold_out",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Drop Eventos marked Agotado (is_sold_out)",
              "default": false,
              "title": "Hide Sold Out"
            },
            "description": "Drop Eventos marked Agotado (is_sold_out)"
          },
          {
            "name": "in_capital",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "true (default): only Lugares in Capital (Cordoba + Gran Cordoba; unknown locality counts as Capital). false: no locality filter ('Incluir interior provincial')",
              "default": true,
              "title": "In Capital"
            },
            "description": "true (default): only Lugares in Capital (Cordoba + Gran Cordoba; unknown locality counts as Capital). false: no locality filter ('Incluir interior provincial')"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CountResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/events/{event_id}": {
      "get": {
        "tags": [
          "events"
        ],
        "summary": "Get Event",
        "operationId": "get_event_api_v1_events__event_id__get",
        "parameters": [
          {
            "name": "event_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Event Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EventDetail"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Devuelve el detalle completo de un Evento por su UUID: título, descripción, fecha y hora de inicio y fin, lugar con dirección y coordenadas, tipo de plan, precio mínimo y estado (gratis, agotado, sin publicar), imagen, plataforma de origen, link de compra y la lista de funciones cuando el Evento tiene más de una. Responde 404 si el Evento no existe o fue dado de baja. Es el mismo payload que pinta la página `/evento/<slug>-<uuid>` del sitio."
      }
    },
    "/movies": {
      "get": {
        "tags": [
          "movies"
        ],
        "summary": "Get Movies",
        "operationId": "get_movies_api_v1_movies_get",
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "description": "Page number (ignored with group=movie)",
              "default": 1,
              "title": "Page"
            },
            "description": "Page number (ignored with group=movie)"
          },
          {
            "name": "per_page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 100,
              "minimum": 1,
              "description": "Items per page (ignored with group=movie)",
              "default": 20,
              "title": "Per Page"
            },
            "description": "Items per page (ignored with group=movie)"
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by date (YYYY-MM-DD); with group=movie defaults to today (AR)",
              "title": "Date"
            },
            "description": "Filter by date (YYYY-MM-DD); with group=movie defaults to today (AR)"
          },
          {
            "name": "include_past",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Include shows before today (Argentina time)",
              "default": false,
              "title": "Include Past"
            },
            "description": "Include shows before today (Argentina time)"
          },
          {
            "name": "cinema",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Cinema slug (see /cinemas), canonical name or raw name",
              "title": "Cinema"
            },
            "description": "Cinema slug (see /cinemas), canonical name or raw name"
          },
          {
            "name": "movie_title",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by movie title",
              "title": "Movie Title"
            },
            "description": "Filter by movie title"
          },
          {
            "name": "group",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "const": "movie"
                },
                {
                  "type": "null"
                }
              ],
              "description": "'movie': one item per Pelicula with shows per cinema and meta {movies, cinemas, date}",
              "title": "Group"
            },
            "description": "'movie': one item per Pelicula with shows per cinema and meta {movies, cinemas, date}"
          },
          {
            "name": "sort_by",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Sort by field",
              "default": "date",
              "title": "Sort By"
            },
            "description": "Sort by field"
          },
          {
            "name": "sort_order",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Sort order: asc or desc",
              "default": "asc",
              "title": "Sort Order"
            },
            "description": "Sort order: asc or desc"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/GroupedMoviesResponse"
                    },
                    {
                      "$ref": "#/components/schemas/MoviesResponse"
                    }
                  ],
                  "title": "Response Get Movies Api V1 Movies Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Devuelve la cartelera de cine de Córdoba. Con `date=YYYY-MM-DD` la limita a un día y con `group=movie` agrupa las funciones por película —una fila por título, con sus horarios, salas e idioma de la copia— en vez de una fila por función. Cada película trae póster, género, duración, calificación, sinopsis y link para sacar la entrada cuando la sala lo publica."
      }
    },
    "/movies/dates": {
      "get": {
        "tags": [
          "movies"
        ],
        "summary": "Get Movie Dates",
        "description": "Upcoming days (from today, hora AR) with Funciones de cine, ascending,\neach with its number of Peliculas; feeds the date chips of the Cartelera.",
        "operationId": "get_movie_dates_api_v1_movies_dates_get",
        "parameters": [
          {
            "name": "cinema",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Cinema slug, canonical name or alias (see /cinemas)",
              "title": "Cinema"
            },
            "description": "Cinema slug, canonical name or alias (see /cinemas)"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/MovieDateInfo"
                  },
                  "title": "Response Get Movie Dates Api V1 Movies Dates Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/movies/{movie_id}": {
      "get": {
        "tags": [
          "movies"
        ],
        "summary": "Get Movie",
        "operationId": "get_movie_api_v1_movies__movie_id__get",
        "parameters": [
          {
            "name": "movie_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid",
              "title": "Movie Id"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MovieShowPublic"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        },
        "description": "Devuelve el detalle de una película en cartel: título, póster, género, duración, calificación, sinopsis y todas sus funciones con cine, día, horarios, formato e idioma. Responde 404 si la película no está en la cartelera vigente."
      }
    },
    "/health": {
      "get": {
        "tags": [
          "meta"
        ],
        "summary": "Health Check",
        "description": "Health check endpoint that verifies API and database connectivity",
        "operationId": "health_check_api_v1_health_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HealthResponse"
                }
              }
            }
          }
        }
      }
    },
    "/cinemas": {
      "get": {
        "tags": [
          "meta"
        ],
        "summary": "Get Cinemas",
        "description": "Cines con Funciones de cine desde hoy (hora AR): slug, nombre canonico,\nnombre corto, barrio y conteo. Los cines sin funciones proximas se omiten.",
        "operationId": "get_cinemas_api_v1_cinemas_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/CinemaInfo"
                  },
                  "type": "array",
                  "title": "Response Get Cinemas Api V1 Cinemas Get"
                }
              }
            }
          }
        }
      }
    },
    "/meta/categories": {
      "get": {
        "tags": [
          "meta"
        ],
        "summary": "Meta Categories",
        "description": "The 12 Tipos de plan with label, group and count of Eventos Vigentes.",
        "operationId": "meta_categories_api_v1_meta_categories_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/CategoryInfo"
                  },
                  "type": "array",
                  "title": "Response Meta Categories Api V1 Meta Categories Get"
                }
              }
            }
          }
        }
      }
    },
    "/meta/sources": {
      "get": {
        "tags": [
          "meta"
        ],
        "summary": "Meta Sources",
        "description": "Plataformas with name, domain, count of Eventos Vigentes and last successful scrape.",
        "operationId": "meta_sources_api_v1_meta_sources_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/SourceInfo"
                  },
                  "type": "array",
                  "title": "Response Meta Sources Api V1 Meta Sources Get"
                }
              }
            }
          }
        }
      }
    },
    "/meta/venues/uncurated": {
      "get": {
        "tags": [
          "meta"
        ],
        "summary": "Meta Uncurated Venues",
        "description": "Weekly review (ticket #35): Lugares created automatically by the resolver\n(curated=false), most Eventos Vigentes first, with the raw forms seen.\nSame rows as scripts/list_uncurated_venues.py; curate them in data/venues_seed.yaml.",
        "operationId": "meta_uncurated_venues_api_v1_meta_venues_uncurated_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/UncuratedVenueInfo"
                  },
                  "type": "array",
                  "title": "Response Meta Uncurated Venues Api V1 Meta Venues Uncurated Get"
                }
              }
            }
          }
        }
      }
    },
    "/venues": {
      "get": {
        "tags": [
          "venues"
        ],
        "summary": "Get Venues",
        "description": "Closed list of Lugares for the selector, ordered by ``upcoming_count``\n(Eventos Vigentes; a parent Lugar adds those of its salas) then name.",
        "operationId": "get_venues_api_v1_venues_get",
        "parameters": [
          {
            "name": "with_upcoming",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Only Lugares with at least one Evento Vigente",
              "default": false,
              "title": "With Upcoming"
            },
            "description": "Only Lugares with at least one Evento Vigente"
          },
          {
            "name": "in_capital",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "true (default): only Capital (unknown locality counts as Capital); false: every Lugar",
              "default": true,
              "title": "In Capital"
            },
            "description": "true (default): only Capital (unknown locality counts as Capital); false: every Lugar"
          },
          {
            "name": "curated",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "boolean"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by curation state (false: the weekly review queue)",
              "title": "Curated"
            },
            "description": "Filter by curation state (false: the weekly review queue)"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/VenueListItem"
                  },
                  "title": "Response Get Venues Api V1 Venues Get"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/venues/{key}": {
      "get": {
        "tags": [
          "venues"
        ],
        "summary": "Get Venue",
        "description": "The Lugar page: full Lugar plus its upcoming Eventos (group=show, salas\nincluded). Interior Lugares show their Eventos too: the page is explicit.",
        "operationId": "get_venue_api_v1_venues__key__get",
        "parameters": [
          {
            "name": "key",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "title": "Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/VenuePage"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    },
    "/search/suggest": {
      "get": {
        "tags": [
          "search"
        ],
        "summary": "Suggest",
        "description": "Typeahead of the buscador: Eventos, Lugares and Tipos de plan for ``q``.",
        "operationId": "suggest_api_v1_search_suggest_get",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "What the user typed; under 2 characters suggests nothing",
              "default": "",
              "title": "Q"
            },
            "description": "What the user typed; under 2 characters suggests nothing"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 20,
              "minimum": 1,
              "description": "Rows per section",
              "default": 6,
              "title": "Limit"
            },
            "description": "Rows per section"
          },
          {
            "name": "in_capital",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "true (default): only Capital, like GET /events and GET /venues",
              "default": true,
              "title": "In Capital"
            },
            "description": "true (default): only Capital, like GET /events and GET /venues"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SuggestResponse"
                }
              }
            }
          },
          "422": {
            "description": "Validation Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "CategoryInfo": {
        "properties": {
          "slug": {
            "type": "string",
            "title": "Slug"
          },
          "label": {
            "type": "string",
            "title": "Label"
          },
          "group": {
            "type": "string",
            "enum": [
              "primary",
              "more"
            ],
            "title": "Group"
          },
          "upcoming_count": {
            "type": "integer",
            "title": "Upcoming Count",
            "default": 0
          }
        },
        "type": "object",
        "required": [
          "slug",
          "label",
          "group"
        ],
        "title": "CategoryInfo"
      },
      "CinemaInfo": {
        "properties": {
          "slug": {
            "type": "string",
            "title": "Slug"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "short_name": {
            "type": "string",
            "title": "Short Name"
          },
          "barrio": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Barrio"
          },
          "show_count": {
            "type": "integer",
            "title": "Show Count",
            "default": 0
          }
        },
        "type": "object",
        "required": [
          "slug",
          "name",
          "short_name"
        ],
        "title": "CinemaInfo"
      },
      "CountResponse": {
        "properties": {
          "count": {
            "type": "integer",
            "title": "Count"
          },
          "day": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/DayFacet"
              },
              {
                "type": "null"
              }
            ]
          },
          "category": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "integer"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Category",
            "description": "Tipo de plan slug -> count (every slug present)"
          },
          "venue": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/VenueFacet"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Venue",
            "description": "Top 50 Lugares by count then name; ignores venue_id/venue, keeps in_capital"
          }
        },
        "type": "object",
        "required": [
          "count"
        ],
        "title": "CountResponse",
        "description": "GET /events/count: ``count`` for the given filters (Eventos with group=show);\n``day``/``category``/``venue`` only when asked via ``facets``. Each facet\nignores the filter of its own dimension."
      },
      "DayFacet": {
        "properties": {
          "today": {
            "type": "integer",
            "title": "Today"
          },
          "tomorrow": {
            "type": "integer",
            "title": "Tomorrow"
          },
          "weekend": {
            "type": "integer",
            "title": "Weekend",
            "description": "Fri-Sun of this week (if today is Fri-Sun) or the coming one"
          },
          "week": {
            "type": "integer",
            "title": "Week",
            "description": "today .. today + 6"
          }
        },
        "type": "object",
        "required": [
          "today",
          "tomorrow",
          "weekend",
          "week"
        ],
        "title": "DayFacet",
        "description": "Counts per time chip; windows are Cordoba calendar days computed on the server."
      },
      "EventDetail": {
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
          },
          "title": {
            "type": "string",
            "title": "Title"
          },
          "title_display": {
            "type": "string",
            "title": "Title Display"
          },
          "start_iso": {
            "type": "string",
            "format": "date-time",
            "title": "Start Iso"
          },
          "end_iso": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "End Iso",
            "description": "End of THIS Funcion, None if unknown. Presentation: show 'a HH:MM' only when set and less than 12 h after start_iso (a derived end is flagged in source_meta.end_derived)"
          },
          "range_end": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Range End",
            "description": "Last day of a Temporada, None otherwise. Presentation: 'Hasta el {fecha}' instead of '+N fechas'; the Evento stays Vigente until this day"
          },
          "venue": {
            "$ref": "#/components/schemas/VenueDetail"
          },
          "price_status": {
            "type": "string",
            "enum": [
              "known",
              "free",
              "unknown",
              "sold_out"
            ],
            "title": "Price Status"
          },
          "min_price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Min Price"
          },
          "currency": {
            "type": "string",
            "title": "Currency",
            "default": "ARS"
          },
          "is_free": {
            "type": "boolean",
            "title": "Is Free",
            "default": false
          },
          "is_sold_out": {
            "type": "boolean",
            "title": "Is Sold Out",
            "default": false
          },
          "age_restriction": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "ATP",
                  "+13",
                  "+16",
                  "+18"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Age Restriction",
            "description": "None when the Plataforma does not say"
          },
          "category": {
            "type": "string",
            "title": "Category"
          },
          "category_label": {
            "type": "string",
            "title": "Category Label"
          },
          "img_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Img Url"
          },
          "img_square_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Img Square Url"
          },
          "source": {
            "type": "string",
            "title": "Source"
          },
          "source_name": {
            "type": "string",
            "title": "Source Name"
          },
          "ticket_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ticket Url"
          },
          "occurrence_count": {
            "type": "integer",
            "title": "Occurrence Count",
            "description": "Funciones Vigentes of the Evento (>1 only with group=show or in the detail)",
            "default": 1
          },
          "last_start_iso": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Start Iso",
            "description": "With group=show: last Funcion of the Evento"
          },
          "series_min_price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Series Min Price",
            "description": "With group=show: lowest known price across the Evento's Funciones (None if none known)"
          },
          "series_key": {
            "type": "string",
            "title": "Series Key"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "title": "Updated At"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "short_description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Short Description"
          },
          "description_is_synthetic": {
            "type": "boolean",
            "title": "Description Is Synthetic",
            "description": "True while the Plataforma gives no real description ('Titulo en Lugar')",
            "default": false
          },
          "event_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Event Url",
            "description": "Public page of the Evento, distinct from ticket_url"
          },
          "source_domain": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Domain"
          },
          "source_category": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source Category"
          },
          "is_active": {
            "type": "boolean",
            "title": "Is Active",
            "description": "False once the Plataforma stopped listing it (retired/cancelled)",
            "default": true
          },
          "occurrences": {
            "items": {
              "$ref": "#/components/schemas/OccurrenceRef"
            },
            "type": "array",
            "title": "Occurrences",
            "description": "Funciones Vigentes of the same Evento (empty for a Temporada)"
          }
        },
        "type": "object",
        "required": [
          "id",
          "title",
          "title_display",
          "start_iso",
          "venue",
          "price_status",
          "category",
          "category_label",
          "source",
          "source_name",
          "series_key",
          "created_at",
          "updated_at"
        ],
        "title": "EventDetail"
      },
      "EventListItem": {
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
          },
          "title": {
            "type": "string",
            "title": "Title"
          },
          "title_display": {
            "type": "string",
            "title": "Title Display"
          },
          "start_iso": {
            "type": "string",
            "format": "date-time",
            "title": "Start Iso"
          },
          "end_iso": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "End Iso",
            "description": "End of THIS Funcion, None if unknown. Presentation: show 'a HH:MM' only when set and less than 12 h after start_iso (a derived end is flagged in source_meta.end_derived)"
          },
          "range_end": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Range End",
            "description": "Last day of a Temporada, None otherwise. Presentation: 'Hasta el {fecha}' instead of '+N fechas'; the Evento stays Vigente until this day"
          },
          "venue": {
            "$ref": "#/components/schemas/VenueRef"
          },
          "price_status": {
            "type": "string",
            "enum": [
              "known",
              "free",
              "unknown",
              "sold_out"
            ],
            "title": "Price Status"
          },
          "min_price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Min Price"
          },
          "currency": {
            "type": "string",
            "title": "Currency",
            "default": "ARS"
          },
          "is_free": {
            "type": "boolean",
            "title": "Is Free",
            "default": false
          },
          "is_sold_out": {
            "type": "boolean",
            "title": "Is Sold Out",
            "default": false
          },
          "age_restriction": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "ATP",
                  "+13",
                  "+16",
                  "+18"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Age Restriction",
            "description": "None when the Plataforma does not say"
          },
          "category": {
            "type": "string",
            "title": "Category"
          },
          "category_label": {
            "type": "string",
            "title": "Category Label"
          },
          "img_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Img Url"
          },
          "img_square_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Img Square Url"
          },
          "source": {
            "type": "string",
            "title": "Source"
          },
          "source_name": {
            "type": "string",
            "title": "Source Name"
          },
          "ticket_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ticket Url"
          },
          "occurrence_count": {
            "type": "integer",
            "title": "Occurrence Count",
            "description": "Funciones Vigentes of the Evento (>1 only with group=show or in the detail)",
            "default": 1
          },
          "last_start_iso": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Start Iso",
            "description": "With group=show: last Funcion of the Evento"
          },
          "series_min_price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Series Min Price",
            "description": "With group=show: lowest known price across the Evento's Funciones (None if none known)"
          },
          "series_key": {
            "type": "string",
            "title": "Series Key"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "title": "Updated At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "title",
          "title_display",
          "start_iso",
          "venue",
          "price_status",
          "category",
          "category_label",
          "source",
          "source_name",
          "series_key",
          "created_at",
          "updated_at"
        ],
        "title": "EventListItem"
      },
      "EventsResponse": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/EventListItem"
            },
            "type": "array",
            "title": "Items"
          },
          "total": {
            "type": "integer",
            "title": "Total"
          },
          "page": {
            "type": "integer",
            "title": "Page"
          },
          "per_page": {
            "type": "integer",
            "title": "Per Page"
          },
          "has_more": {
            "type": "boolean",
            "title": "Has More"
          }
        },
        "type": "object",
        "required": [
          "items",
          "total",
          "page",
          "per_page",
          "has_more"
        ],
        "title": "EventsResponse"
      },
      "GroupedMoviesResponse": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/MovieGroup"
            },
            "type": "array",
            "title": "Items"
          },
          "meta": {
            "$ref": "#/components/schemas/MoviesMeta"
          }
        },
        "type": "object",
        "required": [
          "items",
          "meta"
        ],
        "title": "GroupedMoviesResponse"
      },
      "HTTPValidationError": {
        "properties": {
          "detail": {
            "items": {
              "$ref": "#/components/schemas/ValidationError"
            },
            "type": "array",
            "title": "Detail"
          }
        },
        "type": "object",
        "title": "HTTPValidationError"
      },
      "HealthResponse": {
        "properties": {
          "status": {
            "type": "string",
            "title": "Status"
          },
          "database": {
            "type": "string",
            "title": "Database"
          },
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "title": "Timestamp"
          },
          "version": {
            "type": "string",
            "title": "Version",
            "default": "1.0.0"
          }
        },
        "type": "object",
        "required": [
          "status",
          "database",
          "timestamp"
        ],
        "title": "HealthResponse"
      },
      "MovieDateInfo": {
        "properties": {
          "date": {
            "type": "string",
            "title": "Date",
            "description": "YYYY-MM-DD (Cordoba)"
          },
          "count": {
            "type": "integer",
            "title": "Count"
          }
        },
        "type": "object",
        "required": [
          "date",
          "count"
        ],
        "title": "MovieDateInfo",
        "description": "One upcoming day of the Cartelera: how many Peliculas (distinct movie_key,\nsame count as ``meta.movies`` of ``group=movie`` for that day) have a Funcion de cine."
      },
      "MovieGroup": {
        "properties": {
          "movie_key": {
            "type": "string",
            "title": "Movie Key",
            "description": "Slug of the title without language/format suffixes"
          },
          "title": {
            "type": "string",
            "title": "Title"
          },
          "poster": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Poster"
          },
          "genre": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Genre"
          },
          "duration_min": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Duration Min",
            "description": "Duracion en minutos ('Drama - 1 h 40')"
          },
          "rating": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Rating",
            "description": "Clasificacion; null cuando la ficha no la publica"
          },
          "synopsis": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Synopsis"
          },
          "cycle": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Cycle",
            "description": "Ciclo del Cineclub; null en el resto de los cines"
          },
          "shows": {
            "items": {
              "$ref": "#/components/schemas/MovieShowItem"
            },
            "type": "array",
            "title": "Shows"
          }
        },
        "type": "object",
        "required": [
          "movie_key",
          "title",
          "shows"
        ],
        "title": "MovieGroup",
        "description": "Una Pelicula del dia con sus Funciones de cine. La metadata (#47) llega\nde la ficha de la Plataforma y es null mientras no se haya scrapeado: el\nfront omite la linea en vez de inventarla."
      },
      "MovieShowItem": {
        "properties": {
          "cinema_slug": {
            "type": "string",
            "title": "Cinema Slug"
          },
          "cinema_name": {
            "type": "string",
            "title": "Cinema Name"
          },
          "cinema_short": {
            "type": "string",
            "title": "Cinema Short"
          },
          "cinema_barrio": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Cinema Barrio"
          },
          "timeslots": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Timeslots"
          },
          "language": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Language",
            "description": "'Castellano' | 'Subtitulada' | null (unknown)"
          },
          "format": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Format",
            "description": "'3D', '4DX', ... or null for standard"
          },
          "ticket_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ticket Url"
          },
          "destination": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Destination",
            "description": "Where ticket_url takes the user: 'lanacion' | 'cineclub' | ...; the front picks the copy"
          }
        },
        "type": "object",
        "required": [
          "cinema_slug",
          "cinema_name",
          "cinema_short",
          "timeslots"
        ],
        "title": "MovieShowItem",
        "description": "One Funcion de cine of a Pelicula: a cinema, a day, its timeslots and the copy."
      },
      "MovieShowPublic": {
        "properties": {
          "movie_title": {
            "type": "string",
            "title": "Movie Title"
          },
          "cinema_name": {
            "type": "string",
            "title": "Cinema Name"
          },
          "date": {
            "type": "string",
            "title": "Date",
            "description": "YYYY-MM-DD format"
          },
          "timeslots": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Timeslots",
            "description": "Array of HH:MM times"
          },
          "screen": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Screen"
          },
          "format": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Format"
          },
          "language": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Language",
            "description": "'Castellano' | 'Subtitulada' | null (unknown)"
          },
          "ticket_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ticket Url"
          },
          "img_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Img Url"
          },
          "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "title": "Created At"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "title": "Updated At"
          }
        },
        "type": "object",
        "required": [
          "movie_title",
          "cinema_name",
          "date",
          "timeslots",
          "id",
          "created_at",
          "updated_at"
        ],
        "title": "MovieShowPublic"
      },
      "MoviesMeta": {
        "properties": {
          "movies": {
            "type": "integer",
            "title": "Movies"
          },
          "cinemas": {
            "type": "integer",
            "title": "Cinemas"
          },
          "date": {
            "type": "string",
            "title": "Date",
            "description": "YYYY-MM-DD of the Cartelera day"
          }
        },
        "type": "object",
        "required": [
          "movies",
          "cinemas",
          "date"
        ],
        "title": "MoviesMeta"
      },
      "MoviesResponse": {
        "properties": {
          "items": {
            "items": {
              "type": "object"
            },
            "type": "array",
            "title": "Items"
          },
          "total": {
            "type": "integer",
            "title": "Total"
          },
          "page": {
            "type": "integer",
            "title": "Page"
          },
          "per_page": {
            "type": "integer",
            "title": "Per Page"
          },
          "has_more": {
            "type": "boolean",
            "title": "Has More"
          }
        },
        "type": "object",
        "required": [
          "items",
          "total",
          "page",
          "per_page",
          "has_more"
        ],
        "title": "MoviesResponse"
      },
      "OccurrenceRef": {
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
          },
          "start_iso": {
            "type": "string",
            "format": "date-time",
            "title": "Start Iso"
          },
          "end_iso": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "End Iso",
            "description": "End of this Funcion; same presentation rule as the list"
          },
          "min_price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Min Price"
          },
          "price_status": {
            "type": "string",
            "enum": [
              "known",
              "free",
              "unknown",
              "sold_out"
            ],
            "title": "Price Status"
          },
          "ticket_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ticket Url"
          }
        },
        "type": "object",
        "required": [
          "id",
          "start_iso",
          "price_status"
        ],
        "title": "OccurrenceRef"
      },
      "SourceInfo": {
        "properties": {
          "slug": {
            "type": "string",
            "title": "Slug"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "domain": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Domain"
          },
          "upcoming_count": {
            "type": "integer",
            "title": "Upcoming Count",
            "default": 0
          },
          "last_success_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Success At"
          }
        },
        "type": "object",
        "required": [
          "slug",
          "name"
        ],
        "title": "SourceInfo"
      },
      "SuggestCategory": {
        "properties": {
          "slug": {
            "type": "string",
            "title": "Slug"
          },
          "label": {
            "type": "string",
            "title": "Label"
          }
        },
        "type": "object",
        "required": [
          "slug",
          "label"
        ],
        "title": "SuggestCategory",
        "description": "One Tipo de plan of the typeahead: the front opens /explorar?tipo={slug}."
      },
      "SuggestEvent": {
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "title": "Id"
          },
          "title": {
            "type": "string",
            "title": "Title"
          },
          "title_display": {
            "type": "string",
            "title": "Title Display"
          },
          "start_iso": {
            "type": "string",
            "format": "date-time",
            "title": "Start Iso",
            "description": "Next Funcion Vigente of the Evento, Cordoba offset"
          },
          "venue_name": {
            "type": "string",
            "title": "Venue Name",
            "description": "Canonical name of the Lugar, or the raw Plataforma string"
          }
        },
        "type": "object",
        "required": [
          "id",
          "title",
          "title_display",
          "start_iso",
          "venue_name"
        ],
        "title": "SuggestEvent",
        "description": "One Evento of the typeahead: the front opens its detail (/evento/{id})."
      },
      "SuggestResponse": {
        "properties": {
          "events": {
            "items": {
              "$ref": "#/components/schemas/SuggestEvent"
            },
            "type": "array",
            "title": "Events"
          },
          "venues": {
            "items": {
              "$ref": "#/components/schemas/SuggestVenue"
            },
            "type": "array",
            "title": "Venues"
          },
          "categories": {
            "items": {
              "$ref": "#/components/schemas/SuggestCategory"
            },
            "type": "array",
            "title": "Categories"
          }
        },
        "type": "object",
        "title": "SuggestResponse",
        "description": "GET /search/suggest: the three sections of the list under the buscador,\neach capped at ``limit``. Empty lists when the query is too short."
      },
      "SuggestVenue": {
        "properties": {
          "id": {
            "type": "integer",
            "title": "Id"
          },
          "slug": {
            "type": "string",
            "title": "Slug"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "barrio": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Barrio"
          },
          "upcoming_count": {
            "type": "integer",
            "title": "Upcoming Count",
            "description": "Eventos Vigentes, salas included (same number as GET /venues)"
          }
        },
        "type": "object",
        "required": [
          "id",
          "slug",
          "name",
          "upcoming_count"
        ],
        "title": "SuggestVenue",
        "description": "One Lugar of the typeahead: the front opens /explorar?lugar={slug}."
      },
      "UncuratedVenueInfo": {
        "properties": {
          "id": {
            "type": "integer",
            "title": "Id"
          },
          "slug": {
            "type": "string",
            "title": "Slug"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "city": {
            "type": "string",
            "title": "City"
          },
          "is_capital": {
            "type": "boolean",
            "title": "Is Capital"
          },
          "aliases": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Aliases"
          },
          "upcoming_count": {
            "type": "integer",
            "title": "Upcoming Count"
          },
          "raw_forms": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Raw Forms"
          },
          "created_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ],
            "title": "Created At"
          }
        },
        "type": "object",
        "required": [
          "id",
          "slug",
          "name",
          "city",
          "is_capital",
          "aliases",
          "upcoming_count",
          "raw_forms"
        ],
        "title": "UncuratedVenueInfo",
        "description": "Admin listing (GET /meta/venues/uncurated): a Lugar the resolver created on\nits own, with the raw forms the Plataformas used and its Eventos Vigentes."
      },
      "ValidationError": {
        "properties": {
          "loc": {
            "items": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "integer"
                }
              ]
            },
            "type": "array",
            "title": "Location"
          },
          "msg": {
            "type": "string",
            "title": "Message"
          },
          "type": {
            "type": "string",
            "title": "Error Type"
          }
        },
        "type": "object",
        "required": [
          "loc",
          "msg",
          "type"
        ],
        "title": "ValidationError"
      },
      "VenueDetail": {
        "properties": {
          "id": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Id"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "barrio": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Barrio"
          },
          "city": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "City"
          },
          "is_capital": {
            "type": "boolean",
            "title": "Is Capital",
            "default": true
          },
          "address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Address"
          },
          "lat": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lat"
          },
          "lon": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lon"
          },
          "slug": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Slug"
          },
          "parent": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/VenueRef"
              },
              {
                "type": "null"
              }
            ],
            "description": "Lugar padre of a sala (Quality Arena -> Quality); None for a Lugar on its own"
          }
        },
        "type": "object",
        "required": [
          "name"
        ],
        "title": "VenueDetail"
      },
      "VenueFacet": {
        "properties": {
          "venue_id": {
            "type": "integer",
            "title": "Venue Id"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "count": {
            "type": "integer",
            "title": "Count"
          }
        },
        "type": "object",
        "required": [
          "venue_id",
          "name",
          "count"
        ],
        "title": "VenueFacet"
      },
      "VenueListItem": {
        "properties": {
          "id": {
            "type": "integer",
            "title": "Id"
          },
          "slug": {
            "type": "string",
            "title": "Slug"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "barrio": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Barrio"
          },
          "city": {
            "type": "string",
            "title": "City"
          },
          "is_capital": {
            "type": "boolean",
            "title": "Is Capital"
          },
          "upcoming_count": {
            "type": "integer",
            "title": "Upcoming Count",
            "default": 0
          },
          "lat": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lat"
          },
          "lon": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lon"
          }
        },
        "type": "object",
        "required": [
          "id",
          "slug",
          "name",
          "city",
          "is_capital"
        ],
        "title": "VenueListItem",
        "description": "One Lugar of the closed list (GET /venues): what the selector shows\nplus ``upcoming_count`` (Eventos Vigentes, a parent adds those of its salas)."
      },
      "VenuePage": {
        "properties": {
          "id": {
            "type": "integer",
            "title": "Id"
          },
          "slug": {
            "type": "string",
            "title": "Slug"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "barrio": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Barrio"
          },
          "city": {
            "type": "string",
            "title": "City"
          },
          "is_capital": {
            "type": "boolean",
            "title": "Is Capital"
          },
          "upcoming_count": {
            "type": "integer",
            "title": "Upcoming Count",
            "default": 0
          },
          "lat": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lat"
          },
          "lon": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lon"
          },
          "address": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Address"
          },
          "website": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Website"
          },
          "parent": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/VenueParentRef"
              },
              {
                "type": "null"
              }
            ]
          },
          "events": {
            "items": {
              "$ref": "#/components/schemas/EventListItem"
            },
            "type": "array",
            "title": "Events",
            "description": "Up to VENUE_PAGE_EVENTS, by start"
          }
        },
        "type": "object",
        "required": [
          "id",
          "slug",
          "name",
          "city",
          "is_capital"
        ],
        "title": "VenuePage",
        "description": "GET /venues/{id|slug}: the full Lugar and its upcoming Eventos\n(group=show, salas included, regardless of in_capital)."
      },
      "VenueParentRef": {
        "properties": {
          "id": {
            "type": "integer",
            "title": "Id"
          },
          "slug": {
            "type": "string",
            "title": "Slug"
          },
          "name": {
            "type": "string",
            "title": "Name"
          }
        },
        "type": "object",
        "required": [
          "id",
          "slug",
          "name"
        ],
        "title": "VenueParentRef"
      },
      "VenueRef": {
        "properties": {
          "id": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Id"
          },
          "name": {
            "type": "string",
            "title": "Name"
          },
          "barrio": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Barrio"
          },
          "city": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "City"
          },
          "is_capital": {
            "type": "boolean",
            "title": "Is Capital",
            "default": true
          }
        },
        "type": "object",
        "required": [
          "name"
        ],
        "title": "VenueRef",
        "description": "Lugar as seen in a list item: the linked ``venues`` row (ADR 0003).\nbarrio comes out of the official barrios layer (None while the Lugar has no\ncoordinates, always None for Interior) and is shown with its display alias\nwhen it has one (services/barrios.py); what is stored is the official name.\nA row not yet backfilled falls back to the string inference (id None)."
      }
    }
  }
}
