Referencia de endpoints

Los 38 endpoints de la versión 1, agrupados por recurso. Todos cuelgan de https://pernocta.app/api/v1.

Esta página se genera de la misma definición que sirve la especificación OpenAPI, y un test del repositorio comprueba que cada endpoint documentado existe de verdad y que cada endpoint que existe está documentado. No puede quedarse desfasada sin que se rompa la compilación.

General

Comprobar la credencial y conocer el recinto.

GET/api/v1/pingcualquier clave

Comprueba la credencial

Devuelve el camping, los permisos y el entorno de la clave. Primera llamada recomendada.

Ejemplobash
curl "https://pernocta.app/api/v1/ping" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "ok": true,
  "camping": { "id": "bebdfebc-…", "name": "Área de autocaravanas", "timezone": "Europe/Madrid" },
  "scopes": ["reservations:read", "access:read", "access:write"],
  "environment": "test",
  "serverTime": "2026-08-21T18:00:00.000Z"
}
Probar en la consola →
GET/api/v1/campingreservations:read

Datos del recinto

Nombre, zona horaria y horarios de entrada y salida. La zona horaria importa: todas las fechas de estancia se interpretan en la hora local del recinto, no en UTC.

Ejemplobash
curl "https://pernocta.app/api/v1/camping" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": {
    "id": "bebdfebc-…", "name": "Área de autocaravanas", "slug": "area-ejemplo",
    "timezone": "Europe/Madrid", "checkinTime": "16:00", "checkoutTime": "12:00",
    "city": "Pontevedra", "postalCode": "36001", "country": "ES"
  }
}
Probar en la consola →
GET/api/v1/pitchesreservations:read

Plazas, tipos y zonas

El catálogo con los identificadores de plaza que hacen falta para crear reservas.

Ejemplobash
curl "https://pernocta.app/api/v1/pitches" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": {
    "pitches": [{ "id": "…", "code": "A-04", "typeCode": "PARCELA", "typeLabel": "Parcela", "zoneName": "Zona A", "active": true }],
    "types": [{ "id": "…", "code": "PARCELA", "label": "Parcela", "maxPersons": 6 }],
    "zones": [{ "id": "…", "name": "Zona A" }]
  }
}
Probar en la consola →

Reservas

Leer, crear y mover reservas.

GET/api/v1/availabilityreservations:read

Disponibilidad entre dos fechas

Qué queda libre y desde qué precio. Es el mismo cálculo que usa el portal público: no hay una disponibilidad «de la API» distinta de la real.

Parámetros

  • fromstring · obligatorio— Entrada (YYYY-MM-DD)
  • tostring · obligatorio— Salida (YYYY-MM-DD)
  • typestring— Filtrar por código de tipo de plaza
  • onlyFreestring— 1 (por defecto) solo libres, 0 todas
Ejemplobash
curl "https://pernocta.app/api/v1/availability?from=…&to=…" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": {
    "from": "2026-09-01", "to": "2026-09-04", "nights": 3, "minStay": 2, "meetsMinStay": true,
    "pitches": [{ "pitchId": "…", "code": "A-04", "typeCode": "PARCELA", "free": true,
                  "fromPerNightCents": 2450, "totalCents": 7350 }]
  }
}
Probar en la consola →
GET/api/v1/reservationsreservations:read

Listado de reservas

Parámetros

  • fromstring— Solape desde (YYYY-MM-DD)
  • tostring— Solape hasta (YYYY-MM-DD)
  • statusstring— Estados separados por comas
  • platestring— Matrícula (se normaliza sola)
  • numberinteger— Localizador de la reserva
  • emailstring— Email del titular
  • limitinteger— 1-200, por defecto 50
  • offsetinteger— Desplazamiento
