Sviluppatori
Documentazione API B2B
L'API B2B dietro nwp.ae: quotate e prenotate per i vostri clienti a tariffa netta, emettete voucher, gestite un desk d'hotel, trasporto aziendale e programmi DMC, con tariffe, estratti conto e fatture a portata di mano. Accesso anticipato: le chiavi sandbox rispondono con dati di test contrassegnati come tali e le chiavi live vengono rilasciate dopo l'approvazione.
StatoAccesso anticipato · solo sandbox
La sandbox verifica richieste reali rispetto allo schema reale e risponde con dati di test. Non viene prenotato nulla, non viene bloccato alcun veicolo e non viene restituito alcun prezzo. La sandbox non prevede alcun impegno sul livello di servizio, e le chiavi di produzione vengono rilasciate ai partner approvati quando l'API sarà aperta.
Richiedete l'accesso anticipatoPanoramica
JSON su HTTPS. Inviate Content-Type: application/json. Ogni risposta è in JSON e contiene un header x-request-id da comunicare al desk trade; le risposte della sandbox contengono anche x-nwp-environment: sandbox.
| URL di base | — |
|---|---|
| Sandbox | https://nwp.ae/api/b2b/sandbox |
| Produzione | https://nwp.ae/api/b2b/v1Non ancora aperta · Richiede una chiave live — rilasciata dopo l'approvazione |
API B2B v1
Un'unica API per tutto ciò che fa un account: trasporto terrestre e tour e attività con prezzi secondo le vostre condizioni commerciali (tariffa netta, commissione o tariffario), prenotazioni per i vostri clienti, voucher e cartelli con il nome, il desk dell'hotel, trasporto aziendale, programmi DMC, il widget di prenotazione, utenti, avvisi, estratti conto e fatture. Le chiavi sandbox (nwp_test_…) sono aperte a chi fa richiesta: rispondono su ogni endpoint con dati di prova contrassegnati sandbox: true e non prenotano né modificano mai il vostro account. Le chiavi live (nwp_live_…) vengono rilasciate dopo l'approvazione e funzionano una volta che NWP ha attivato l'accesso live per il vostro account. Ogni POST accetta un Idempotency-Key, ogni risposta porta x-request-id e ogni chiave ha il proprio limite al minuto.
Il documento OpenAPI 3.1: /api/b2b/v1/openapi.json
Trasporto terrestre
POST/api/b2b/v1/transport/quotePrezzo secondo le vostre condizioni
Ambito:
transport:readPOST/api/b2b/v1/transport/bookingsPrenotare
Ambito:
transport:writeRichiede una chiave live — rilasciata dopo l'approvazioneGET/api/b2b/v1/transport/bookings/{id}Stato della prenotazione e condizioni di cancellazione
Ambito:
transport:readPOST/api/b2b/v1/transport/bookings/{id}/cancelCancellare secondo la policy
Ambito:
transport:writeRichiede una chiave live — rilasciata dopo l'approvazioneGET/api/b2b/v1/transport/bookings/{id}/voucherVoucher con il vostro marchio (HTML o PDF)
Ambito:
transport:read
Tour e attività
GET/api/b2b/v1/activities/productsProdotti in vendita, a persona o a veicolo
Ambito:
activities:readGET/api/b2b/v1/activities/products/{id}/availabilityDisponibilità per giorno
Ambito:
activities:readPOST/api/b2b/v1/activities/quotePrezzo secondo le vostre condizioni
Ambito:
activities:readPOST/api/b2b/v1/activities/bookingsPrenotare
Ambito:
activities:writeRichiede una chiave live — rilasciata dopo l'approvazioneGET/api/b2b/v1/activities/bookings/{id}Stato della prenotazione e condizioni di cancellazione
Ambito:
activities:readPOST/api/b2b/v1/activities/bookings/{id}/cancelCancellare secondo la policy
Ambito:
activities:writeRichiede una chiave live — rilasciata dopo l'approvazioneGET/api/b2b/v1/activities/bookings/{id}/voucherVoucher con il vostro marchio (HTML o PDF)
Ambito:
activities:read
Crociere
GET/api/b2b/v1/cruise/sailingsPartenze
Ambito:
cruise:readNon ancora disponibile: risponde 501 finché non è collegato un fornitore di crocierePOST/api/b2b/v1/cruise/quotePrezzo secondo le vostre condizioni
Ambito:
cruise:readNon ancora disponibile: risponde 501 finché non è collegato un fornitore di crocierePOST/api/b2b/v1/cruise/bookingsPrenotare
Ambito:
cruise:writeNon ancora disponibile: risponde 501 finché non è collegato un fornitore di crociereGET/api/b2b/v1/cruise/bookings/{id}Stato della prenotazione e condizioni di cancellazione
Ambito:
cruise:readNon ancora disponibile: risponde 501 finché non è collegato un fornitore di crocierePOST/api/b2b/v1/cruise/bookings/{id}/cancelCancellare secondo la policy
Ambito:
cruise:writeNon ancora disponibile: risponde 501 finché non è collegato un fornitore di crociere
Guide di benvenuto
GET/api/b2b/v1/guides/propertiesLe tue strutture
Ambito:
guides:readPOST/api/b2b/v1/guides/propertiesAggiungi una struttura
Ambito:
guides:writeGET/api/b2b/v1/guides/properties/{id}Guida, link e file di una struttura
Ambito:
guides:readPATCH/api/b2b/v1/guides/properties/{id}Modifica una struttura
Ambito:
guides:writePOST/api/b2b/v1/guides/properties/{id}/statusSospendi o riattiva una guida
Ambito:
guides:writePOST/api/b2b/v1/guides/properties/{id}/linkSostituisci il link per gli ospiti
Ambito:
guides:writeGET/api/b2b/v1/guides/properties/{id}/wifiRileggi il Wi-Fi
Ambito:
guides_wifi:readPOST/api/b2b/v1/guides/properties/{id}/wifiImposta il Wi-Fi
Ambito:
guides_wifi:writeGET/api/b2b/v1/guides/properties/{id}/qrCodice QR (PNG o SVG)
Ambito:
guides:readGET/api/b2b/v1/guides/properties/{id}/cardScheda da stampare (PDF o HTML)
Ambito:
guides:readGET/api/b2b/v1/guides/statsScansioni, visite, prenotazioni e la tua quota
Ambito:
guides:read
Account
GET/api/b2b/v1/whoamiVerificare una chiave
Ambito:
account:readGET/api/b2b/v1/openapi.jsonQuesta API in OpenAPI 3.1
Affiliati
GET/api/b2b/v1/affiliate/statsStatistiche per un periodo: clic, prenotazioni, conversione, guadagni
Ambito:
affiliate:readGET/api/b2b/v1/affiliate/linksI vostri link di tracciamento, con codici QR
Ambito:
affiliate:readPOST/api/b2b/v1/affiliate/linksCreare un link di tracciamento con UTM
Ambito:
affiliate:writeRichiede una chiave live — rilasciata dopo l'approvazioneGET/api/b2b/v1/affiliate/links/{code}/qrCodice QR di un link (SVG o PNG)
Ambito:
affiliate:readGET/api/b2b/v1/affiliate/performanceClic, prenotazioni e guadagni per link
Ambito:
affiliate:readGET/api/b2b/v1/affiliate/payoutsSaldo da pagare e richieste di pagamento
Ambito:
affiliate:readPOST/api/b2b/v1/affiliate/payoutsRichiedere un pagamento, inviato con bonifico bancario
Ambito:
affiliate:writeRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/affiliate/payouts/{reference}/cancelRitirare una richiesta di pagamento
Ambito:
affiliate:writeRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/affiliate/bank-detailsSalvare le coordinate bancarie (sola scrittura)
Ambito:
affiliate:writeRichiede una chiave live — rilasciata dopo l'approvazioneGET/api/b2b/v1/affiliate/widgetImpostazioni e snippet del widget
Ambito:
affiliate:readPOST/api/b2b/v1/affiliate/widgetConfigurare il widget di prenotazione
Ambito:
affiliate:writeRichiede una chiave live — rilasciata dopo l'approvazione
Prenotazioni per i vostri clienti
POST/api/b2b/v1/bookings/quotePrezzo secondo le vostre condizioni
Ambito:
bookings:createPOST/api/b2b/v1/bookingsPrenotare
Ambito:
bookings:createRichiede una chiave live — rilasciata dopo l'approvazioneGET/api/b2b/v1/bookingsElencare
Ambito:
bookings:viewGET/api/b2b/v1/bookings/creditedPrenotazioni accreditate al vostro account
Ambito:
bookings:viewGET/api/b2b/v1/bookings/{ref}Dettagli
Ambito:
bookings:viewPOST/api/b2b/v1/bookings/{ref}/cancelCancellare secondo la policy
Ambito:
bookings:manageRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/bookings/{ref}/amendmentsChiedere una modifica al desk trade
Ambito:
bookings:manageRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/bookings/{ref}/brandIl vostro marchio, o nessuno, sui suoi documenti
Ambito:
bookings:manageRichiede una chiave live — rilasciata dopo l'approvazioneGET/api/b2b/v1/bookings/{ref}/voucherVoucher con il vostro marchio (HTML o PDF)
Ambito:
bookings:viewGET/api/b2b/v1/bookings/{ref}/name-boardCartello con il nome per l'autista (HTML)
Ambito:
bookings:viewGET/api/b2b/v1/requestsRichieste di modifica e di servizio, con le risposte del desk
Ambito:
bookings:viewPOST/api/b2b/v1/requests/{id}/withdrawRitirare una richiesta aperta
Ambito:
bookings:manageRichiede una chiave live — rilasciata dopo l'approvazione
Desk dell'hotel
POST/api/b2b/v1/desk/salesVendita rapida al desk
Ambito:
bookings:createRichiede una chiave live — rilasciata dopo l'approvazioneGET/api/b2b/v1/desk/days/{date}Le vendite di un giorno, o il relativo rendiconto in CSV o PDF
Ambito:
statements:readPOST/api/b2b/v1/desk/days/{date}/closeChiudere la giornata e bloccarne il rendiconto
Ambito:
statements:readRichiede una chiave live — rilasciata dopo l'approvazione
Trasporto aziendale
GET/api/b2b/v1/corporate/cost-centresElencare
Ambito:
bookings:viewPOST/api/b2b/v1/corporate/cost-centresCreare o modificare
Ambito:
settings:manageRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/corporate/cost-centres/{id}/approversCreare o modificare
Ambito:
settings:manageRichiede una chiave live — rilasciata dopo l'approvazioneGET/api/b2b/v1/corporate/requestsElencare
Ambito:
bookings:viewPOST/api/b2b/v1/corporate/requestsPrenotare
Ambito:
bookings:createRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/corporate/requests/{id}/decisionApprovare o rifiutare
Ambito:
bookings:createRichiede una chiave live — rilasciata dopo l'approvazioneGET/api/b2b/v1/corporate/shuttlesElencare
Ambito:
bookings:viewPOST/api/b2b/v1/corporate/shuttlesCreare o modificare
Ambito:
bookings:createRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/corporate/shuttles/{id}/statusCambiarne lo stato
Ambito:
bookings:createRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/corporate/shuttles/{id}/scheduleProgrammare le corse di un mese
Ambito:
bookings:createRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/corporate/shuttles/{id}/repriceApplicare una tariffa appena concordata
Ambito:
bookings:createRichiede una chiave live — rilasciata dopo l'approvazioneGET/api/b2b/v1/corporate/usageUtilizzo per centro di costo (JSON o CSV)
Ambito:
statements:read
Programmi DMC
GET/api/b2b/v1/dmc/programmesElencare
Ambito:
bookings:viewPOST/api/b2b/v1/dmc/programmesCreare o modificare
Ambito:
bookings:createRichiede una chiave live — rilasciata dopo l'approvazioneGET/api/b2b/v1/dmc/programmes/{id}Dettagli
Ambito:
bookings:viewPOST/api/b2b/v1/dmc/programmes/{id}/versionsSalvare una versione con prezzi
Ambito:
bookings:createRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/dmc/programmes/{id}/statusCambiarne lo stato
Ambito:
bookings:createRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/dmc/programmes/{id}/brandIl vostro marchio, o nessuno, sui suoi documenti
Ambito:
bookings:createRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/dmc/programmes/{id}/acceptAccettare una versione e prenotarla
Ambito:
bookings:createRichiede una chiave live — rilasciata dopo l'approvazioneGET/api/b2b/v1/dmc/programmes/{id}/proposalProposta per il cliente (HTML)
Ambito:
bookings:viewPOST/api/b2b/v1/dmc/programmes/{id}/linksEmettere un link cliente a scadenza
Ambito:
bookings:createRichiede una chiave live — rilasciata dopo l'approvazioneGET/api/b2b/v1/dmc/programmes/{id}/linksLink cliente e chi ha accettato
Ambito:
bookings:viewPOST/api/b2b/v1/dmc/programmes/{id}/links/{link}/revokeRevocare un link cliente
Ambito:
bookings:createRichiede una chiave live — rilasciata dopo l'approvazione
Tariffe e richieste di preventivo
GET/api/b2b/v1/rates/catalogueCatalogo alle vostre tariffe (JSON, CSV o PDF)
Ambito:
rates:viewGET/api/b2b/v1/rates/sheetListino dei servizi
Ambito:
rates:viewPOST/api/b2b/v1/quote-requestsInviare una richiesta di preventivo
Ambito:
bookings:createRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/wholesale-requestsRichiedere capacità di veicoli
Ambito:
bookings:createRichiede una chiave live — rilasciata dopo l'approvazione
Widget di prenotazione
GET/api/b2b/v1/widgetImpostazioni e snippet del widget
Ambito:
tracking:viewPOST/api/b2b/v1/widgetModificare il widget
Ambito:
tracking:manageRichiede una chiave live — rilasciata dopo l'approvazione
Utenti
GET/api/b2b/v1/usersElencare
Ambito:
users:viewPOST/api/b2b/v1/usersInvitare una persona
Ambito:
users:manageRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/users/{id}/roleCambiare il ruolo di una persona
Ambito:
users:manageRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/users/{id}/deactivateRevocare l'accesso di una persona
Ambito:
users:manageRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/users/{id}/reactivateRipristinare l'accesso di una persona
Ambito:
users:manageRichiede una chiave live — rilasciata dopo l'approvazione
Avvisi
GET/api/b2b/v1/inboxAvvisi sul vostro account
Ambito:
inbox:view
Estratti conto e fatture
GET/api/b2b/v1/statementsEstratti conto, saldo e fatture aperte
Ambito:
statements:readGET/api/b2b/v1/statements/{period}Estratto conto di un mese (JSON o PDF)
Ambito:
statements:readGET/api/b2b/v1/invoices/{id}Una fattura (JSON o PDF)
Ambito:
statements:read
Impostazioni dell'account
GET/api/b2b/v1/settingsDati dell'account, contatti ed email di fatturazione
Ambito:
settings:viewPOST/api/b2b/v1/settings/billing-emailImpostare l'email di fatturazione
Ambito:
settings:manageRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/settings/contactsAggiungere o modificare un contatto
Ambito:
settings:manageRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/settings/contacts/{id}/removeRimuovere un contatto
Ambito:
settings:manageRichiede una chiave live — rilasciata dopo l'approvazionePOST/api/b2b/v1/settings/brandIl vostro marchio, o nessuno, sui suoi documenti
Ambito:
settings:manageRichiede una chiave live — rilasciata dopo l'approvazione
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}'Autenticazione
Ogni chiamata alla sandbox richiede un token bearer. L'handshake per sviluppatori ne rilascia uno: un token in formato JWT che inizia con nwp_sandbox_, dura 30 giorni e dà accesso ai dati di test e a nient'altro.
1Richiedete un token 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"
}
}2Chiamate la sandbox con il token
curl -X POST https://nwp.ae/api/b2b/sandbox/transfers \
-H 'Authorization: Bearer nwp_sandbox_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImVudiI6InNhbmRib3gifQ…' \
-H 'Content-Type: application/json' \
-d @transfer.jsonRichiesta di transfer
Inviate i campi seguenti all'endpoint transfer della sandbox. I nomi dei campi appartengono all'API e restano in inglese in ogni lingua.
pickup_locationObbligatorio{ type: "airport" | "coordinates" | "hotel", … }Dove viene prelevato il passeggero: un terminal aeroportuale (DXB_T1, DXB_T2, DXB_T3, DWC, SHJ), coordinate all'interno degli Emirati o un riferimento alberghiero.
dropoff_locationObbligatorio{ type: "hotel" | "coordinates" | "airport", … }Dove viene accompagnato il passeggero: un riferimento alberghiero come stringa (il vostro codice hotel o il nome dell'hotel), coordinate o un terminal aeroportuale.
flight_numberCondizionalestringIl volo in arrivo, ad esempio EK202. Il prelievo è sincronizzato con l'atterraggio previsto del volo.
pickup_atCondizionalestring (ISO 8601)ISO 8601 con offset. Obbligatorio quando il prelievo non avviene in aeroporto, o quando un prelievo in aeroporto non ha un volo.
buffer_minutes_overrideFacoltativointegerAttesa gratuita dopo l'atterraggio, in minuti, da 0 a 180. Il valore predefinito è 60: l'attesa gratuita che il sito transfer del gruppo già concede a ogni arrivo.
vehicle_classObbligatorioenumUno tra VIP_V_CLASS, EXECUTIVE_SEDAN o LUXURY_COACH.
passengersFacoltativointegerRifiutato quando supera i posti della classe.
client_metadataFacoltativoobjectDati white-label per il voucher del viaggiatore: agency_name, logo_url (solo https), voucher_branding e agency_reference.
| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
pickup_location | { type: "airport" | "coordinates" | "hotel", … } | Obbligatorio | Dove viene prelevato il passeggero: un terminal aeroportuale (DXB_T1, DXB_T2, DXB_T3, DWC, SHJ), coordinate all'interno degli Emirati o un riferimento alberghiero. |
dropoff_location | { type: "hotel" | "coordinates" | "airport", … } | Obbligatorio | Dove viene accompagnato il passeggero: un riferimento alberghiero come stringa (il vostro codice hotel o il nome dell'hotel), coordinate o un terminal aeroportuale. |
flight_number | string | Condizionale | Il volo in arrivo, ad esempio EK202. Il prelievo è sincronizzato con l'atterraggio previsto del volo. |
pickup_at | string (ISO 8601) | Condizionale | ISO 8601 con offset. Obbligatorio quando il prelievo non avviene in aeroporto, o quando un prelievo in aeroporto non ha un volo. |
buffer_minutes_override | integer | Facoltativo | Attesa gratuita dopo l'atterraggio, in minuti, da 0 a 180. Il valore predefinito è 60: l'attesa gratuita che il sito transfer del gruppo già concede a ogni arrivo. |
vehicle_class | enum | Obbligatorio | Uno tra VIP_V_CLASS, EXECUTIVE_SEDAN o LUXURY_COACH. |
passengers | integer | Facoltativo | Rifiutato quando supera i posti della classe. |
client_metadata | object | Facoltativo | Dati white-label per il voucher del viaggiatore: agency_name, logo_url (solo https), voucher_branding e 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"
}
}Classi di veicolo
| Classe | Veicolo | Posti |
|---|---|---|
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 |
Ogni veicolo viene noleggiato con il suo autista autorizzato per il servizio; la classe determina il tipo di veicolo e i posti.
Risposta
Un preventivo sandbox restituisce la richiesta e aggiunge come verrà sincronizzato il prelievo e come verrà personalizzato il voucher. Non contiene mai un prezzo.
{
"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"
}Orari dei voli
Oggi il prelievo è sincronizzato con l'orario di atterraggio indicato nella prenotazione, e l'autista attende gratuitamente per il margine previsto dopo l'atterraggio. Se un volo cambia, avvisate il desk trade e il prelievo viene spostato di conseguenza.
È previsto un tracciamento automatico degli arrivi in tempo reale tramite FlightAware o AeroDataBox. Nessuno dei due è ancora collegato, e la sandbox riporta live_arrival_tracking come previsto (planned).
Disponibilità firmata
L'handshake restituisce un URL di disponibilità firmato. La firma copre la data, la classe del veicolo e la scadenza; se ne cambiate una, la chiamata viene rifiutata. Gli stati sono esempi su cui sviluppare.
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."
}Azioni di account
Inviate un POST all'endpoint di orchestrazione con un'azione. Un'azione che chiede a una persona di fare qualcosa viene salvata e passata al desk trade prima che la risposta lo indichi.
| Azione | Cosa fa |
|---|---|
credit_line_application | Termini Net-15, 30, 45 o 60 per una società registrata negli Emirati. Sono richiesti il numero della licenza commerciale e il TRN (15 cifre, che inizia con 100). Ogni richiesta viene esaminata da una persona, e le prenotazioni sono prepagate finché non viene approvata una linea di credito. |
wallet_topup | Un prepagamento sul vostro account. Le ricariche con carta non sono ancora disponibili, quindi il desk trade vi fattura con bonifico bancario, e la risposta lo indica. |
account_payload | La matrice valutaria del vostro account. L'AED è la valuta base e l'unica in cui si addebita o si guadagna qualcosa; le altre valute sono conversioni di visualizzazione al cambio giornaliero del sito, così un margine non cambia mai con la conversione. |
tracking_link | Un URL partner deterministico e un codice QR per le categorie case vacanza e affiliati, con un'indicazione chiara di dove viene accreditato oggi. |
developer_handshake | Un token sandbox, gli endpoint della sandbox e un URL di disponibilità firmato. |
{
"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"
}Errori
Ogni errore ha la stessa struttura: error.code, error.message ed error.retryable, con fields e issues in caso di errore di validazione.
| Stato | Codice | Significato |
|---|---|---|
| 400 | invalid_json | Il body non è un JSON valido. |
| 401 | unauthenticated | Nessun token sandbox, oppure un token malformato, scaduto o firmato in modo errato. |
| 404 | not_found | L'endpoint non esiste su questo host. |
| 405 | method_not_allowed | L'endpoint accetta un altro metodo. |
| 413 | payload_too_large | Il body supera 16 KB. |
| 422 | validation_failed | Un campo manca o è malformato: vedete fields e issues. |
| 429 | rate_limited | Troppe richieste da questo indirizzo: riprovate dopo retry_after_seconds. |
| 500 | internal | Qualcosa non ha funzionato da parte nostra: indicate l'id della richiesta. |
| 502 | upstream_unavailable | Un fornitore di pagamenti non ha risposto. |
| 503 | not_configured | Non è stato possibile salvare la richiesta: scrivete al desk trade. |
Limiti di frequenza
Le azioni di account sono limitate per indirizzo, per ora: credit_line_application: 5, wallet_topup: 10, account_payload: 60, tracking_link: 60 e developer_handshake: 10. Le chiamate alla sandbox sono limitate a 120 all'ora per indirizzo.
Widget di prenotazione
Il widget di prenotazione è aperto ai partner approvati in accesso anticipato: un tag script porta tour e transfer di nwp.ae sul vostro sito al prezzo pubblico, in dodici lingue, con il vostro nome e il vostro codice partner su ogni prenotazione. Si configura tramite l'API: gli endpoint del widget di prenotazione leggono e modificano le impostazioni e restituiscono lo snippet da incollare.