Documentación de la API
API REST para integrar tu sistema con Pxsol Agencias: buscá disponibilidad, cotizá y creá reservas desde tu propia plataforma.
Autenticación
Todos los endpoints piden una API key en el encabezado. La generás desde tu cuenta, en API Pública → Keys y Documentación.
Authorization: Bearer <api-key>Una key puede estar acotada: a ciertos endpoints (si le falta el permiso, la respuesta es 403 con code FORBIDDEN_SCOPE y el permiso que hace falta en required_scope) y a un solo cliente de la agencia (en ese caso sólo ve y opera sus propias reservas; una reserva de otro cliente responde 404). Si no se acotó nada, la key accede a todo.
URL de integración
En los ejemplos, https://BASE-URL es la URL de la API. Te la entregamos junto con tus credenciales cuando activamos el acceso.
Los archivos traen una base de ejemplo: reemplazala por la URL que te damos con tus credenciales (en Postman alcanza con editar la variable base_url).
Entorno de prueba
Antes de integrar contra inventario real, probá con una clave de prueba. La generás desde tu cuenta, en API Pública → Nueva key → Prueba. Empieza con pk_test_ y opera exactamente los mismos endpoints.
Authorization: Bearer pk_test_…- Misma URL y mismas rutas: para pasar a producción cambiás la clave y nada más.
- La disponibilidad es inventada y ninguna reserva llega a un proveedor real. Los rate_token empiezan con sbx:: y sólo los acepta una clave de prueba (y viceversa: una clave real los rechaza con 422).
- Las reservas que crees aparecen en la pantalla de Reservas de tu cuenta, marcadas como prueba, y las podés cancelar desde ahí o por la API. No entran en informes, tesorería ni facturación.
- Los correos al pasajero se envían igual, con [PRUEBA] en el asunto. Usá una dirección tuya.
- Los webhooks disparan normalmente y traen test: true en el cuerpo.
- Todavía no cubre servicios turísticos (/v1/services) ni el área /v1/admin: responden 422 con una clave de prueba.
Casos de error que podés forzar
| Hotel que nunca tiene disponibilidad | 5b000000-0000-4000-8000-000000000004 |
| Tarifa cuyo alta falla en el proveedor | NRF-FAIL |
Hoteles
Destinos
Reglas de precio
Búsqueda de disponibilidad
Cotizaciones
Reservas
Admin — Reservas
Pasajeros
Webhooks
Servicios Turísticos
Estado del servicio
Cómo leer los precios
| Campo | Qué es | Para qué lo usás |
|---|---|---|
| price.net · price.total | La tarifa del proveedor: es tu COSTO. | Conciliar con lo que te factura el proveedor. No mostrárselo al viajero: le estarías vendiendo al costo. |
| price.bar_reference | La tarifa pública del hotel, cuando el proveedor la informa. | Mostrar el precio de lista para comparar contra el tuyo. Es referencia, no un precio vendible. |
| pricing.purchase_price | Tu precio de compra: la tarifa del proveedor más tus reglas de COSTO. | Calcular tu margen y mandarlo como totalNet al reservar. |
| pricing.sale_price | Tu precio de venta: el de compra más tus reglas de MARGEN. | Es el precio que le mostrás a tu cliente, y el que va como totalAmount al reservar. |
- Los importes de pricing vienen en unidades menores (centavos) y sin decimal: sale_price 7229 son 72,29. La moneda es la de price.currency.
- Al reservar mandá totalAmount = sale_price y totalNet = purchase_price. La API confía en esos números: no los recalcula, así que si mandás el precio del proveedor la reserva queda registrada sin margen.
- Si una tarifa no se pudo cotizar, el campo pricing no viene (y las reglas que no se aplicaron se listan en pricing.skipped con el motivo). En ese caso no vendas esa tarifa: price es tu costo, no un precio de venta.
Imágenes
| Campo | En el listado (POST /v1/availability) | En la ficha (GET /v1/hotels/:id/availability) |
|---|---|---|
| hotels[].thumbnail_url | La foto de portada del hotel. | La misma. |
| hotels[].images | Hasta 5 fotos del hotel, la principal primero. | La galería completa (28 fotos de promedio, hay hoteles con más de 600). |
| rooms[].images | No viene: este endpoint no devuelve fotos de habitación. Si las necesitás, pedilas con GET /v1/hotels/:id/availability. | Sí: las fotos de cada habitación. |
- El tope del listado es para que la respuesta no se vuelva impracticable: con la galería completa, una búsqueda de 100 hoteles pesaría unos 740 KB. En la ficha no hay tope porque el hotel es uno.
- rooms[].images no existe en el listado, y no es que el hotel no tenga fotos: el buscador consulta precios y disponibilidad, y las fotos de habitación las tiene el contenido del proveedor, que se pide hotel por hotel. Para obtenerlas, llamá a GET /v1/hotels/:id/availability con el hotel que el cliente eligió — ahí vienen las de cada habitación y además la galería completa del hotel.
- La forma es siempre la misma en los dos: cada imagen trae url e is_primary, igual que las de GET /v1/hotels/:id. Un hotel sin fotos cargadas devuelve la lista vacía.
Estados de reserva
| Estado | Descripción | Puede ir a |
|---|---|---|
| PENDING | Reserva creada, pendiente de confirmación | CONFIRMED, CANCELLED, CANCELLED_BY_CLIENT, EXPIRED |
| CONFIRMED | Confirmada por la agencia | CANCELLED, CANCELLED_BY_CLIENT, PAID, BLOCKED |
| BLOCKED | Archivada: el viaje terminó sin cobro ni factura registrados | CONFIRMED, CANCELLED, PAID |
| PAID | Pago recibido y confirmado | (terminal) |
| CANCELLED | Cancelada por la agencia | (terminal) |
| CANCELLED_BY_CLIENT | Cancelada a solicitud del cliente | (terminal) |
| EXPIRED | Expirada automáticamente por vencimiento del hold | (terminal) |
Planes de comida
| Código | Nombre | Descripción |
|---|---|---|
| RO | Room Only | Solo habitación |
| BB | Bed & Breakfast | Desayuno incluido |
| HB | Half Board | Media pensión (desayuno y cena) |
| FB | Full Board | Pensión completa (desayuno, almuerzo y cena) |
| AI | All Inclusive | Todo incluido |
| UAI | Ultra All Inclusive | Ultra todo incluido |
¿Querés integrarte?
Si ya sos cliente, generá tu API key desde tu cuenta. Si todavía no lo sos, escribinos y te ayudamos a evaluar la integración.
Entrar a mi cuenta