Ejemplobash
curl "https://pernocta.app/api/v1/reservations" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": [{ "id": "…", "number": 59383, "guestName": "Ana Pérez", "plate": "1234ABC",
             "from": "2026-09-01", "to": "2026-09-04", "persons": 2, "status": "confirmada",
             "checkin": "completado", "totalCents": 7350, "channel": "web" }],
  "pagination": { "total": 128, "limit": 50, "offset": 0, "hasMore": true }
}
Probar en la consola →
POST/api/v1/reservationsreservations:writecambia datosIdempotency-Key

Crea una reserva

Pasa por el mismo camino que el mostrador: hereda anti-overbooking, precio y políticas.

Cuerpo

  • pitchId uuid
  • guestName string
  • from YYYY-MM-DD
  • to YYYY-MM-DD
  • persons integer?
  • plate string?
  • email string?
  • phone string?
  • status pendiente|confirmada?
Ejemplobash
curl -X POST "https://pernocta.app/api/v1/reservations" \
  -H "Authorization: Bearer pna_live_TU_CLAVE" \
  -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,
    "plate": "1234ABC",
    "email": "ana@example.com"
  }'
Probar en la consola →
GET/api/v1/reservations/{id}reservations:read

Detalle de una reserva, con viajeros y acceso vigente

Ejemplobash
curl "https://pernocta.app/api/v1/reservations/RESERVA_UUID" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": {
    "id": "…", "number": 59383, "guestName": "Ana Pérez", "pitchCode": "A-04",
    "from": "2026-09-01", "to": "2026-09-04", "status": "en_casa", "checkin": "completado",
    "access": { "validFrom": "2026-09-01T00:00:00.000Z", "validTo": "2026-09-04T12:00:00.000Z", "provider": "ttlock" },
    "travelers": [{ "id": "…", "esTitular": true, "nombre": "ANA", "apellido1": "PEREZ",
                    "numeroDocumento": "12345678Z", "nacionalidad": "ESP", "sesStatus": "enviado" }]
  }
}
Probar en la consola →
POST/api/v1/reservations/{id}/checkinreservations:writecambia datosIdempotency-Key

Marca la entrada del huésped

También se marca sola cuando el huésped cruza la barrera con su matrícula o con su código.

Ejemplobash
curl -X POST "https://pernocta.app/api/v1/reservations/RESERVA_UUID/checkin" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Probar en la consola →
POST/api/v1/reservations/{id}/checkoutreservations:writecambia datosIdempotency-Key

Marca la salida

Sella la hora de salida y libera la plaza para limpieza.

Ejemplobash
curl -X POST "https://pernocta.app/api/v1/reservations/RESERVA_UUID/checkout" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Probar en la consola →
POST/api/v1/reservations/{id}/cancelreservations:writecambia datosIdempotency-Key

Cancela la reserva (sin mover dinero)

Registra la cancelación y deja la devolución en manos de una persona del camping. Un sistema externo no debería poder emitir reembolsos por su cuenta.

Ejemplobash
curl -X POST "https://pernocta.app/api/v1/reservations/RESERVA_UUID/cancel" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Probar en la consola →
POST/api/v1/reservations/{id}reservations:writecambia datosIdempotency-Key

Actualiza datos de una reserva

Matrícula, contacto, hora de llegada y titular. Las fechas, la plaza y el precio NO se tocan por aquí: eso mueve disponibilidad y dinero, y pasa por el motor de reservas con sus reglas.

Ejemplobash
curl -X POST "https://pernocta.app/api/v1/reservations/RESERVA_UUID" \
  -H "Authorization: Bearer pna_live_TU_CLAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "plate": "4321CBA",
    "phone": "+34600111222"
  }'
Probar en la consola →
GET/api/v1/quotereservations:read

Cuánto costaría una estancia

Cotiza sin crear nada, con el MISMO motor que el portal y el mostrador: el precio que devuelve es el que se va a cobrar, con suplementos, tasa turística y cupón incluidos. Es lo que permite que otra plataforma venda plazas del recinto.

