{"openapi":"3.1.0","info":{"title":"Reservas de Rentcarx Travel","description":"Consultar el catálogo de Rentcarx Travel y preparar reservas. La reserva se crea con el importe exacto y devuelve un enlace de pago; esta API no cobra. Avisa por correo al negocio y al cliente.","version":"1.0.0"},"servers":[{"url":"https://rentcarx.com"}],"paths":{"/api/assistant/services":{"get":{"operationId":"listServices","summary":"Catálogo con los ids válidos para reservar","description":"Devuelve lo que se puede reservar, con su tipo, su id y su precio de partida. Llama a esto antes de reservar: son los únicos ids que existen.","x-openai-isConsequential":false,"parameters":[{"name":"vendor","in":"query","required":true,"description":"Identificador del negocio. Usa siempre «rentcarx».","schema":{"type":"string","default":"rentcarx"}},{"name":"service_type","in":"query","required":false,"description":"Opcional, para acotar a un tipo.","schema":{"type":"string","enum":["space","car","tour","boat"]}}],"responses":{"200":{"description":"El catálogo"}}}},"/api/assistant/detail":{"get":{"operationId":"getService","summary":"Ficha y condiciones de reserva de un servicio","x-openai-isConsequential":false,"parameters":[{"name":"vendor","in":"query","required":true,"description":"Identificador del negocio. Usa siempre «rentcarx».","schema":{"type":"string","default":"rentcarx"}},{"name":"service_type","in":"query","required":true,"schema":{"type":"string","enum":["space","car","tour","boat"]}},{"name":"service_id","in":"query","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"La ficha"}}}},"/api/assistant/booking":{"post":{"operationId":"createBooking","summary":"Prepara la reserva y devuelve el enlace de pago","description":"Crea la reserva a nombre del cliente, calcula el importe exacto y devuelve la dirección donde se confirma y se paga. NO cobra. Hacen falta el nombre del cliente y su teléfono o su email: pregúntaselos, no los inventes. Si el servicio cobra distinto por tipo de persona, llama antes a getService y manda «person_types».","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["vendor","service_type","service_id","start_date","first_name"],"properties":{"vendor":{"type":"string","default":"rentcarx","description":"Usa siempre «rentcarx»."},"service_type":{"type":"string","enum":["space","car","tour","boat"]},"service_id":{"type":"integer","description":"Un id devuelto por listServices."},"start_date":{"type":"string","format":"date","description":"AAAA-MM-DD."},"end_date":{"type":"string","format":"date","description":"AAAA-MM-DD. Si es de un solo día, no lo mandes."},"number":{"type":"integer","minimum":1,"default":1,"description":"Cuántas unidades (vehículos, plazas)."},"guests":{"type":"integer","minimum":1,"description":"Cuántas personas, en lo que se cobra por persona sin distinguir tipos."},"person_types":{"type":"array","description":"Solo si getService devolvió «person_types». Un elemento por tipo, EN EL MISMO ORDEN que los dio getService, con cuántas personas van de cada uno (0 si ninguna, para no descolocar el orden).","items":{"type":"object","properties":{"number":{"type":"integer","minimum":0}},"required":["number"]}},"first_name":{"type":"string"},"last_name":{"type":"string"},"email":{"type":"string","format":"email"},"phone":{"type":"string"},"note":{"type":"string"}}}}}},"responses":{"200":{"description":"Reserva preparada: código, importe y checkout_url"},"422":{"description":"Faltan datos, o esas fechas no están libres. El mensaje dice qué preguntar."}}}},"/api/assistant/contact":{"post":{"operationId":"leaveContact","summary":"Guarda el contacto de quien todavía no reserva","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["vendor","name"],"properties":{"vendor":{"type":"string","default":"rentcarx"},"name":{"type":"string"},"phone":{"type":"string"},"email":{"type":"string","format":"email"},"note":{"type":"string"}}}}}},"responses":{"200":{"description":"Guardado"}}}}}}