Desenvolvedores
Documentação da API B2B
A API B2B por trás do nwp.ae: cote e reserve para os seus clientes a tarifa net, emita vouchers e opere um balcão de hotel, transporte corporativo e programas DMC, com as suas tarifas, extratos e faturas no mesmo lugar. Acesso antecipado: as chaves sandbox respondem com dados de teste identificados como tal, e as chaves live são emitidas após a aprovação.
StatusAcesso antecipado · somente sandbox
O sandbox verifica requisições reais com o esquema real e responde com dados de teste. Nada é reservado, nenhum veículo é bloqueado e nenhum preço é retornado. O sandbox não tem nenhum compromisso de nível de serviço, e as chaves de produção são emitidas para parceiros aprovados quando a API abrir.
Solicitar acesso antecipadoVisão geral
JSON via HTTPS. Envie Content-Type: application/json. Toda resposta é JSON e traz um cabeçalho x-request-id para informar à nossa equipe de trade; as respostas do sandbox também trazem x-nwp-environment: sandbox.
| URL base | — |
|---|---|
| Sandbox | https://nwp.ae/api/b2b/sandbox |
| Produção | https://nwp.ae/api/b2b/v1Ainda não aberta · Requer uma chave live — emitida após aprovação |
API B2B v1
Uma só API para tudo o que uma conta faz: transporte terrestre e passeios e atividades com preços segundo as suas condições comerciais (tarifa net, comissão ou tarifário), reservas para os seus clientes, vouchers e placas com o nome, balcão de hotel, transporte corporativo, programas DMC, o widget de reservas, usuários, avisos, extratos e faturas. As chaves sandbox (nwp_test_…) estão abertas a quem solicita uma conta: respondem em cada endpoint com dados de teste marcados sandbox: true e nunca reservam nem alteram a sua conta. As chaves live (nwp_live_…) são emitidas após a aprovação e funcionam quando a NWP ativa o acesso live da sua conta. Cada POST aceita um Idempotency-Key, cada resposta traz x-request-id e cada chave tem o seu próprio limite por minuto.
O documento OpenAPI 3.1: /api/b2b/v1/openapi.json
Transporte terrestre
POST/api/b2b/v1/transport/quotePreço segundo as suas condições
Escopo:
transport:readPOST/api/b2b/v1/transport/bookingsReservar
Escopo:
transport:writeRequer uma chave live — emitida após aprovaçãoGET/api/b2b/v1/transport/bookings/{id}Estado da reserva e condições de cancelamento
Escopo:
transport:readPOST/api/b2b/v1/transport/bookings/{id}/cancelCancelar segundo a política
Escopo:
transport:writeRequer uma chave live — emitida após aprovaçãoGET/api/b2b/v1/transport/bookings/{id}/voucherVoucher com a sua marca (HTML ou PDF)
Escopo:
transport:read
Passeios e atividades
GET/api/b2b/v1/activities/productsProdutos à venda, por pessoa ou por veículo
Escopo:
activities:readGET/api/b2b/v1/activities/products/{id}/availabilityDisponibilidade por dia
Escopo:
activities:readPOST/api/b2b/v1/activities/quotePreço segundo as suas condições
Escopo:
activities:readPOST/api/b2b/v1/activities/bookingsReservar
Escopo:
activities:writeRequer uma chave live — emitida após aprovaçãoGET/api/b2b/v1/activities/bookings/{id}Estado da reserva e condições de cancelamento
Escopo:
activities:readPOST/api/b2b/v1/activities/bookings/{id}/cancelCancelar segundo a política
Escopo:
activities:writeRequer uma chave live — emitida após aprovaçãoGET/api/b2b/v1/activities/bookings/{id}/voucherVoucher com a sua marca (HTML ou PDF)
Escopo:
activities:read
Cruzeiros
GET/api/b2b/v1/cruise/sailingsPartidas
Escopo:
cruise:readAinda não disponível: responde 501 até que um fornecedor de cruzeiros esteja ligadoPOST/api/b2b/v1/cruise/quotePreço segundo as suas condições
Escopo:
cruise:readAinda não disponível: responde 501 até que um fornecedor de cruzeiros esteja ligadoPOST/api/b2b/v1/cruise/bookingsReservar
Escopo:
cruise:writeAinda não disponível: responde 501 até que um fornecedor de cruzeiros esteja ligadoGET/api/b2b/v1/cruise/bookings/{id}Estado da reserva e condições de cancelamento
Escopo:
cruise:readAinda não disponível: responde 501 até que um fornecedor de cruzeiros esteja ligadoPOST/api/b2b/v1/cruise/bookings/{id}/cancelCancelar segundo a política
Escopo:
cruise:writeAinda não disponível: responde 501 até que um fornecedor de cruzeiros esteja ligado
Guias de boas-vindas
GET/api/b2b/v1/guides/propertiesOs seus alojamentos
Escopo:
guides:readPOST/api/b2b/v1/guides/propertiesAdicionar um alojamento
Escopo:
guides:writeGET/api/b2b/v1/guides/properties/{id}Guia, link e ficheiros de um alojamento
Escopo:
guides:readPATCH/api/b2b/v1/guides/properties/{id}Editar um alojamento
Escopo:
guides:writePOST/api/b2b/v1/guides/properties/{id}/statusPausar ou retomar um guia
Escopo:
guides:writePOST/api/b2b/v1/guides/properties/{id}/linkSubstituir o link de hóspedes
Escopo:
guides:writeGET/api/b2b/v1/guides/properties/{id}/wifiLer o Wi-Fi
Escopo:
guides_wifi:readPOST/api/b2b/v1/guides/properties/{id}/wifiDefinir o Wi-Fi
Escopo:
guides_wifi:writeGET/api/b2b/v1/guides/properties/{id}/qrCódigo QR (PNG ou SVG)
Escopo:
guides:readGET/api/b2b/v1/guides/properties/{id}/cardCartão para imprimir (PDF ou HTML)
Escopo:
guides:readGET/api/b2b/v1/guides/statsLeituras, visitas, reservas e a sua parte
Escopo:
guides:read
Conta
GET/api/b2b/v1/whoamiVerificar uma chave
Escopo:
account:readGET/api/b2b/v1/openapi.jsonEsta API em OpenAPI 3.1
Afiliados
GET/api/b2b/v1/affiliate/statsEstatísticas de um período: cliques, reservas, conversão, ganhos
Escopo:
affiliate:readGET/api/b2b/v1/affiliate/linksSeus links de rastreamento, com códigos QR
Escopo:
affiliate:readPOST/api/b2b/v1/affiliate/linksCriar um link de rastreamento com UTM
Escopo:
affiliate:writeRequer uma chave live — emitida após aprovaçãoGET/api/b2b/v1/affiliate/links/{code}/qrCódigo QR de um link (SVG ou PNG)
Escopo:
affiliate:readGET/api/b2b/v1/affiliate/performanceCliques, reservas e ganhos por link
Escopo:
affiliate:readGET/api/b2b/v1/affiliate/payoutsSaldo a receber e pedidos de pagamento
Escopo:
affiliate:readPOST/api/b2b/v1/affiliate/payoutsSolicitar um pagamento, enviado por transferência bancária
Escopo:
affiliate:writeRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/affiliate/payouts/{reference}/cancelRetirar um pedido de pagamento
Escopo:
affiliate:writeRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/affiliate/bank-detailsSalvar os dados bancários (somente escrita)
Escopo:
affiliate:writeRequer uma chave live — emitida após aprovaçãoGET/api/b2b/v1/affiliate/widgetConfigurações e código do widget
Escopo:
affiliate:readPOST/api/b2b/v1/affiliate/widgetConfigurar o widget de reservas
Escopo:
affiliate:writeRequer uma chave live — emitida após aprovação
Reservas para os seus clientes
POST/api/b2b/v1/bookings/quotePreço segundo as suas condições
Escopo:
bookings:createPOST/api/b2b/v1/bookingsReservar
Escopo:
bookings:createRequer uma chave live — emitida após aprovaçãoGET/api/b2b/v1/bookingsListar
Escopo:
bookings:viewGET/api/b2b/v1/bookings/creditedReservas creditadas na sua conta
Escopo:
bookings:viewGET/api/b2b/v1/bookings/{ref}Detalhes
Escopo:
bookings:viewPOST/api/b2b/v1/bookings/{ref}/cancelCancelar segundo a política
Escopo:
bookings:manageRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/bookings/{ref}/amendmentsPedir uma alteração à equipe de trade
Escopo:
bookings:manageRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/bookings/{ref}/brandA sua marca, ou nenhuma, nos documentos
Escopo:
bookings:manageRequer uma chave live — emitida após aprovaçãoGET/api/b2b/v1/bookings/{ref}/voucherVoucher com a sua marca (HTML ou PDF)
Escopo:
bookings:viewGET/api/b2b/v1/bookings/{ref}/name-boardPlaca com o nome para o motorista (HTML)
Escopo:
bookings:viewGET/api/b2b/v1/requestsPedidos de alteração e de serviço, com as respostas da equipe
Escopo:
bookings:viewPOST/api/b2b/v1/requests/{id}/withdrawRetirar um pedido em aberto
Escopo:
bookings:manageRequer uma chave live — emitida após aprovação
Balcão de hotel
POST/api/b2b/v1/desk/salesVenda rápida no balcão
Escopo:
bookings:createRequer uma chave live — emitida após aprovaçãoGET/api/b2b/v1/desk/days/{date}As vendas de um dia, ou o fechamento em CSV ou PDF
Escopo:
statements:readPOST/api/b2b/v1/desk/days/{date}/closeFechar o dia e congelar o fechamento
Escopo:
statements:readRequer uma chave live — emitida após aprovação
Transporte corporativo
GET/api/b2b/v1/corporate/cost-centresListar
Escopo:
bookings:viewPOST/api/b2b/v1/corporate/cost-centresCriar ou alterar
Escopo:
settings:manageRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/corporate/cost-centres/{id}/approversCriar ou alterar
Escopo:
settings:manageRequer uma chave live — emitida após aprovaçãoGET/api/b2b/v1/corporate/requestsListar
Escopo:
bookings:viewPOST/api/b2b/v1/corporate/requestsReservar
Escopo:
bookings:createRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/corporate/requests/{id}/decisionAprovar ou recusar
Escopo:
bookings:createRequer uma chave live — emitida após aprovaçãoGET/api/b2b/v1/corporate/shuttlesListar
Escopo:
bookings:viewPOST/api/b2b/v1/corporate/shuttlesCriar ou alterar
Escopo:
bookings:createRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/corporate/shuttles/{id}/statusAlterar o status
Escopo:
bookings:createRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/corporate/shuttles/{id}/scheduleProgramar as viagens de um mês
Escopo:
bookings:createRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/corporate/shuttles/{id}/repriceAplicar uma tarifa recém-acordada
Escopo:
bookings:createRequer uma chave live — emitida após aprovaçãoGET/api/b2b/v1/corporate/usageUso por centro de custo (JSON ou CSV)
Escopo:
statements:read
Programas DMC
GET/api/b2b/v1/dmc/programmesListar
Escopo:
bookings:viewPOST/api/b2b/v1/dmc/programmesCriar ou alterar
Escopo:
bookings:createRequer uma chave live — emitida após aprovaçãoGET/api/b2b/v1/dmc/programmes/{id}Detalhes
Escopo:
bookings:viewPOST/api/b2b/v1/dmc/programmes/{id}/versionsSalvar uma versão com preços
Escopo:
bookings:createRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/dmc/programmes/{id}/statusAlterar o status
Escopo:
bookings:createRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/dmc/programmes/{id}/brandA sua marca, ou nenhuma, nos documentos
Escopo:
bookings:createRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/dmc/programmes/{id}/acceptAceitar uma versão e reservá-la
Escopo:
bookings:createRequer uma chave live — emitida após aprovaçãoGET/api/b2b/v1/dmc/programmes/{id}/proposalProposta para o cliente (HTML)
Escopo:
bookings:viewPOST/api/b2b/v1/dmc/programmes/{id}/linksEmitir um link de cliente com validade
Escopo:
bookings:createRequer uma chave live — emitida após aprovaçãoGET/api/b2b/v1/dmc/programmes/{id}/linksLinks de cliente e quem aceitou
Escopo:
bookings:viewPOST/api/b2b/v1/dmc/programmes/{id}/links/{link}/revokeRevogar um link de cliente
Escopo:
bookings:createRequer uma chave live — emitida após aprovação
Tarifas e pedidos de cotação
GET/api/b2b/v1/rates/catalogueCatálogo com as suas tarifas (JSON, CSV ou PDF)
Escopo:
rates:viewGET/api/b2b/v1/rates/sheetTabela de tarifas dos serviços
Escopo:
rates:viewPOST/api/b2b/v1/quote-requestsEnviar um pedido de cotação
Escopo:
bookings:createRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/wholesale-requestsSolicitar capacidade de veículos
Escopo:
bookings:createRequer uma chave live — emitida após aprovação
Widget de reservas
GET/api/b2b/v1/widgetConfigurações e código do widget
Escopo:
tracking:viewPOST/api/b2b/v1/widgetAlterar o widget
Escopo:
tracking:manageRequer uma chave live — emitida após aprovação
Usuários
GET/api/b2b/v1/usersListar
Escopo:
users:viewPOST/api/b2b/v1/usersConvidar uma pessoa
Escopo:
users:manageRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/users/{id}/roleAlterar a função de uma pessoa
Escopo:
users:manageRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/users/{id}/deactivateRemover o acesso de uma pessoa
Escopo:
users:manageRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/users/{id}/reactivateRestaurar o acesso de uma pessoa
Escopo:
users:manageRequer uma chave live — emitida após aprovação
Avisos
GET/api/b2b/v1/inboxAvisos sobre a sua conta
Escopo:
inbox:view
Extratos e faturas
GET/api/b2b/v1/statementsExtratos, saldo e faturas em aberto
Escopo:
statements:readGET/api/b2b/v1/statements/{period}Extrato de um mês (JSON ou PDF)
Escopo:
statements:readGET/api/b2b/v1/invoices/{id}Uma fatura (JSON ou PDF)
Escopo:
statements:read
Configurações da conta
GET/api/b2b/v1/settingsDados da conta, contatos e e-mail de cobrança
Escopo:
settings:viewPOST/api/b2b/v1/settings/billing-emailDefinir o e-mail de cobrança
Escopo:
settings:manageRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/settings/contactsAdicionar ou alterar um contato
Escopo:
settings:manageRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/settings/contacts/{id}/removeRemover um contato
Escopo:
settings:manageRequer uma chave live — emitida após aprovaçãoPOST/api/b2b/v1/settings/brandA sua marca, ou nenhuma, nos documentos
Escopo:
settings:manageRequer uma chave live — emitida após aprovação
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}'Autenticação
Toda chamada ao sandbox exige um token bearer. O handshake de desenvolvedor emite um: um token no formato JWT que começa com nwp_sandbox_, vale por 30 dias e dá acesso a dados de teste e a nada mais.
1Solicitar um 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"
}
}2Chamar o sandbox com ele
curl -X POST https://nwp.ae/api/b2b/sandbox/transfers \
-H 'Authorization: Bearer nwp_sandbox_eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImVudiI6InNhbmRib3gifQ…' \
-H 'Content-Type: application/json' \
-d @transfer.jsonRequisição de transfer
Envie os campos abaixo para o endpoint de transfers do sandbox. Os nomes dos campos pertencem à API e permanecem em inglês em todos os idiomas.
pickup_locationObrigatório{ type: "airport" | "coordinates" | "hotel", … }Onde o passageiro é buscado: um terminal de aeroporto (DXB_T1, DXB_T2, DXB_T3, DWC, SHJ), coordenadas dentro dos EAU ou uma referência de hotel.
dropoff_locationObrigatório{ type: "hotel" | "coordinates" | "airport", … }Para onde o passageiro é levado: uma referência de hotel em texto (o seu próprio código de hotel ou o nome do hotel), coordenadas ou um terminal de aeroporto.
flight_numberCondicionalstringO voo de chegada, como EK202. A busca é sincronizada com o pouso previsto do voo.
pickup_atCondicionalstring (ISO 8601)ISO 8601 com offset. Obrigatório quando a busca não é em um aeroporto, ou quando uma busca no aeroporto não tem voo.
buffer_minutes_overrideOpcionalintegerEspera gratuita após o pouso, em minutos, de 0 a 180. O padrão é 60: a espera gratuita que o site de transfers do grupo já oferece a cada chegada.
vehicle_classObrigatórioenumUm destes valores: VIP_V_CLASS, EXECUTIVE_SEDAN ou LUXURY_COACH.
passengersOpcionalintegerRecusado quando excede os assentos da classe.
client_metadataOpcionalobjectDados white-label para o voucher do viajante: agency_name, logo_url (somente https), voucher_branding e agency_reference.
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
pickup_location | { type: "airport" | "coordinates" | "hotel", … } | Obrigatório | Onde o passageiro é buscado: um terminal de aeroporto (DXB_T1, DXB_T2, DXB_T3, DWC, SHJ), coordenadas dentro dos EAU ou uma referência de hotel. |
dropoff_location | { type: "hotel" | "coordinates" | "airport", … } | Obrigatório | Para onde o passageiro é levado: uma referência de hotel em texto (o seu próprio código de hotel ou o nome do hotel), coordenadas ou um terminal de aeroporto. |
flight_number | string | Condicional | O voo de chegada, como EK202. A busca é sincronizada com o pouso previsto do voo. |
pickup_at | string (ISO 8601) | Condicional | ISO 8601 com offset. Obrigatório quando a busca não é em um aeroporto, ou quando uma busca no aeroporto não tem voo. |
buffer_minutes_override | integer | Opcional | Espera gratuita após o pouso, em minutos, de 0 a 180. O padrão é 60: a espera gratuita que o site de transfers do grupo já oferece a cada chegada. |
vehicle_class | enum | Obrigatório | Um destes valores: VIP_V_CLASS, EXECUTIVE_SEDAN ou LUXURY_COACH. |
passengers | integer | Opcional | Recusado quando excede os assentos da classe. |
client_metadata | object | Opcional | Dados white-label para o voucher do viajante: agency_name, logo_url (somente 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"
}
}Classes de veículo
| Classe | Veículo | Assentos |
|---|---|---|
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 veículo é contratado com seu motorista licenciado para o serviço; a classe define o tipo de veículo e os assentos.
Resposta
Uma cotação do sandbox repete a requisição e acrescenta como a busca será programada e como o voucher será personalizado. Ela nunca traz preço.
{
"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"
}Horário dos voos
Hoje a busca é sincronizada com o horário de pouso informado na reserva, e o motorista espera gratuitamente pelo tempo de margem depois dele. Se um voo mudar, avise a nossa equipe de trade e a busca muda junto.
O rastreamento automático de chegadas em tempo real via FlightAware ou AeroDataBox está planejado. Nenhum dos dois está conectado ainda, e o sandbox informa live_arrival_tracking como planejado (planned).
Disponibilidade assinada
O handshake retorna uma URL de disponibilidade assinada. A assinatura cobre a data, a classe do veículo e a expiração; se qualquer um deles mudar, a chamada é recusada. Os status são exemplos para desenvolver.
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."
}Ações de conta
Faça um POST para o endpoint de orquestração com uma ação. Uma ação que pede a uma pessoa para fazer algo é armazenada e repassada à nossa equipe de trade antes de a resposta informar isso.
| Ação | O que faz |
|---|---|
credit_line_application | Prazos Net-15, 30, 45 ou 60 para uma empresa registrada nos EAU. O número da licença comercial e o TRN (15 dígitos, começando com 100) são obrigatórios. Uma pessoa analisa cada pedido, e as reservas são pré-pagas até que uma linha de crédito seja aprovada. |
wallet_topup | Um pré-pagamento na sua conta. Recargas com cartão ainda não estão disponíveis, então nossa equipe de trade emite a cobrança por transferência bancária, e a resposta informa isso. |
account_payload | A matriz de moedas da sua conta. O AED é a moeda base e a única em que qualquer valor é cobrado ou ganho; as outras moedas são conversões de exibição à taxa diária do site, de modo que uma margem nunca muda na conversão. |
tracking_link | Uma URL de parceiro determinística e um código QR para as categorias de casas de temporada e afiliados, com uma indicação clara de onde ela é creditada hoje. |
developer_handshake | Um token de sandbox, os endpoints do sandbox e uma URL de disponibilidade assinada. |
{
"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"
}Erros
Todo erro tem o mesmo formato: error.code, error.message e error.retryable, com fields e issues em caso de falha de validação.
| Status | Código | Significado |
|---|---|---|
| 400 | invalid_json | O corpo não é um JSON válido. |
| 401 | unauthenticated | Sem token de sandbox, ou com um token malformado, expirado ou assinado incorretamente. |
| 404 | not_found | O endpoint não existe neste host. |
| 405 | method_not_allowed | O endpoint aceita outro método. |
| 413 | payload_too_large | O corpo é maior que 16 KB. |
| 422 | validation_failed | Um campo está faltando ou malformado: veja fields e issues. |
| 429 | rate_limited | Requisições demais a partir deste endereço: tente novamente após retry_after_seconds. |
| 500 | internal | Algo falhou do nosso lado: informe o ID da requisição. |
| 502 | upstream_unavailable | Um provedor de pagamento não respondeu. |
| 503 | not_configured | Não foi possível armazenar a requisição: envie um e-mail à nossa equipe de trade. |
Limites de taxa
As ações de conta são limitadas por endereço, por hora: credit_line_application: 5, wallet_topup: 10, account_payload: 60, tracking_link: 60 e developer_handshake: 10. As chamadas ao sandbox são limitadas a 120 por hora por endereço.
Widget de reservas
O widget de reservas está aberto a parceiros aprovados em acesso antecipado: uma tag script coloca os passeios e transfers da nwp.ae no seu site ao preço público, em doze idiomas, com o seu nome e o seu código de parceiro em cada reserva. A configuração é feita pela API: os endpoints do widget de reservas leem e alteram as configurações e devolvem o trecho de código para colar.