Parámetros

  • pitchIdstring · obligatorio— Plaza a cotizar
  • fromstring · obligatorio— Entrada (YYYY-MM-DD)
  • tostring · obligatorio— Salida (YYYY-MM-DD)
  • personsinteger— Ocupantes (por defecto 2)
  • childreninteger— Menores, para la exención de tasa
  • teensinteger— Adolescentes
  • babiesinteger— Bebés (la franja de edad más baja)
  • vehiclesinteger— Vehículos
  • petsinteger— Mascotas
  • ratePlanIdstring— Plan tarifario; si se omite, el de por defecto
  • couponstring— Código promocional a validar
Ejemplobash
curl "https://pernocta.app/api/v1/quote?pitchId=…&from=…&to=…" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": {
    "nights": 3,
    "baseCents": 6600,
    "extrasCents": 450,
    "touristTaxCents": 300,
    "discountCents": 0,
    "totalCents": 7350,
    "depositCents": 2205,
    "breakdown": [{ "date": "2026-09-01", "cents": 2200 }]
  }
}
Probar en la consola →
GET/api/v1/servicesreservations:read

Extras y suplementos del catálogo

Con su precio, su IVA y su unidad (por noche, por estancia, por persona). Sin esto, quien vende desde fuera no puede ofrecer la luz, la mascota o el vehículo adicional.

Ejemplobash
curl "https://pernocta.app/api/v1/services" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": [{ "id": "…", "code": "luz", "name": "Electricidad", "priceCents": 450,
             "taxRatePct": 21, "unit": "per_night", "mandatory": false, "bookableOnline": true }]
}
Probar en la consola →
GET/api/v1/closuresreservations:read

Días en que el recinto no admite reservas

Consúltalo antes de ofrecer fechas: enterarse de que el área está cerrada DESPUÉS de cobrarle al cliente es la peor forma de descubrirlo.

Ejemplobash
curl "https://pernocta.app/api/v1/closures" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": {
    "bookingsClosed": false,
    "closedReason": null,
    "periods": [{ "id": "…", "from": "2026-11-15", "to": "2026-12-01", "reason": "Obras" }]
  }
}
Probar en la consola →

Viajeros

Registrar viajeros desde un escáner documental.

POST/api/v1/reservations/{id}/travelerstravelers:writecambia datosIdempotency-Key

Registra viajeros desde un escáner documental externo

Cuerpo

  • travelers array de { nombre, apellido1, tipoDocumento?, numeroDocumento?, soporteDocumento?, fechaNacimiento?, sexo?, nacionalidad? }
Ejemplobash
curl -X POST "https://pernocta.app/api/v1/reservations/RESERVA_UUID/travelers" \
  -H "Authorization: Bearer pna_live_TU_CLAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "travelers": [
      {
        "nombre": "ANA",
        "apellido1": "PEREZ",
        "apellido2": "GARCIA",
        "tipoDocumento": "NIF",
        "numeroDocumento": "12345678Z",
        "soporteDocumento": "ABC123456",
        "fechaNacimiento": "1985-04-12",
        "sexo": "M",
        "nacionalidad": "ESP"
      }
    ]
  }'
Respuestajson
{
  "data": {
    "reservationId": "…",
    "travelers": [{ "guestId": "…", "action": "created", "numeroDocumento": "12345678Z" }]
  }
}
Probar en la consola →

Control de accesos

Matrículas, barreras y auditoría de entradas.

GET/api/v1/access/whitelistaccess:read

Matrículas autorizadas ahora mismo

La lista que debe vivir DENTRO de la cámara para que la barrera funcione sin conexión.

Parámetros

  • daysinteger— Días de llegadas futuras a precargar (0-30)
Ejemplobash
curl "https://pernocta.app/api/v1/access/whitelist" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": [{ "plate": "1234ABC", "reservationId": "…", "reservationNumber": 59383,
             "guestName": "Ana Pérez", "from": "2026-09-01", "to": "2026-09-04", "status": "en_casa" }],
  "generatedAt": "2026-08-21T18:00:00.000Z",
  "refreshSeconds": 300
}
Probar en la consola →
POST/api/v1/access/plateaccess:writecambia datosIdempotency-Key

