Vender desde tu plataforma
El recorrido completo para que tu web o tu app venda plazas del recinto: mirar qué hay libre, decir cuánto cuesta y cerrar la reserva.
El precio que te devolvemos es el precio
La cotización sale del mismo motor que el portal público y el mostrador. No es una estimación que luego se ajusta: incluye temporada, suplementos, tasa turística y cupón, y es exactamente lo que se cobrará. Si cambia algo entre que cotizas y reservas, la creación falla en vez de cobrar otra cosa.1 · Mira si el recinto está abierto
Antes de enseñar un calendario, descarta los días cerrados. Cachéalo unos minutos, cambia poco:
curl https://pernocta.app/api/v1/closures \
-H "Authorization: Bearer pna_live_TU_CLAVE"Si bookingsClosed es true, el recinto no admite reservas ahora mismo y da igual la fecha que mires.
2 · Qué queda libre
curl "https://pernocta.app/api/v1/availability?from=2026-09-01&to=2026-09-04" \
-H "Authorization: Bearer pna_live_TU_CLAVE"Te devuelve las plazas libres con un precio «desde» y la estancia mínima del periodo (minStay y meetsMinStay). Ese «desde» sirve para pintar un listado, no para cobrar: para eso está el paso siguiente.
3 · El precio exacto
curl "https://pernocta.app/api/v1/quote?pitchId=UUID&from=2026-09-01&to=2026-09-04&persons=2&pets=1" \
-H "Authorization: Bearer pna_live_TU_CLAVE"Aquí entran los suplementos reales: personas de más, mascota, vehículo adicional, electricidad y la tasa turística, que va aparte porque no es tuya —la recauda el recinto para el ayuntamiento—.
La tasa turística no es ingreso
Viene entouristTaxCents, separada del resto. Si la sumas a tu comisión estarás cobrando sobre un dinero que no es del recinto ni tuyo.Cupones
Pasa coupon=CODIGO y la cotización lo valida contra las reglas reales (vigencia, límite por cliente, primera reserva). Si no vale, te lo dice en vez de aplicarlo y fallar al reservar.
4 · Extras
curl https://pernocta.app/api/v1/services \
-H "Authorization: Bearer pna_live_TU_CLAVE"Ofrece solo los que traen bookableOnline: true: el resto son de mostrador y no deberían aparecer en una venta remota. Fíjate en unit para multiplicar bien —por noche, por estancia o por persona— y en mandatory, que se cobra sí o sí.
5 · Cierra la reserva
curl -X POST https://pernocta.app/api/v1/reservations \
-H "Authorization: Bearer pna_live_TU_CLAVE" \
-H "Idempotency-Key: venta-8f3a2b1c" \
-H "Content-Type: application/json" \
-d '{
"pitchId": "UUID_DE_LA_PLAZA",
"guestName": "Ana Pérez",
"from": "2026-09-01",
"to": "2026-09-04",
"persons": 2,
"email": "ana@example.com",
"phone": "+34600111222",
"plate": "1234ABC",
"status": "confirmada"
}'«confirmada» solo se aplica si no queda nada por cobrar
Una reserva no se confirma con saldo pendiente: es la misma regla que impide confirmarla desde el panel sin registrar el cobro. Si pides confirmada y queda importe por cobrar, la reserva se crea igualmente pero en pendiente, y así te lo devuelve la respuesta — mira el status que recibes, no des por hecho el que mandaste. Cuando el cobro llega (por el enlace de pago, por la pasarela o en el mostrador), la reserva se confirma sola.Manda siempre Idempotency-Key
Si tu petición se pierde por el camino y reintentas sin ella, creas dos reservas y le cobras dos veces al cliente. Con ella, el reintento recibe la primera respuesta.Dos plataformas pueden pedir la misma plaza a la vez: el anti-overbooking es de base de datos, así que la segunda recibe un 409 limpio. Trátalo como «esa plaza acaba de irse», vuelve a consultar disponibilidad y ofrece otra.
6 · Después de vender
- Recoge la matrícula aunque no sea obligatoria en tu formulario: es lo que abre la barrera sola cuando el cliente llega. Si la sabes después, actualízala con
POST /reservations/{id}. - Suscríbete a
reservation.cancelled: si el huésped cancela desde el recinto, enterarte por webhook evita que tu sistema siga contándola como viva. - El check-in de viajeros lo hace el huésped con el enlace que le manda el recinto. No tienes que replicarlo salvo que quieras, y entonces está
POST /reservations/{id}/travelers.
Sobre el cobro
La reserva se crea con su importe, pero el cobro no pasa por esta API: o lo cobras tú en tu plataforma y liquidas con el recinto según lo que hayáis acordado, o se crea en estado pendiente y el recinto le manda su enlace de pago. Habladlo antes de montar nada: es una decisión comercial, no técnica.
