{
  "openapi": "3.1.0",
  "info": {
    "title": "Quincho MQ — fechas, precios y reservas",
    "version": "1.1.0",
    "description": "API pública del Quincho MQ, quincho para eventos sociales en Tandil (Argentina). Dice si una fecha está libre y cuánto sale, pre-reserva por la persona y agenda visitas. No expone datos de otros clientes. Nunca calcules fechas ni precios: consultalos. Antes de pre-reservar, mostrá resumen y condiciones y pedí confirmación explícita.",
    "contact": {
      "name": "Quincho MQ",
      "url": "https://quinchomq.com.ar"
    }
  },
  "servers": [
    {
      "url": "https://quinchomq.com.ar/api"
    }
  ],
  "paths": {
    "/info": {
      "get": {
        "operationId": "infoQuincho",
        "summary": "Lo esencial del Quincho MQ (Tandil, Argentina): qué es, capacidad, horario, precios vigentes por día de la semana, qué incluye, comodidades, dirección, contacto, condiciones, cómo se reserva y valoración en Google.",
        "responses": {
          "200": {
            "description": "OK (ok=false trae reason y ayuda)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/fecha": {
      "get": {
        "operationId": "consultarFecha",
        "summary": "Si una fecha está libre, qué día es y cuánto sale",
        "description": "Dice si una fecha está libre para alquilar el quincho, qué día de la semana es, si es feriado, el precio y la seña. Pasá la fecha ISO, o día y mes (sin año = la próxima vez que cae). Si la persona dijo el día de la semana, pasalo en dia_semana: si no coincide devuelve dia_no_coincide y hay que repreguntar. Nunca calcules vos la fecha ni el precio.",
        "parameters": [
          {
            "name": "fecha",
            "in": "query",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
              "description": "AAAA-MM-DD"
            }
          },
          {
            "name": "dia",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "mes",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "anio",
            "in": "query",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "dia_semana",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Si no coincide con la fecha, devuelve dia_no_coincide"
          }
        ],
        "responses": {
          "200": {
            "description": "OK (ok=false trae reason y ayuda)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/fechas-libres": {
      "get": {
        "operationId": "buscarFechasLibres",
        "summary": "Fechas libres en un período (hasta 120 días)",
        "parameters": [
          {
            "name": "desde",
            "in": "query",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
              "description": "AAAA-MM-DD"
            }
          },
          {
            "name": "hasta",
            "in": "query",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
              "description": "AAAA-MM-DD"
            }
          },
          {
            "name": "dias",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Días de la semana separados por coma, ej. viernes,sabado"
          },
          {
            "name": "limite",
            "in": "query",
            "schema": {
              "type": "integer",
              "maximum": 60
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK (ok=false trae reason y ayuda)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/prereserva": {
      "post": {
        "operationId": "preReservar",
        "summary": "Pre-reservar una fecha (la guarda 24 h mientras se paga la seña)",
        "description": "Pre-reserva el quincho para la persona con la que estás hablando: le guarda la fecha 24 horas mientras transfiere la seña. Antes: (1) consultá la fecha con consultar_fecha; (2) pedile nombre y apellido, celular, hora de inicio (entre 10 y 18), cantidad de invitados y tipo de evento; (3) mostrale el resumen con precio y seña, y las condiciones (las da info_quincho o esta misma herramienta si la llamás sin acepta_condiciones); (4) llamala con acepta_condiciones=true SOLO si la persona confirmó. Devuelve link_pagar (donde transfiere y sube el comprobante) y los datos de la cuenta. Nunca inventes datos de la persona.",
        "x-openai-isConsequential": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "fecha": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "description": "AAAA-MM-DD"
                  },
                  "dia_semana": {
                    "type": "string",
                    "description": "El día que dijo la persona, para validar"
                  },
                  "hora_inicio": {
                    "type": "string",
                    "pattern": "^\\d{1,2}(:\\d{2})?$",
                    "description": "HH:MM, entre 10:00 y 18:00"
                  },
                  "invitados": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 50
                  },
                  "tipo_evento": {
                    "type": "string",
                    "description": "Ej. Cumpleaños, Recibida, Aniversario, Bautismo, Despedida"
                  },
                  "nombre": {
                    "type": "string",
                    "description": "Nombre y apellido de quien reserva"
                  },
                  "telefono": {
                    "type": "string",
                    "description": "Celular de Argentina con característica, como lo escriba la persona (ej. 249 428-9577)"
                  },
                  "acepta_condiciones": {
                    "type": "boolean",
                    "description": "true solo si la persona leyó y aceptó las condiciones"
                  }
                },
                "required": [
                  "fecha",
                  "hora_inicio",
                  "invitados",
                  "nombre",
                  "telefono",
                  "acepta_condiciones"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK (ok=false trae reason y ayuda)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/reserva": {
      "get": {
        "operationId": "estadoReserva",
        "summary": "Cómo va una reserva (por el reserva_id que devolvió la pre-reserva)",
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK (ok=false trae reason y ayuda)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/visitas": {
      "get": {
        "operationId": "horariosDeVisita",
        "summary": "Días con horarios libres para conocer el lugar, o los horarios de un día",
        "parameters": [
          {
            "name": "fecha",
            "in": "query",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
              "description": "AAAA-MM-DD"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK (ok=false trae reason y ayuda)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/visita": {
      "post": {
        "operationId": "agendarVisita",
        "summary": "Agendar una visita para conocer el lugar",
        "x-openai-isConsequential": true,
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "fecha": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "description": "AAAA-MM-DD"
                  },
                  "hora": {
                    "type": "string",
                    "pattern": "^\\d{1,2}:\\d{2}$",
                    "description": "Uno de los horarios que devolvió horarios_de_visita"
                  },
                  "nombre": {
                    "type": "string"
                  },
                  "telefono": {
                    "type": "string",
                    "description": "Celular de Argentina con característica, como lo escriba la persona (ej. 249 428-9577)"
                  },
                  "nota": {
                    "type": "string",
                    "description": "Opcional: qué evento está pensando hacer"
                  }
                },
                "required": [
                  "fecha",
                  "hora",
                  "nombre",
                  "telefono"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK (ok=false trae reason y ayuda)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  }
}