Notifica una matrícula leída y abre si procede

Cuerpo

  • plate string
  • open boolean?
  • lockId uuid?
  • deviceId string?
Ejemplobash
curl -X POST "https://pernocta.app/api/v1/access/plate" \
  -H "Authorization: Bearer pna_live_TU_CLAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "plate": "1234ABC",
    "open": false,
    "deviceId": "carril-entrada"
  }'
Respuestajson
{
  "data": {
    "authorized": true, "opened": true, "cooldown": false, "exactMatch": true, "plate": "1234ABC",
    "deviceId": "carril-entrada",
    "reservation": { "id": "…", "number": 59383, "guestName": "Ana Pérez",
                     "from": "2026-09-01", "to": "2026-09-04", "status": "en_casa" }
  }
}
Probar en la consola →
POST/api/v1/access/openaccess:writecambia datosIdempotency-Key

Abre una puerta directamente

Cuerpo

  • lockId uuid?
  • reservationId uuid?
Ejemplobash
curl -X POST "https://pernocta.app/api/v1/access/open" \
  -H "Authorization: Bearer pna_live_TU_CLAVE" \
  -H "Content-Type: application/json" \
  -d '{}'
Probar en la consola →
GET/api/v1/access/doorsaccess:read

Puertas del recinto

Con su identificador, para dirigir la apertura a una puerta concreta.

Ejemplobash
curl "https://pernocta.app/api/v1/access/doors" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{ "data": [{ "id": "…", "label": "Barrera de entrada", "isPrimary": true, "enabled": true }] }
Probar en la consola →
GET/api/v1/access/eventsaccess:read

Histórico de aperturas (auditoría)

Quién entró, cuándo, por qué medio y con qué matrícula. Es lo que se enseña cuando hay que demostrar el control de accesos, no solo tenerlo.

Parámetros

  • fromstring— Desde (ISO 8601)
  • tostring— Hasta (ISO 8601)
  • limitinteger— 1-500, por defecto 100
  • offsetinteger— Desplazamiento
Ejemplobash
curl "https://pernocta.app/api/v1/access/events" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": [{ "id": "…", "at": "2026-08-21T16:55:21.000Z", "door": "Barrera de entrada",
             "method": "matricula", "success": true, "guestName": "Ana Pérez", "reservationId": "…" }],
  "pagination": { "limit": 100, "offset": 0, "count": 1 }
}
Probar en la consola →
GET/api/v1/access/passesaccess:read

Pasos por la cámara de matrículas, incluidos los rechazos

Lo que vio la cámara, abriera o no. A diferencia de /access/events (aperturas físicas de la cerradura), aquí están también los coches a los que NO se les abrió, con el motivo: es lo que se revisa al día siguiente en un recinto sin nadie de guardia.

Parámetros

  • limitinteger— 1-500, por defecto 100
  • outcomestring— abierto | denegado
  • directionstring— entrada | salida
Ejemplobash
curl "https://pernocta.app/api/v1/access/passes" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": [{ "id": "…", "at": "2026-09-07T03:14:00.000Z", "plate": "9999ZZZ",
             "direction": "entrada", "outcome": "denegado", "reason": "unknown_plate",
             "who": null, "reservationId": null, "reservationNumber": null }],
  "pagination": { "limit": 100, "count": 1 }
}
Probar en la consola →
POST/api/v1/access/closeaccess:writecambia datosIdempotency-Key

Cierra una puerta

La barrera es de pulso: quien gobierna el carril desde su propio sistema necesita poder mandar también el impulso de cierre.

Ejemplobash
curl -X POST "https://pernocta.app/api/v1/access/close" \
  -H "Authorization: Bearer pna_live_TU_CLAVE" \
  -H "Content-Type: application/json" \
  -d '{}'
Probar en la consola →
GET/api/v1/reservations/{id}/access-codeaccess:read

Código de acceso de la estancia

