Desarrolladores
Documentación de la API B2B
La API B2B detrás de nwp.ae: cotice y reserve para sus clientes a tarifa neta, emita bonos y gestione un mostrador de hotel, transporte corporativo y programas DMC, con sus tarifas, extractos y facturas en el mismo sitio. Acceso anticipado: las claves sandbox responden con datos de prueba marcados como tales y las claves live se emiten tras la aprobación.
EstadoAcceso anticipado · solo sandbox
El sandbox valida solicitudes reales con el esquema real y responde con datos de prueba. No se reserva nada, no se bloquea ningún vehículo y no se devuelve ningún precio. El sandbox no conlleva ningún compromiso de nivel de servicio, y las claves de producción se emiten a los socios aprobados cuando se abra la API.
Solicitar acceso anticipadoResumen
JSON sobre HTTPS. Envíe Content-Type: application/json. Cada respuesta es JSON e incluye una cabecera x-request-id que debe indicar a nuestro equipo de agencias; las respuestas del sandbox incluyen también x-nwp-environment: sandbox.
| URL base | — |
|---|---|
| Sandbox | https://nwp.ae/api/b2b/sandbox |
| Producción | https://nwp.ae/api/b2b/v1Aún no abierta · Requiere una clave live — emitida tras la aprobación |
API B2B v1
Una sola API para todo lo que hace una cuenta: transporte terrestre y tours y actividades con precios según sus condiciones comerciales (tarifa neta, comisión o tarifa pactada), reservas para sus clientes, bonos y carteles con el nombre, el mostrador de hotel, transporte corporativo, programas DMC, el widget de reservas, usuarios, avisos, extractos y facturas. Las claves sandbox (nwp_test_…) están abiertas a quienes solicitan una cuenta: responden en cada endpoint con datos de prueba marcados sandbox: true y nunca reservan ni modifican su cuenta. Las claves live (nwp_live_…) se emiten tras la aprobación y funcionan cuando NWP activa el acceso live de su cuenta. Cada POST admite un Idempotency-Key, cada respuesta lleva x-request-id y cada clave tiene su propio límite por minuto.
El documento OpenAPI 3.1: /api/b2b/v1/openapi.json
Transporte terrestre
POST/api/b2b/v1/transport/quotePrecio según sus condiciones
Alcance:
transport:readPOST/api/b2b/v1/transport/bookingsReservar
Alcance:
transport:writeRequiere una clave live — emitida tras la aprobaciónGET/api/b2b/v1/transport/bookings/{id}Estado de la reserva y condiciones de cancelación
Alcance:
transport:readPOST/api/b2b/v1/transport/bookings/{id}/cancelCancelar según la política
Alcance:
transport:writeRequiere una clave live — emitida tras la aprobaciónGET/api/b2b/v1/transport/bookings/{id}/voucherBono con su marca (HTML o PDF)
Alcance:
transport:read
Tours y actividades
GET/api/b2b/v1/activities/productsProductos a la venta, por persona o por vehículo
Alcance:
activities:readGET/api/b2b/v1/activities/products/{id}/availabilityDisponibilidad por día
Alcance:
activities:readPOST/api/b2b/v1/activities/quotePrecio según sus condiciones
Alcance:
activities:readPOST/api/b2b/v1/activities/bookingsReservar
Alcance:
activities:writeRequiere una clave live — emitida tras la aprobaciónGET/api/b2b/v1/activities/bookings/{id}Estado de la reserva y condiciones de cancelación
Alcance:
activities:readPOST/api/b2b/v1/activities/bookings/{id}/cancelCancelar según la política
Alcance:
activities:writeRequiere una clave live — emitida tras la aprobaciónGET/api/b2b/v1/activities/bookings/{id}/voucherBono con su marca (HTML o PDF)
Alcance:
activities:read
Cruceros
GET/api/b2b/v1/cruise/sailingsSalidas
Alcance:
cruise:readAún no disponible: responde 501 hasta que se conecte un proveedor de crucerosPOST/api/b2b/v1/cruise/quotePrecio según sus condiciones
Alcance:
cruise:readAún no disponible: responde 501 hasta que se conecte un proveedor de crucerosPOST/api/b2b/v1/cruise/bookingsReservar
Alcance:
cruise:writeAún no disponible: responde 501 hasta que se conecte un proveedor de crucerosGET/api/b2b/v1/cruise/bookings/{id}Estado de la reserva y condiciones de cancelación
Alcance:
cruise:readAún no disponible: responde 501 hasta que se conecte un proveedor de crucerosPOST/api/b2b/v1/cruise/bookings/{id}/cancelCancelar según la política
Alcance:
cruise:writeAún no disponible: responde 501 hasta que se conecte un proveedor de cruceros
Guías de bienvenida
GET/api/b2b/v1/guides/propertiesTus alojamientos
Alcance:
guides:readPOST/api/b2b/v1/guides/propertiesAñadir un alojamiento
Alcance:
guides:writeGET/api/b2b/v1/guides/properties/{id}Guía, enlace y archivos de un alojamiento
Alcance:
guides:readPATCH/api/b2b/v1/guides/properties/{id}Editar un alojamiento
Alcance:
guides:writePOST/api/b2b/v1/guides/properties/{id}/statusPausar o reactivar una guía
Alcance:
guides:writePOST/api/b2b/v1/guides/properties/{id}/linkSustituir el enlace de huéspedes
Alcance:
guides:writeGET/api/b2b/v1/guides/properties/{id}/wifiLeer el wifi
Alcance:
guides_wifi:readPOST/api/b2b/v1/guides/properties/{id}/wifiConfigurar el wifi
Alcance:
guides_wifi:writeGET/api/b2b/v1/guides/properties/{id}/qrCódigo QR (PNG o SVG)
Alcance:
guides:readGET/api/b2b/v1/guides/properties/{id}/cardTarjeta imprimible (PDF o HTML)
Alcance:
guides:readGET/api/b2b/v1/guides/statsEscaneos, visitas, reservas y tu parte
Alcance:
guides:read
Cuenta
GET/api/b2b/v1/whoamiComprobar una clave
Alcance:
account:readGET/api/b2b/v1/openapi.jsonEsta API en OpenAPI 3.1
Afiliados
GET/api/b2b/v1/affiliate/statsEstadísticas de un periodo: clics, reservas, conversión, ingresos
Alcance:
affiliate:readGET/api/b2b/v1/affiliate/linksSus enlaces de seguimiento, con códigos QR
Alcance:
affiliate:readPOST/api/b2b/v1/affiliate/linksCrear un enlace de seguimiento con UTM
Alcance:
affiliate:writeRequiere una clave live — emitida tras la aprobaciónGET/api/b2b/v1/affiliate/links/{code}/qrCódigo QR de un enlace (SVG o PNG)
Alcance:
affiliate:readGET/api/b2b/v1/affiliate/performanceClics, reservas e ingresos por enlace
Alcance:
affiliate:readGET/api/b2b/v1/affiliate/payoutsSaldo pendiente de pago y solicitudes de pago
Alcance:
affiliate:readPOST/api/b2b/v1/affiliate/payoutsSolicitar un pago, enviado por transferencia bancaria
Alcance:
affiliate:writeRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/affiliate/payouts/{reference}/cancelRetirar una solicitud de pago
Alcance:
affiliate:writeRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/affiliate/bank-detailsGuardar los datos bancarios (solo escritura)
Alcance:
affiliate:writeRequiere una clave live — emitida tras la aprobaciónGET/api/b2b/v1/affiliate/widgetConfiguración y código del widget
Alcance:
affiliate:readPOST/api/b2b/v1/affiliate/widgetConfigurar el widget de reservas
Alcance:
affiliate:writeRequiere una clave live — emitida tras la aprobación
Reservas para sus clientes
POST/api/b2b/v1/bookings/quotePrecio según sus condiciones
Alcance:
bookings:createPOST/api/b2b/v1/bookingsReservar
Alcance:
bookings:createRequiere una clave live — emitida tras la aprobaciónGET/api/b2b/v1/bookingsListar
Alcance:
bookings:viewGET/api/b2b/v1/bookings/creditedReservas atribuidas a su cuenta
Alcance:
bookings:viewGET/api/b2b/v1/bookings/{ref}Detalles
Alcance:
bookings:viewPOST/api/b2b/v1/bookings/{ref}/cancelCancelar según la política
Alcance:
bookings:manageRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/bookings/{ref}/amendmentsPedir un cambio a nuestro equipo de agencias
Alcance:
bookings:manageRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/bookings/{ref}/brandSu marca, o ninguna, en sus documentos
Alcance:
bookings:manageRequiere una clave live — emitida tras la aprobaciónGET/api/b2b/v1/bookings/{ref}/voucherBono con su marca (HTML o PDF)
Alcance:
bookings:viewGET/api/b2b/v1/bookings/{ref}/name-boardCartel del conductor con el nombre (HTML)
Alcance:
bookings:viewGET/api/b2b/v1/requestsSolicitudes de cambio y de servicio, con las respuestas del equipo
Alcance:
bookings:viewPOST/api/b2b/v1/requests/{id}/withdrawRetirar una solicitud abierta
Alcance:
bookings:manageRequiere una clave live — emitida tras la aprobación
Mostrador de hotel
POST/api/b2b/v1/desk/salesVenta rápida en el mostrador
Alcance:
bookings:createRequiere una clave live — emitida tras la aprobaciónGET/api/b2b/v1/desk/days/{date}Las ventas de un día, o su liquidación en CSV o PDF
Alcance:
statements:readPOST/api/b2b/v1/desk/days/{date}/closeCerrar el día y congelar su liquidación
Alcance:
statements:readRequiere una clave live — emitida tras la aprobación
Transporte corporativo
GET/api/b2b/v1/corporate/cost-centresListar
Alcance:
bookings:viewPOST/api/b2b/v1/corporate/cost-centresCrear o modificar
Alcance:
settings:manageRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/corporate/cost-centres/{id}/approversCrear o modificar
Alcance:
settings:manageRequiere una clave live — emitida tras la aprobaciónGET/api/b2b/v1/corporate/requestsListar
Alcance:
bookings:viewPOST/api/b2b/v1/corporate/requestsReservar
Alcance:
bookings:createRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/corporate/requests/{id}/decisionAprobar o rechazar
Alcance:
bookings:createRequiere una clave live — emitida tras la aprobaciónGET/api/b2b/v1/corporate/shuttlesListar
Alcance:
bookings:viewPOST/api/b2b/v1/corporate/shuttlesCrear o modificar
Alcance:
bookings:createRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/corporate/shuttles/{id}/statusCambiar su estado
Alcance:
bookings:createRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/corporate/shuttles/{id}/scheduleProgramar los servicios de un mes
Alcance:
bookings:createRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/corporate/shuttles/{id}/repriceAplicar una tarifa recién acordada
Alcance:
bookings:createRequiere una clave live — emitida tras la aprobaciónGET/api/b2b/v1/corporate/usageUso por centro de coste (JSON o CSV)
Alcance:
statements:read
Programas DMC
GET/api/b2b/v1/dmc/programmesListar
Alcance:
bookings:viewPOST/api/b2b/v1/dmc/programmesCrear o modificar
Alcance:
bookings:createRequiere una clave live — emitida tras la aprobaciónGET/api/b2b/v1/dmc/programmes/{id}Detalles
Alcance:
bookings:viewPOST/api/b2b/v1/dmc/programmes/{id}/versionsGuardar una versión con precio
Alcance:
bookings:createRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/dmc/programmes/{id}/statusCambiar su estado
Alcance:
bookings:createRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/dmc/programmes/{id}/brandSu marca, o ninguna, en sus documentos
Alcance:
bookings:createRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/dmc/programmes/{id}/acceptAceptar una versión y reservarla
Alcance:
bookings:createRequiere una clave live — emitida tras la aprobaciónGET/api/b2b/v1/dmc/programmes/{id}/proposalPropuesta para el cliente (HTML)
Alcance:
bookings:viewPOST/api/b2b/v1/dmc/programmes/{id}/linksEmitir un enlace de cliente con caducidad
Alcance:
bookings:createRequiere una clave live — emitida tras la aprobaciónGET/api/b2b/v1/dmc/programmes/{id}/linksEnlaces de cliente y quién aceptó
Alcance:
bookings:viewPOST/api/b2b/v1/dmc/programmes/{id}/links/{link}/revokeRevocar un enlace de cliente
Alcance:
bookings:createRequiere una clave live — emitida tras la aprobación
Tarifas y solicitudes de presupuesto
GET/api/b2b/v1/rates/catalogueCatálogo a sus tarifas (JSON, CSV o PDF)
Alcance:
rates:viewGET/api/b2b/v1/rates/sheetTarifario de servicios
Alcance:
rates:viewPOST/api/b2b/v1/quote-requestsEnviar una solicitud de presupuesto
Alcance:
bookings:createRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/wholesale-requestsSolicitar capacidad de vehículos
Alcance:
bookings:createRequiere una clave live — emitida tras la aprobación
Widget de reservas
GET/api/b2b/v1/widgetConfiguración y código del widget
Alcance:
tracking:viewPOST/api/b2b/v1/widgetModificar el widget
Alcance:
tracking:manageRequiere una clave live — emitida tras la aprobación
Usuarios
GET/api/b2b/v1/usersListar
Alcance:
users:viewPOST/api/b2b/v1/usersInvitar a una persona
Alcance:
users:manageRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/users/{id}/roleCambiar el rol de una persona
Alcance:
users:manageRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/users/{id}/deactivateRetirar el acceso de una persona
Alcance:
users:manageRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/users/{id}/reactivateRestablecer el acceso de una persona
Alcance:
users:manageRequiere una clave live — emitida tras la aprobación
Avisos
GET/api/b2b/v1/inboxAvisos sobre su cuenta
Alcance:
inbox:view
Extractos y facturas
GET/api/b2b/v1/statementsExtractos, saldo y facturas pendientes
Alcance:
statements:readGET/api/b2b/v1/statements/{period}Extracto de un mes (JSON o PDF)
Alcance:
statements:readGET/api/b2b/v1/invoices/{id}Una factura (JSON o PDF)
Alcance:
statements:read
Ajustes de la cuenta
GET/api/b2b/v1/settingsDatos de la cuenta, contactos y correo de facturación
Alcance:
settings:viewPOST/api/b2b/v1/settings/billing-emailDefinir el correo de facturación
Alcance:
settings:manageRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/settings/contactsAñadir o modificar un contacto
Alcance:
settings:manageRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/settings/contacts/{id}/removeEliminar un contacto
Alcance:
settings:manageRequiere una clave live — emitida tras la aprobaciónPOST/api/b2b/v1/settings/brandSu marca, o ninguna, en sus documentos
Alcance:
settings:manageRequiere una clave live — emitida tras la aprobación
curl -X POST 'https://nwp.ae/api/b2b/v1/transport/quote' \
-H 'Authorization: Bearer nwp_test_…' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: 7f1c2b0e-quote-1' \
-d '{"airport":"dxb","terminal":"t3","direction":"from_airport","place":"downtown","vehicle":"vclass","pickup_date":"2026-11-02","pickup_time":"14:30","passengers":3,"bags":3}'Autenticación
Cada llamada al sandbox requiere un token bearer. El handshake para desarrolladores emite uno: un token con formato JWT que empieza por nwp_sandbox_, dura 30 días y da acceso a datos de prueba y a nada más.
1Solicitar un token de sandbox
curl -X POST https://nwp.ae/api/b2b/orchestration \
-H 'Content-Type: application/json' \
-d '{
"action": "developer_handshake",
"platform_name": "Example Travel App",
"contact_email": "developers@example.com",
"use_case": "transfers"
}'{
"environment": "sandbox",
"status": "early-access",
"test_data": true,
"token_type": "Bearer",
"token": "nwp_sandbox_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImVudiI6InNhbmRib3gifQ…",
"expires_at": "2026-10-31T08:00:00.000Z",
"scopes": [
"sandbox:transfers.quote",
"sandbox:availability.read"
],
"endpoints": [
{
"method": "POST",
"url": "https://nwp.ae/api/b2b/sandbox/transfers"
},
{
"method": "GET",
"url": "https://nwp.ae/api/b2b/sandbox/availability"
},
{
"method": "GET",
"url": "https://nwp.ae/api/b2b/sandbox/status"
}
],
"production": {
"status": "not_open",
"request_access": "https://nwp.ae/register?type=institutional"
}
}2Llamar al sandbox con él
curl -X POST https://nwp.ae/api/b2b/sandbox/transfers \
-H 'Authorization: Bearer nwp_sandbox_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImVudiI6InNhbmRib3gifQ…' \
-H 'Content-Type: application/json' \
-d @transfer.jsonSolicitud de traslado
Envíe los campos siguientes al endpoint de traslados del sandbox. Los nombres de los campos pertenecen a la API y se mantienen en inglés en todos los idiomas.
pickup_locationObligatorio{ type: "airport" | "coordinates" | "hotel", … }Dónde se recoge al pasajero: una terminal de aeropuerto (DXB_T1, DXB_T2, DXB_T3, DWC, SHJ), coordenadas dentro de los EAU o una referencia de hotel.
dropoff_locationObligatorio{ type: "hotel" | "coordinates" | "airport", … }Adónde se lleva al pasajero: una referencia de hotel en forma de cadena (su propio código de hotel o el nombre del hotel), coordenadas o una terminal de aeropuerto.
flight_numberCondicionalstringEl vuelo de llegada, por ejemplo EK202. La recogida se ajusta al aterrizaje programado del vuelo.
pickup_atCondicionalstring (ISO 8601)ISO 8601 con desfase horario. Obligatorio cuando la recogida no es en un aeropuerto, o cuando una recogida en el aeropuerto no tiene vuelo.
buffer_minutes_overrideOpcionalintegerEspera gratuita tras el aterrizaje, en minutos, de 0 a 180. El valor por defecto es 60: la espera gratuita que el sitio de traslados del grupo ya ofrece en cada llegada.
vehicle_classObligatorioenumUno de estos valores: VIP_V_CLASS, EXECUTIVE_SEDAN o LUXURY_COACH.
passengersOpcionalintegerSe rechaza cuando supera las plazas de la categoría.
client_metadataOpcionalobjectDatos de marca blanca para el bono del viajero: agency_name, logo_url (solo https), voucher_branding y agency_reference.
| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
pickup_location | { type: "airport" | "coordinates" | "hotel", … } | Obligatorio | Dónde se recoge al pasajero: una terminal de aeropuerto (DXB_T1, DXB_T2, DXB_T3, DWC, SHJ), coordenadas dentro de los EAU o una referencia de hotel. |
dropoff_location | { type: "hotel" | "coordinates" | "airport", … } | Obligatorio | Adónde se lleva al pasajero: una referencia de hotel en forma de cadena (su propio código de hotel o el nombre del hotel), coordenadas o una terminal de aeropuerto. |
flight_number | string | Condicional | El vuelo de llegada, por ejemplo EK202. La recogida se ajusta al aterrizaje programado del vuelo. |
pickup_at | string (ISO 8601) | Condicional | ISO 8601 con desfase horario. Obligatorio cuando la recogida no es en un aeropuerto, o cuando una recogida en el aeropuerto no tiene vuelo. |
buffer_minutes_override | integer | Opcional | Espera gratuita tras el aterrizaje, en minutos, de 0 a 180. El valor por defecto es 60: la espera gratuita que el sitio de traslados del grupo ya ofrece en cada llegada. |
vehicle_class | enum | Obligatorio | Uno de estos valores: VIP_V_CLASS, EXECUTIVE_SEDAN o LUXURY_COACH. |
passengers | integer | Opcional | Se rechaza cuando supera las plazas de la categoría. |
client_metadata | object | Opcional | Datos de marca blanca para el bono del viajero: agency_name, logo_url (solo https), voucher_branding y agency_reference. |
{
"pickup_location": {
"type": "airport",
"terminal": "DXB_T3"
},
"dropoff_location": {
"type": "hotel",
"hotel_ref": "EXAMPLE-HOTEL-DOWNTOWN"
},
"flight_number": "EK202",
"buffer_minutes_override": 60,
"vehicle_class": "VIP_V_CLASS",
"passengers": 4,
"client_metadata": {
"agency_name": "Example Travel",
"logo_url": "https://example.com/logo.png",
"voucher_branding": {
"mode": "white_label",
"accent_hex": "#0A0A0A"
},
"agency_reference": "EX-10442"
}
}Categorías de vehículo
| Categoría | Vehículo | Plazas |
|---|---|---|
VIP_V_CLASS | Mercedes-Benz V-Class or similar | 7 |
EXECUTIVE_SEDAN | Lexus ES 350 or a similar executive saloon | 3 |
LUXURY_COACH | Toyota Coaster or King Long coach | 30 |
Cada vehículo se contrata con su chófer con licencia para el servicio; la categoría fija el tipo de vehículo y sus plazas.
Respuesta
Un presupuesto del sandbox devuelve la solicitud y añade cómo se programará la recogida y cómo se personalizará el bono. Nunca incluye un precio.
{
"environment": "sandbox",
"test_data": true,
"notice": "Sandbox response: test data only. Nothing is booked, no vehicle is held and no price is quoted. Production is not open yet.",
"quote_id": "SBX-WT5PCXWF",
"status": "sandbox_accepted",
"vehicle": {
"class": "VIP_V_CLASS",
"description": "Mercedes-Benz V-Class or similar",
"max_passengers": 7
},
"passengers": 4,
"pickup": {
"location": {
"type": "airport",
"terminal": "DXB_T3"
},
"timing": {
"mode": "flight_landing",
"flight_number": "EK202",
"driver_ready": "at the scheduled landing time",
"free_waiting_minutes": 60,
"live_arrival_tracking": "planned"
}
},
"dropoff": {
"location": {
"type": "hotel",
"hotel_ref": "EXAMPLE-HOTEL-DOWNTOWN"
}
},
"voucher": {
"branding": "white_label",
"agency_name": "Example Travel",
"logo_url": "https://example.com/logo.png",
"accent_hex": "#0A0A0A",
"footer_text": null,
"agency_reference": "EX-10442",
"shows_nwp_branding": false
},
"price": null,
"price_note": "Sandbox quotes carry no price. Net rates are issued to approved partners in the portal.",
"default_buffer_minutes": 60,
"created_at": "2026-10-01T08:00:00.000Z"
}{
"error": {
"code": "validation_failed",
"message": "One or more fields are invalid.",
"retryable": false,
"fields": [
"flight_number"
],
"issues": [
{
"path": "flight_number",
"message": "flight_number must be an airline flight number such as EK202."
}
]
},
"environment": "sandbox"
}Horarios de vuelo
Hoy la recogida se ajusta a la hora de aterrizaje indicada en la reserva, y el conductor espera sin coste durante el margen posterior. Si un vuelo cambia, avise a nuestro equipo de agencias y la recogida se ajusta en consecuencia.
Está previsto un seguimiento automático de llegadas en tiempo real mediante FlightAware o AeroDataBox. Ninguno está conectado todavía, y el sandbox indica live_arrival_tracking como previsto (planned).
Disponibilidad firmada
El handshake devuelve una URL de disponibilidad firmada. La firma cubre la fecha, la categoría de vehículo y la caducidad; si se cambia cualquiera de ellas, la llamada se rechaza. Los estados son ejemplos para desarrollar.
curl 'https://nwp.ae/api/b2b/sandbox/availability?date=2026-10-15&vehicle_class=VIP_V_CLASS&expires=1760572800&sig=…'{
"environment": "sandbox",
"test_data": true,
"notice": "Sandbox response: test data only. Nothing is booked, no vehicle is held and no price is quoted. Production is not open yet.",
"date": "2026-10-15",
"vehicle_class": "VIP_V_CLASS",
"vehicle": {
"description": "Mercedes-Benz V-Class or similar",
"max_passengers": 7
},
"sample_status": "on_request",
"note": "A sample status for building against. Real availability is confirmed by the trade desk until the API opens."
}Acciones de cuenta
Haga un POST al endpoint de orquestación con una acción. Una acción que pide a una persona que haga algo se almacena y se pasa a nuestro equipo de agencias antes de que la respuesta lo indique.
| Acción | Qué hace |
|---|---|
credit_line_application | Condiciones Net-15, 30, 45 o 60 para una empresa registrada en los EAU. Se requieren el número de licencia comercial y el TRN (15 dígitos, empezando por 100). Una persona revisa cada solicitud, y las reservas son de prepago hasta que se aprueba una línea de crédito. |
wallet_topup | Un prepago en su cuenta. Las recargas con tarjeta aún no están disponibles, así que nuestro equipo de agencias le factura por transferencia bancaria, y la respuesta lo indica. |
account_payload | La matriz de divisas de su cuenta. El AED es la divisa base y la única en la que se cobra o se gana cualquier importe; las demás divisas son conversiones de visualización al tipo diario del sitio, de modo que un margen nunca varía con la conversión. |
tracking_link | Una URL de socio determinista y un código QR para las categorías de alquileres vacacionales y afiliados, con una indicación clara de dónde se acredita hoy. |
developer_handshake | Un token de sandbox, los endpoints del sandbox y una URL de disponibilidad firmada. |
{
"action": "credit_line_application",
"company_legal_name": "Example Travel L.L.C.",
"trade_licence_number": "1234567",
"licence_authority": "Department of Economy and Tourism, Dubai",
"trn": "100000000000003",
"contact_name": "Finance Desk",
"contact_email": "finance@example.com",
"requested_terms": "NET_30",
"requested_limit_aed": 50000
}{
"action": "wallet_topup",
"company_name": "Example Travel L.L.C.",
"contact_email": "finance@example.com",
"amount_aed": 10000,
"purchase_order": "PO-2291"
}{
"action": "account_payload",
"company_name": "Example Travel L.L.C.",
"tier": "Tier_4_Regional_DMCs",
"display_currencies": [
"USD",
"EUR"
],
"lines": [
{
"label": "Your own city-tour package",
"net_aed": 400,
"sell_aed": 560
}
]
}{
"action": "tracking_link",
"partner_code": "HHO-EXAMPLE",
"tier": "Tier_1_Holiday_Homes",
"property_id": "marina-2104",
"destination": "dubaitransfers.ae"
}Errores
Todos los errores tienen la misma estructura: error.code, error.message y error.retryable, con fields e issues si falla la validación.
| Estado | Código | Significado |
|---|---|---|
| 400 | invalid_json | El cuerpo no es un JSON válido. |
| 401 | unauthenticated | Sin token de sandbox, o con uno mal formado, caducado o mal firmado. |
| 404 | not_found | El endpoint no existe en este host. |
| 405 | method_not_allowed | El endpoint admite otro método. |
| 413 | payload_too_large | El cuerpo supera los 16 KB. |
| 422 | validation_failed | Falta un campo o está mal formado: consulte fields e issues. |
| 429 | rate_limited | Demasiadas solicitudes desde esta dirección: vuelva a intentarlo tras retry_after_seconds. |
| 500 | internal | Algo falló por nuestra parte: indique el identificador de la solicitud. |
| 502 | upstream_unavailable | Un proveedor de pagos no respondió. |
| 503 | not_configured | No se pudo almacenar la solicitud: escriba a nuestro equipo de agencias. |
Límites de uso
Las acciones de cuenta tienen un límite por dirección y por hora: credit_line_application: 5, wallet_topup: 10, account_payload: 60, tracking_link: 60 y developer_handshake: 10. Las llamadas al sandbox tienen un límite de 120 por hora y dirección.
Widget de reservas
El widget de reservas está abierto a socios aprobados en acceso anticipado: una etiqueta script pone los tours y traslados de nwp.ae en su web al precio público, en doce idiomas, con su nombre y su código de socio en cada reserva. Se configura a través de la API: los endpoints del widget de reservas leen y cambian su configuración y devuelven el fragmento de código para pegar.