Entwickler
B2B-API-Dokumentation
Die B2B-API hinter nwp.ae: Preise abrufen und für Ihre Kunden zu Nettopreisen buchen, Voucher ausstellen, einen Hotelschalter, Firmentransport und DMC-Programme betreiben, dazu Ihre Preise, Abrechnungen und Rechnungen. Early Access: Sandbox-Schlüssel antworten mit gekennzeichneten Testdaten, Live-Schlüssel werden nach der Freigabe ausgestellt.
StatusEarly Access · nur Sandbox
Die Sandbox prüft echte Anfragen gegen das echte Schema und antwortet mit Testdaten. Es wird nichts gebucht, kein Fahrzeug reserviert und kein Preis zurückgegeben. Für die Sandbox gibt es keine Service-Level-Zusage, und Produktionsschlüssel erhalten freigeschaltete Partner, wenn die API öffnet.
Early Access beantragenÜberblick
JSON über HTTPS. Senden Sie Content-Type: application/json. Jede Antwort ist JSON und enthält einen Header x-request-id, den Sie unserem Partner-Team nennen; Sandbox-Antworten enthalten zusätzlich x-nwp-environment: sandbox.
| Basis-URL | — |
|---|---|
| Sandbox | https://nwp.ae/api/b2b/sandbox |
| Produktion | https://nwp.ae/api/b2b/v1Noch nicht geöffnet · Benötigt einen Live-Schlüssel — ausgestellt nach Freigabe |
B2B-API v1
Eine API für alles, was ein Konto tut: Bodentransport sowie Touren und Aktivitäten, bepreist nach Ihren Konditionen (Nettopreis, Provision oder Tarif), Buchungen für Ihre Kunden, Voucher und Namensschilder, der Hotelschalter, Firmentransport, DMC-Programme, das Buchungs-Widget, Nutzer, Hinweise, Abrechnungen und Rechnungen. Sandbox-Schlüssel (nwp_test_…) stehen Antragstellern offen: Sie beantworten jeden Endpunkt mit Testdaten, markiert mit sandbox: true, und buchen nie und ändern Ihr Konto nie. Live-Schlüssel (nwp_live_…) werden nach der Freigabe ausgestellt und funktionieren, sobald NWP den Live-Zugang für Ihr Konto eingeschaltet hat. Jeder POST akzeptiert einen Idempotency-Key, jede Antwort trägt x-request-id, und jeder Schlüssel hat sein eigenes Minutenlimit.
Das OpenAPI-3.1-Dokument: /api/b2b/v1/openapi.json
Bodentransport
POST/api/b2b/v1/transport/quotePreis nach Ihren Konditionen
Scope:
transport:readPOST/api/b2b/v1/transport/bookingsBuchen
Scope:
transport:writeBenötigt einen Live-Schlüssel — ausgestellt nach FreigabeGET/api/b2b/v1/transport/bookings/{id}Buchungsstatus und Stornobedingungen
Scope:
transport:readPOST/api/b2b/v1/transport/bookings/{id}/cancelStornieren nach Richtlinie
Scope:
transport:writeBenötigt einen Live-Schlüssel — ausgestellt nach FreigabeGET/api/b2b/v1/transport/bookings/{id}/voucherVoucher in Ihrer Marke (HTML oder PDF)
Scope:
transport:read
Touren & Aktivitäten
GET/api/b2b/v1/activities/productsAngebotene Produkte, pro Person oder pro Fahrzeug
Scope:
activities:readGET/api/b2b/v1/activities/products/{id}/availabilityVerfügbarkeit pro Tag
Scope:
activities:readPOST/api/b2b/v1/activities/quotePreis nach Ihren Konditionen
Scope:
activities:readPOST/api/b2b/v1/activities/bookingsBuchen
Scope:
activities:writeBenötigt einen Live-Schlüssel — ausgestellt nach FreigabeGET/api/b2b/v1/activities/bookings/{id}Buchungsstatus und Stornobedingungen
Scope:
activities:readPOST/api/b2b/v1/activities/bookings/{id}/cancelStornieren nach Richtlinie
Scope:
activities:writeBenötigt einen Live-Schlüssel — ausgestellt nach FreigabeGET/api/b2b/v1/activities/bookings/{id}/voucherVoucher in Ihrer Marke (HTML oder PDF)
Scope:
activities:read
Kreuzfahrt
GET/api/b2b/v1/cruise/sailingsAbfahrten
Scope:
cruise:readNoch nicht verfügbar: antwortet mit 501, bis ein Kreuzfahrtanbieter angebunden istPOST/api/b2b/v1/cruise/quotePreis nach Ihren Konditionen
Scope:
cruise:readNoch nicht verfügbar: antwortet mit 501, bis ein Kreuzfahrtanbieter angebunden istPOST/api/b2b/v1/cruise/bookingsBuchen
Scope:
cruise:writeNoch nicht verfügbar: antwortet mit 501, bis ein Kreuzfahrtanbieter angebunden istGET/api/b2b/v1/cruise/bookings/{id}Buchungsstatus und Stornobedingungen
Scope:
cruise:readNoch nicht verfügbar: antwortet mit 501, bis ein Kreuzfahrtanbieter angebunden istPOST/api/b2b/v1/cruise/bookings/{id}/cancelStornieren nach Richtlinie
Scope:
cruise:writeNoch nicht verfügbar: antwortet mit 501, bis ein Kreuzfahrtanbieter angebunden ist
Gästemappen
GET/api/b2b/v1/guides/propertiesIhre Unterkünfte
Scope:
guides:readPOST/api/b2b/v1/guides/propertiesUnterkunft hinzufügen
Scope:
guides:writeGET/api/b2b/v1/guides/properties/{id}Gästemappe, Link und Dateien einer Unterkunft
Scope:
guides:readPATCH/api/b2b/v1/guides/properties/{id}Unterkunft bearbeiten
Scope:
guides:writePOST/api/b2b/v1/guides/properties/{id}/statusGästemappe pausieren oder fortsetzen
Scope:
guides:writePOST/api/b2b/v1/guides/properties/{id}/linkGästelink ersetzen
Scope:
guides:writeGET/api/b2b/v1/guides/properties/{id}/wifiWLAN-Daten auslesen
Scope:
guides_wifi:readPOST/api/b2b/v1/guides/properties/{id}/wifiWLAN festlegen
Scope:
guides_wifi:writeGET/api/b2b/v1/guides/properties/{id}/qrQR-Code (PNG oder SVG)
Scope:
guides:readGET/api/b2b/v1/guides/properties/{id}/cardDruckkarte (PDF oder HTML)
Scope:
guides:readGET/api/b2b/v1/guides/statsScans, Aufrufe, Buchungen und Ihr Anteil
Scope:
guides:read
Konto
GET/api/b2b/v1/whoamiSchlüssel prüfen
Scope:
account:readGET/api/b2b/v1/openapi.jsonDiese API als OpenAPI 3.1
Affiliate-Partner
GET/api/b2b/v1/affiliate/statsStatistiken für einen Zeitraum: Klicks, Buchungen, Konversion, Einnahmen
Scope:
affiliate:readGET/api/b2b/v1/affiliate/linksIhre Tracking-Links mit QR-Codes
Scope:
affiliate:readPOST/api/b2b/v1/affiliate/linksTracking-Link mit UTM erstellen
Scope:
affiliate:writeBenötigt einen Live-Schlüssel — ausgestellt nach FreigabeGET/api/b2b/v1/affiliate/links/{code}/qrQR-Code eines Links (SVG oder PNG)
Scope:
affiliate:readGET/api/b2b/v1/affiliate/performanceKlicks, Buchungen und Einnahmen pro Link
Scope:
affiliate:readGET/api/b2b/v1/affiliate/payoutsAuszahlungsguthaben und Auszahlungsanfragen
Scope:
affiliate:readPOST/api/b2b/v1/affiliate/payoutsAuszahlung anfordern, per Banküberweisung
Scope:
affiliate:writeBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/affiliate/payouts/{reference}/cancelAuszahlungsanfrage zurückziehen
Scope:
affiliate:writeBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/affiliate/bank-detailsBankverbindung speichern (nur schreibbar)
Scope:
affiliate:writeBenötigt einen Live-Schlüssel — ausgestellt nach FreigabeGET/api/b2b/v1/affiliate/widgetWidget-Einstellungen und Snippet
Scope:
affiliate:readPOST/api/b2b/v1/affiliate/widgetBuchungs-Widget einrichten
Scope:
affiliate:writeBenötigt einen Live-Schlüssel — ausgestellt nach Freigabe
Buchungen für Ihre Kunden
POST/api/b2b/v1/bookings/quotePreis nach Ihren Konditionen
Scope:
bookings:createPOST/api/b2b/v1/bookingsBuchen
Scope:
bookings:createBenötigt einen Live-Schlüssel — ausgestellt nach FreigabeGET/api/b2b/v1/bookingsAuflisten
Scope:
bookings:viewGET/api/b2b/v1/bookings/creditedIhrem Konto gutgeschriebene Buchungen
Scope:
bookings:viewGET/api/b2b/v1/bookings/{ref}Details
Scope:
bookings:viewPOST/api/b2b/v1/bookings/{ref}/cancelStornieren nach Richtlinie
Scope:
bookings:manageBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/bookings/{ref}/amendmentsÄnderung beim Partner-Team anfragen
Scope:
bookings:manageBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/bookings/{ref}/brandIhre Marke oder keine auf den Dokumenten
Scope:
bookings:manageBenötigt einen Live-Schlüssel — ausgestellt nach FreigabeGET/api/b2b/v1/bookings/{ref}/voucherVoucher in Ihrer Marke (HTML oder PDF)
Scope:
bookings:viewGET/api/b2b/v1/bookings/{ref}/name-boardNamensschild für den Fahrer (HTML)
Scope:
bookings:viewGET/api/b2b/v1/requestsÄnderungs- und Serviceanfragen mit den Antworten des Teams
Scope:
bookings:viewPOST/api/b2b/v1/requests/{id}/withdrawOffene Anfrage zurückziehen
Scope:
bookings:manageBenötigt einen Live-Schlüssel — ausgestellt nach Freigabe
Hotelschalter
POST/api/b2b/v1/desk/salesSchnellverkauf am Schalter
Scope:
bookings:createBenötigt einen Live-Schlüssel — ausgestellt nach FreigabeGET/api/b2b/v1/desk/days/{date}Umsätze eines Tages oder dessen Abrechnung als CSV oder PDF
Scope:
statements:readPOST/api/b2b/v1/desk/days/{date}/closeTag abschließen und Abrechnung festschreiben
Scope:
statements:readBenötigt einen Live-Schlüssel — ausgestellt nach Freigabe
Firmentransport
GET/api/b2b/v1/corporate/cost-centresAuflisten
Scope:
bookings:viewPOST/api/b2b/v1/corporate/cost-centresAnlegen oder ändern
Scope:
settings:manageBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/corporate/cost-centres/{id}/approversAnlegen oder ändern
Scope:
settings:manageBenötigt einen Live-Schlüssel — ausgestellt nach FreigabeGET/api/b2b/v1/corporate/requestsAuflisten
Scope:
bookings:viewPOST/api/b2b/v1/corporate/requestsBuchen
Scope:
bookings:createBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/corporate/requests/{id}/decisionGenehmigen oder ablehnen
Scope:
bookings:createBenötigt einen Live-Schlüssel — ausgestellt nach FreigabeGET/api/b2b/v1/corporate/shuttlesAuflisten
Scope:
bookings:viewPOST/api/b2b/v1/corporate/shuttlesAnlegen oder ändern
Scope:
bookings:createBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/corporate/shuttles/{id}/statusStatus ändern
Scope:
bookings:createBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/corporate/shuttles/{id}/scheduleFahrten für einen Monat planen
Scope:
bookings:createBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/corporate/shuttles/{id}/repriceNeu vereinbarten Preis übernehmen
Scope:
bookings:createBenötigt einen Live-Schlüssel — ausgestellt nach FreigabeGET/api/b2b/v1/corporate/usageNutzung nach Kostenstelle (JSON oder CSV)
Scope:
statements:read
DMC-Programme
GET/api/b2b/v1/dmc/programmesAuflisten
Scope:
bookings:viewPOST/api/b2b/v1/dmc/programmesAnlegen oder ändern
Scope:
bookings:createBenötigt einen Live-Schlüssel — ausgestellt nach FreigabeGET/api/b2b/v1/dmc/programmes/{id}Details
Scope:
bookings:viewPOST/api/b2b/v1/dmc/programmes/{id}/versionsBepreiste Version speichern
Scope:
bookings:createBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/dmc/programmes/{id}/statusStatus ändern
Scope:
bookings:createBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/dmc/programmes/{id}/brandIhre Marke oder keine auf den Dokumenten
Scope:
bookings:createBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/dmc/programmes/{id}/acceptVersion annehmen und buchen
Scope:
bookings:createBenötigt einen Live-Schlüssel — ausgestellt nach FreigabeGET/api/b2b/v1/dmc/programmes/{id}/proposalKundenangebot (HTML)
Scope:
bookings:viewPOST/api/b2b/v1/dmc/programmes/{id}/linksBefristeten Kundenlink ausstellen
Scope:
bookings:createBenötigt einen Live-Schlüssel — ausgestellt nach FreigabeGET/api/b2b/v1/dmc/programmes/{id}/linksKundenlinks und wer angenommen hat
Scope:
bookings:viewPOST/api/b2b/v1/dmc/programmes/{id}/links/{link}/revokeKundenlink widerrufen
Scope:
bookings:createBenötigt einen Live-Schlüssel — ausgestellt nach Freigabe
Preise und Angebotsanfragen
GET/api/b2b/v1/rates/catalogueKatalog zu Ihren Preisen (JSON, CSV oder PDF)
Scope:
rates:viewGET/api/b2b/v1/rates/sheetPreisliste der Leistungen
Scope:
rates:viewPOST/api/b2b/v1/quote-requestsAngebotsanfrage senden
Scope:
bookings:createBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/wholesale-requestsFahrzeugkapazität anfragen
Scope:
bookings:createBenötigt einen Live-Schlüssel — ausgestellt nach Freigabe
Buchungs-Widget
GET/api/b2b/v1/widgetWidget-Einstellungen und Snippet
Scope:
tracking:viewPOST/api/b2b/v1/widgetWidget ändern
Scope:
tracking:manageBenötigt einen Live-Schlüssel — ausgestellt nach Freigabe
Nutzer
GET/api/b2b/v1/usersAuflisten
Scope:
users:viewPOST/api/b2b/v1/usersPerson einladen
Scope:
users:manageBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/users/{id}/roleRolle einer Person ändern
Scope:
users:manageBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/users/{id}/deactivateZugang einer Person entziehen
Scope:
users:manageBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/users/{id}/reactivateZugang einer Person wiederherstellen
Scope:
users:manageBenötigt einen Live-Schlüssel — ausgestellt nach Freigabe
Hinweise
GET/api/b2b/v1/inboxHinweise zu Ihrem Konto
Scope:
inbox:view
Abrechnungen und Rechnungen
GET/api/b2b/v1/statementsAbrechnungen, Saldo und offene Rechnungen
Scope:
statements:readGET/api/b2b/v1/statements/{period}Abrechnung eines Monats (JSON oder PDF)
Scope:
statements:readGET/api/b2b/v1/invoices/{id}Eine Rechnung (JSON oder PDF)
Scope:
statements:read
Kontoeinstellungen
GET/api/b2b/v1/settingsKontodaten, Ansprechpartner und Rechnungs-E-Mail
Scope:
settings:viewPOST/api/b2b/v1/settings/billing-emailRechnungs-E-Mail festlegen
Scope:
settings:manageBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/settings/contactsAnsprechpartner hinzufügen oder ändern
Scope:
settings:manageBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/settings/contacts/{id}/removeAnsprechpartner entfernen
Scope:
settings:manageBenötigt einen Live-Schlüssel — ausgestellt nach FreigabePOST/api/b2b/v1/settings/brandIhre Marke oder keine auf den Dokumenten
Scope:
settings:manageBenötigt einen Live-Schlüssel — ausgestellt nach Freigabe
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}'Authentifizierung
Jeder Sandbox-Aufruf braucht ein Bearer-Token. Der Developer-Handshake stellt eines aus: ein Token im JWT-Format, das mit nwp_sandbox_ beginnt, 30 Tage gilt und ausschließlich Testdaten freigibt.
1Sandbox-Token anfordern
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"
}
}2Sandbox damit aufrufen
curl -X POST https://nwp.ae/api/b2b/sandbox/transfers \
-H 'Authorization: Bearer nwp_sandbox_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImVudiI6InNhbmRib3gifQ…' \
-H 'Content-Type: application/json' \
-d @transfer.jsonTransferanfrage
Senden Sie die folgenden Felder an den Transfer-Endpunkt der Sandbox. Feldnamen gehören zur API und bleiben in jeder Sprache englisch.
pickup_locationPflicht{ type: "airport" | "coordinates" | "hotel", … }Wo der Fahrgast abgeholt wird: ein Flughafenterminal (DXB_T1, DXB_T2, DXB_T3, DWC, SHJ), Koordinaten innerhalb der VAE oder eine Hotelreferenz.
dropoff_locationPflicht{ type: "hotel" | "coordinates" | "airport", … }Wohin der Fahrgast gebracht wird: eine Hotelreferenz als String (Ihr eigener Hotelcode oder der Name des Hotels), Koordinaten oder ein Flughafenterminal.
flight_numberBedingtstringDer ankommende Flug, zum Beispiel EK202. Die Abholung richtet sich nach der planmäßigen Landung des Flugs.
pickup_atBedingtstring (ISO 8601)ISO 8601 mit Offset. Pflicht, wenn die Abholung nicht an einem Flughafen erfolgt oder eine Flughafenabholung keinen Flug hat.
buffer_minutes_overrideOptionalintegerKostenlose Wartezeit nach der Landung in Minuten, von 0 bis 180. Standard ist 60: die kostenlose Wartezeit, die die Transfer-Website der Gruppe bereits jeder Ankunft gewährt.
vehicle_classPflichtenumEiner dieser Werte: VIP_V_CLASS, EXECUTIVE_SEDAN oder LUXURY_COACH.
passengersOptionalintegerWird abgelehnt, wenn die Zahl die Sitzplätze der Klasse übersteigt.
client_metadataOptionalobjectWhite-Label-Angaben für den Voucher des Reisenden: agency_name, logo_url (nur https), voucher_branding und agency_reference.
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
pickup_location | { type: "airport" | "coordinates" | "hotel", … } | Pflicht | Wo der Fahrgast abgeholt wird: ein Flughafenterminal (DXB_T1, DXB_T2, DXB_T3, DWC, SHJ), Koordinaten innerhalb der VAE oder eine Hotelreferenz. |
dropoff_location | { type: "hotel" | "coordinates" | "airport", … } | Pflicht | Wohin der Fahrgast gebracht wird: eine Hotelreferenz als String (Ihr eigener Hotelcode oder der Name des Hotels), Koordinaten oder ein Flughafenterminal. |
flight_number | string | Bedingt | Der ankommende Flug, zum Beispiel EK202. Die Abholung richtet sich nach der planmäßigen Landung des Flugs. |
pickup_at | string (ISO 8601) | Bedingt | ISO 8601 mit Offset. Pflicht, wenn die Abholung nicht an einem Flughafen erfolgt oder eine Flughafenabholung keinen Flug hat. |
buffer_minutes_override | integer | Optional | Kostenlose Wartezeit nach der Landung in Minuten, von 0 bis 180. Standard ist 60: die kostenlose Wartezeit, die die Transfer-Website der Gruppe bereits jeder Ankunft gewährt. |
vehicle_class | enum | Pflicht | Einer dieser Werte: VIP_V_CLASS, EXECUTIVE_SEDAN oder LUXURY_COACH. |
passengers | integer | Optional | Wird abgelehnt, wenn die Zahl die Sitzplätze der Klasse übersteigt. |
client_metadata | object | Optional | White-Label-Angaben für den Voucher des Reisenden: agency_name, logo_url (nur https), voucher_branding und 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"
}
}Fahrzeugklassen
| Klasse | Fahrzeug | Sitze |
|---|---|---|
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 |
Jedes Fahrzeug wird mit seinem lizenzierten Chauffeur für den Auftrag gebucht; die Klasse legt Fahrzeugtyp und Sitzplätze fest.
Antwort
Ein Sandbox-Angebot gibt die Anfrage zurück und ergänzt, wie die Abholung getaktet und wie der Voucher gebrandet wird. Es enthält nie einen Preis.
{
"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"
}Flugzeiten
Derzeit richtet sich die Abholung nach der Landezeit in der Buchung, und der Fahrer wartet danach für die Pufferzeit kostenlos. Ändert sich ein Flug, informieren Sie unser Partner-Team, und die Abholung wird entsprechend verschoben.
Eine automatische Live-Ankunftsverfolgung über FlightAware oder AeroDataBox ist geplant. Keiner der beiden Dienste ist bisher angebunden, und die Sandbox meldet live_arrival_tracking als geplant (planned).
Signierte Verfügbarkeit
Der Handshake liefert eine signierte Verfügbarkeits-URL. Die Signatur umfasst Datum, Fahrzeugklasse und Ablaufzeit; wird eines davon geändert, wird der Aufruf abgelehnt. Die Status sind Beispielwerte für die Entwicklung.
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."
}Kontoaktionen
Senden Sie einen POST mit einer Aktion an den Orchestrierungs-Endpunkt. Eine Aktion, die eine Person zu etwas auffordert, wird gespeichert und an unser Partner-Team weitergegeben, bevor die Antwort dies meldet.
| Aktion | Funktion |
|---|---|
credit_line_application | Zahlungsziele Net-15, 30, 45 oder 60 für ein in den VAE eingetragenes Unternehmen. Gewerbelizenznummer und TRN (15 Ziffern, beginnend mit 100) sind erforderlich. Jeder Antrag wird von einer Person geprüft, und Buchungen sind vorauszuzahlen, bis ein Kreditrahmen genehmigt ist. |
wallet_topup | Eine Vorauszahlung auf Ihr Konto. Aufladungen per Karte sind noch nicht verfügbar, daher stellt Ihnen unser Partner-Team eine Rechnung zur Zahlung per Banküberweisung, und die Antwort weist darauf hin. |
account_payload | Die Währungsmatrix Ihres Kontos. AED ist die Basiswährung und die einzige Währung, in der etwas berechnet oder verdient wird; andere Währungen sind Anzeigeumrechnungen zum Tageskurs der Website, sodass sich eine Marge durch Umrechnung nie verschiebt. |
tracking_link | Eine deterministische Partner-URL und ein QR-Code für die Kategorien Ferienwohnungen und Affiliates, mit einer klaren Angabe, wem sie heute gutgeschrieben wird. |
developer_handshake | Ein Sandbox-Token, die Sandbox-Endpunkte und eine signierte Verfügbarkeits-URL. |
{
"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"
}Fehler
Jeder Fehler hat dieselbe Struktur: error.code, error.message und error.retryable, bei einem Validierungsfehler zusätzlich fields und issues.
| Status | Code | Bedeutung |
|---|---|---|
| 400 | invalid_json | Der Body ist kein gültiges JSON. |
| 401 | unauthenticated | Kein Sandbox-Token, oder eines, das fehlerhaft, abgelaufen oder falsch signiert ist. |
| 404 | not_found | Den Endpunkt gibt es auf diesem Host nicht. |
| 405 | method_not_allowed | Der Endpunkt erwartet eine andere Methode. |
| 413 | payload_too_large | Der Body ist größer als 16 KB. |
| 422 | validation_failed | Ein Feld fehlt oder ist fehlerhaft: siehe fields und issues. |
| 429 | rate_limited | Zu viele Anfragen von dieser Adresse: erneut versuchen nach retry_after_seconds. |
| 500 | internal | Auf unserer Seite ist etwas fehlgeschlagen: Nennen Sie die Request-ID. |
| 502 | upstream_unavailable | Ein Zahlungsdienstleister hat nicht geantwortet. |
| 503 | not_configured | Die Anfrage konnte nicht gespeichert werden: Schreiben Sie unserem Partner-Team. |
Rate Limits
Kontoaktionen sind pro Adresse und Stunde begrenzt: credit_line_application: 5, wallet_topup: 10, account_payload: 60, tracking_link: 60 und developer_handshake: 10. Sandbox-Aufrufe sind auf 120 pro Stunde und Adresse begrenzt.
Buchungs-Widget
Das Buchungs-Widget steht freigegebenen Partnern im Early Access offen: Ein Script-Tag bringt die Touren und Transfers von nwp.ae zum öffentlichen Preis auf Ihre Website, in zwölf Sprachen, mit Ihrem Namen und Ihrem Partnercode auf jeder Buchung. Eingerichtet wird es über die API: Die Endpunkte des Buchungs-Widgets lesen und ändern seine Einstellungen und liefern das Snippet zum Einfügen.