Para que una app propia se lo enseñe al huésped sin replicar nuestra lógica de emisión. `provider: "ttlock"`, `"nuki"`, `"raixer"`, `"akiles"`, `"igloohome"`, `"tedee"`, `"2n"` o `"hikvision"` = el código lo emitió la cerradura y abre de verdad; `null` = código local, informativo.

Ejemplobash
curl "https://pernocta.app/api/v1/reservations/RESERVA_UUID/access-code" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": {
    "code": "154236",
    "provider": "ttlock",
    "validFrom": "2026-09-01T00:00:00.000Z",
    "validTo": "2026-09-04T12:00:00.000Z",
    "active": true
  }
}
Probar en la consola →

Facturación

Facturas y cobros, para la gestoría o el ERP.

GET/api/v1/invoicesbilling:read

Facturas emitidas

Parámetros

  • fromstring— Emitidas desde (YYYY-MM-DD)
  • tostring— Emitidas hasta (YYYY-MM-DD)
  • limitinteger— 1-500, por defecto 100
  • offsetinteger— Desplazamiento
Ejemplobash
curl "https://pernocta.app/api/v1/invoices" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": [{ "id": "…", "series": "A", "number": 143, "reference": "A143",
             "issuedAt": "2026-08-20T10:12:00.000Z", "customerName": "Ana Pérez",
             "customerNif": "12345678Z", "totalCents": 7350, "status": "emitida", "type": "F1" }],
  "pagination": { "total": 143, "limit": 100, "offset": 0, "hasMore": true }
}
Probar en la consola →
GET/api/v1/invoices/{id}billing:read

Factura con sus líneas, bases e impuestos

Ejemplobash
curl "https://pernocta.app/api/v1/invoices/RESERVA_UUID" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Probar en la consola →
GET/api/v1/paymentsbilling:read

Cobros y devoluciones

Se filtra por la fecha en que ENTRÓ el dinero, no por la de creación: en un cobro online el enlace puede generarse días antes de que alguien lo pague.

Parámetros

  • fromstring— Cobrado desde (YYYY-MM-DD)
  • tostring— Cobrado hasta (YYYY-MM-DD)
  • reservationIdstring— Solo los de una reserva
  • statusstring— Estado del cobro
  • limitinteger— 1-500, por defecto 100
  • offsetinteger— Desplazamiento
Ejemplobash
curl "https://pernocta.app/api/v1/payments" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": [{ "id": "…", "reservationId": "…", "method": "tarjeta", "status": "pagado",
             "amountCents": 7350, "refundedCents": 0, "provider": "stripe",
             "providerRef": "pi_3Q…", "settledAt": "2026-08-20T10:11:44.000Z" }]
}
Probar en la consola →

TPV externo

Que el TPV del bar o el restaurante cargue tickets a la cuenta de una reserva.

GET/api/v1/stayscharges:write

Busca la estancia a la que cargar

Quién está hoy en el camping, por código de plaza (sin distinguir mayúsculas ni guiones), número de reserva o nombre (sin acentos). Devuelve lo mínimo para elegir la cuenta, sin datos de contacto. La estancia se identifica por `stay`, su número de reserva: es lo que se usa para cargarle.

Parámetros

  • pitchstring— Código de la plaza, p. ej. A12
  • numberinteger— Número de reserva
  • namestring— Nombre del titular (2 letras o más)
Ejemplobash
curl "https://pernocta.app/api/v1/stays" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": [{ "stay": 50123, "guestName": "Jordi Puig", "pitch": "A12",
             "from": "2026-10-17", "to": "2026-10-20", "status": "en_casa" }]
}
Probar en la consola →
POST/api/v1/stays/{number}/chargescharges:writecambia datosIdempotency-Key

Carga un ticket a la cuenta

Apunta un ticket del TPV del bar como deuda de la reserva, sin factura de Pernocta: el ticket fiscal es el de tu TPV. El huésped lo paga a la salida con el resto de consumos. Idempotente por `externalId`: repetir el envío devuelve el mismo cargo (200); la primera vez, 201. Solo reservas confirmadas o en el camping.

Cuerpo

  • source tu TPV, p. ej. «agora» (obligatorio)
  • externalId nº del ticket en tu TPV (obligatorio)
  • description texto (obligatorio)
  • lines líneas con name, qty, unitPriceCents y taxRate
  • totalCents total en céntimos, si no mandas líneas
Ejemplobash
curl -X POST "https://pernocta.app/api/v1/stays/{number}/charges" \
  -H "Authorization: Bearer pna_live_TU_CLAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "source": "agora",
    "externalId": "T-2026-004512",
    "description": "Bar · mesa 4",
    "lines": [
      {
        "name": "Caña",
        "qty": 2,
        "unitPriceCents": 250,
        "taxRate": 10
      },
      {
        "name": "Bocadillo",
        "qty": 1,
        "unitPriceCents": 600,
        "taxRate": 10
      }
    ]
  }'
Respuestajson
{
  "data": { "id": "c1f0…", "stay": 50123, "source": "agora", "externalId": "T-2026-004512",
            "description": "Bar · mesa 4", "totalCents": 1100, "status": "pending", "settledMethod": null,
            "settledAt": null, "createdAt": "2026-10-18T13:05:00.000Z" }
}
Probar en la consola →
GET/api/v1/stays/{number}/chargescharges:write

Cargos de una reserva

Los tickets cargados a la cuenta y en qué estado están: por cobrar (pending), cobrado (settled) o anulado (voided).

Ejemplobash
curl "https://pernocta.app/api/v1/stays/{number}/charges" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Probar en la consola →
POST/api/v1/charges/{id}/voidcharges:writecambia datosIdempotency-Key

Anula un cargo

Cuando el TPV anula el ticket. Solo los cargos de tu propia clave y mientras no se hayan cobrado; uno cobrado lo devuelve recepción desde Pernocta. Anular dos veces da el mismo resultado.

Ejemplobash
curl -X POST "https://pernocta.app/api/v1/charges/RESERVA_UUID/void" \
  -H "Authorization: Bearer pna_live_TU_CLAVE" \
  -H "Content-Type: application/json" \
  -d '{}'
Probar en la consola →

Operativa

Clientes y partes de limpieza.

GET/api/v1/customerscustomers:read

Clientes con su historial

Agrupados por email, que es la identidad estable: la misma persona aparece con el nombre escrito de tres formas a lo largo de cinco años.

Parámetros

  • searchstring— Busca en nombre, email y teléfono
  • limitinteger— 1-200, por defecto 50
  • offsetinteger— Desplazamiento
Ejemplobash
curl "https://pernocta.app/api/v1/customers" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": [{ "email": "ana@example.com", "name": "Ana Pérez", "phone": "+34600111222",
             "stays": 7, "firstStay": "2023-06-12", "lastStay": "2026-08-04",
             "totalCents": 214500, "pendingCents": 0, "overdueCents": 0,
             "tags": ["habitual"], "hasAccount": true }]
}
Probar en la consola →
GET/api/v1/housekeepingreservations:read

Partes de limpieza del día

Qué plaza hay que limpiar, en qué estado está y cuál es prioritaria porque entra alguien hoy. Para quien tenga su propia app de limpieza o subcontrate el servicio.

Parámetros

  • daystring— Día (YYYY-MM-DD); por defecto hoy en la hora del recinto
Ejemplobash
curl "https://pernocta.app/api/v1/housekeeping" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": {
    "day": "2026-08-21",
    "tasks": [{ "id": "…", "pitchCode": "A-04", "location": "A-04", "zoneName": "Zona A",
                "kind": "salida", "status": "pendiente", "assignedTo": "Marta",
                "priority": true, "arrivalTime": "17:00", "notes": null, "completedAt": null }]
  }
}
Probar en la consola →

Plataforma

Eventos para reconciliar y consumo de tu credencial.

GET/api/v1/eventsreservations:read

Eventos emitidos, para reconciliar

Si tu servidor estuvo caído, lee desde el instante que te falte en vez de pedir un reenvío a ciegas. Se registran los eventos de los tipos a los que tengas algún webhook suscrito.

Parámetros

  • sincestring— Desde (ISO 8601)
  • eventstring— Tipos separados por comas
  • limitinteger— 1-200, por defecto 50
Ejemplobash
curl "https://pernocta.app/api/v1/events" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": [{ "id": "…", "event": "access.opened", "createdAt": "2026-08-21T18:00:00.000Z",
             "data": { "plate": "1234ABC", "via": "anpr" }, "deliveryStatus": "delivered", "attempts": 1 }]
}
Probar en la consola →
GET/api/v1/webhookscualquier clave

Webhooks suscritos

Los webhooks del recinto de eventos que tu clave puede recibir. Nunca devuelve el secreto de firma.

Ejemplobash
curl "https://pernocta.app/api/v1/webhooks" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": [{ "id": "6f1c…", "url": "https://hooks.zapier.com/hooks/standard/…", "events": ["reservation.created"],
             "enabled": true, "description": "Creado por la API", "createdAt": "2026-10-17T18:00:00.000Z" }]
}
Probar en la consola →
POST/api/v1/webhookscualquier clavecambia datosIdempotency-Key

Suscribe un webhook

Crea una suscripción a eventos y devuelve su secreto de firma (una sola vez). Es lo que usan Zapier y Make al activar un Zap o un escenario. Solo te puedes suscribir a los eventos que podrías leer con tu clave. Si tu endpoint responde 410, la suscripción se desactiva sola.

Cuerpo

  • url https://… (obligatorio)
  • events lista de eventos (obligatorio)
  • description texto libre (opcional)
Ejemplobash
curl -X POST "https://pernocta.app/api/v1/webhooks" \
  -H "Authorization: Bearer pna_live_TU_CLAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://hooks.zapier.com/hooks/standard/123/abc/",
    "events": [
      "reservation.created",
      "reservation.cancelled"
    ]
  }'
Respuestajson
{
  "id": "6f1c…", "url": "https://hooks.zapier.com/hooks/standard/123/abc/",
  "events": ["reservation.created", "reservation.cancelled"], "secret": "whsec_…"
}
Probar en la consola →
DELETE/api/v1/webhooks/{id}cualquier clavecambia datos

Da de baja un webhook

Borra la suscripción. Responde 204 sin cuerpo. Lo llaman Zapier y Make al apagar el Zap o el escenario.

Ejemplobash
curl -X DELETE "https://pernocta.app/api/v1/webhooks/RESERVA_UUID" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Probar en la consola →
GET/api/v1/usagecualquier clave

Consumo de tu credencial

Peticiones y errores de los últimos 30 días, y tu cuota actual. Cada clave solo ve lo suyo.

Ejemplobash
curl "https://pernocta.app/api/v1/usage" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": {
    "last30Days": { "requests": 4210, "errors": 12 },
    "today": { "day": "2026-08-21", "requests": 143, "errors": 0, "lastEndpoint": "/api/v1/access/plate" },
    "rateLimit": { "limit": 600, "remaining": 598, "reset": 1787331302 }
  }
}
Probar en la consola →
GET/api/v1/occupancyreservations:read

Ocupación por día

Plazas ocupadas y porcentaje, día a día. Para el cuadro de mando de un ayuntamiento o una gestora, sin tener que descargarse todas las reservas y contar por su cuenta.

Parámetros

  • fromstring · obligatorio— Desde (YYYY-MM-DD)
  • tostring · obligatorio— Hasta, exclusivo (YYYY-MM-DD)
Ejemplobash
curl "https://pernocta.app/api/v1/occupancy?from=…&to=…" \
  -H "Authorization: Bearer pna_live_TU_CLAVE"
Respuestajson
{
  "data": {
    "from": "2026-08-01", "to": "2026-08-08", "totalPitches": 60,
    "days": [{ "day": "2026-08-01", "occupied": 47, "occupancyRate": 78.3 }]
  }
}
Probar en la consola →