Configuração da API
Esta seção aborda os passos essenciais para uma integração bem-sucedida com nossas APIs. Quer você queira receber notificações push via Webhooks ou extrair dados de nossos endpoints, nós temos a solução ideal para você.
- API Push: Ideal para parceiros TAAP e White Label Travel Platform, os eventos push entregam atualizações real-time diretamente para o seu sistema. Aprenda como configurar assinaturas, gerenciar autenticação e lidar com novas tentativas.
- API Pull: Projetada para parceiros de Plataforma de Viagens White Label, permite que você solicite dados quando precisar deles. Explicaremos como configurar a autenticação token-based para acesso seguro.
Siga as orientações abaixo para garantir uma integração tranquila e uma transmissão de dados segura.
Entrega Push-based
Isso pode ser relevante para você se for um parceiro TAAP ou de uma Plataforma de Viagens White Label interessado em dados de itinerários. Os eventos push são entregues via Webhook e serão enviados como uma mensagem HTTP POSTpara um URL que você fornecer.
Para começar a receber eventos, você precisará se inscrever em um tipo de evento e autenticar a Expedia como remetente.
Assinaturas e eventos
Nossa API de Assinaturas permite que você crie e gerencie os eventos que deseja receber por meio do nosso serviço de entrega push-based. Atualmente, você pode criar e gerenciar assinaturas para eventos de atualização de itinerários, e adicionaremos mais opções conforme forem disponibilizadas.
Você precisará de um ID e uma chave secreta do cliente da API, que seu contato comercial pode fornecer.
Acessando a API de Assinaturas
Você deverá incluir um token de acesso específico para sua empresa em todas as suas solicitações de API. Solicite este token usando suas credenciais de API por meio do mecanismo de autenticação básica HTTP.
- Adicione um cabeçalho de Autorização com uma string codificada em Base64 contendo o ID e o segredo do seu cliente de API ao endpoint de token
https://analytics.ean.com/*/v1/oauth/token. Substitua o*no URL portemplateoutaap, dependendo da sua parceria. - O endpoint de token retornará um token de acesso que você usará em solicitações de API subsequentes. Para obter mais detalhes, consulte os detalhes da API de Assinaturas .
- Inclua o valor do token de acesso em futuras solicitações ao endpoint da API.
Exemplo de cabeçalho de autorização inicial
Authorization: Basic base64.b64encode({client-id}:{client-secret})Exemplo de solicitação de token
securitySchemes:
oauth:
type: oauth2
flows:
clientCredentials:
tokenUrl: https://analytics.ean.com/taap/v1/oauth/tokenExemplo de cabeçalho de autorização autenticado
Authorization: Bearer {access-token}Gerenciando suas assinaturas
Após autenticar-se na API de Assinaturas, você poderá gerenciar suas assinaturas, incluindo criar uma lista das assinaturas existentes, criar novas e excluir aquelas que não são mais relevantes.
Criar assinaturas
Ao criar uma assinatura, você precisará especificar:
- O URL do ponto de extremidade onde você deseja receber eventos.
- O tipo de evento ao qual você deseja se inscrever, incluindo o indicador de sua parceria:
taap.itinerary.changeoutemplate.itinerary.change.
Observação: Embora seja possível criar várias assinaturas, assinaturas duplicadas resultarão em entregas de eventos duplicadas. Para evitar isso, liste suas assinaturas existentes antes de criar novas.
Ao criar uma assinatura, você receberá uma chave secreta exclusiva para validar o HMAC (código de autenticação de mensagem hash-based) incluído nas entregas de eventos.
Para listar ou excluir assinaturas, use os endpoints HTTP GET /subscriptionsou HTTP DELETE /subscriptions/{subscription_id}, respectivamente. Você deve usar um token válido.
Para obter detalhes adicionais, consulte os detalhes da API de Assinaturas .
Autenticando a Expedia como remetente
Enviaremos eventos push para o endpoint que você fornecer, e cada evento incluirá uma assinatura de código de autenticação de mensagem (HMAC) hash-based no cabeçalho de autorização. Você deve validar esta assinatura para garantir a transmissão segura e confiável de dados usando o segredo compartilhado que forneceremos quando você criar uma assinatura.
Exemplo de cabeçalho de autorização
"authorization": "MAC ts='1731524372777',nonce='f88e57ed-aaf5-4edd-8e58-9105817fb4cb',bodyhash='8YLHy71r5dx3PQjdcOkRuVYXaakjhbJSROEnlreQEIA=',mac='bDxvx41INtDxtkbZwTmAMADZGiFl6/xyXC1lE5ixPuY='"Valide a assinatura HMAC adicionando a seguinte lógica ao seu endpoint que recebe eventos push. Isso garantirá que os eventos que você receber sejam da Expedia e não tenham sido adulterados durante a transmissão.
Nota: Este exemplo mostra como implementar essa lógica de validação em Java. Você pode adaptar a lógica à sua linguagem de programação preferida, mas os passos principais permanecerão os mesmos.
Etapa 1: Analise o cabeçalho de autorização.
Extraia as informações necessárias do cabeçalho de autorização, analisando a string e decompondo-a em seus componentes básicos.
Exemplo de código
/**
* Parse the signature string into components
* @param signature The signature string in format "MAC ts='...', nonce='...', bodyhash='...', mac='...'"
* @return Map of signature components
*/
private Map<String, String> parseSignature(String signature) {
// Pattern for key='value' or key="value"
Pattern pattern = Pattern.compile("([a-zA-Z]+)=['"]([^'"]*)['"]");
Matcher matcher = pattern.matcher(signature);
Map<String, String> components = new HashMap<>();
while (matcher.find()) {
components.put(matcher.group(1), matcher.group(2));
}
return components;
}Etapa 2: Validar os componentes necessários
Verifique se os componentes obrigatórios ts (carimbo de data/hora), nonce, bodyhashe macestão presentes e formatados corretamente.
Exemplo de código
private Boolean validateSignatureComponents(Map<String, String> components) {
if (components.isEmpty()) {
return false;
}
return components.containsKey("ts") &&
components.containsKey("nonce") &&
components.containsKey("bodyhash") &&
components.containsKey("mac");
}Etapa 3: Gere e valide o hash do corpo da requisição.
Gere o hash do corpo usando HMAC SHA-256 e o sharedSecretKeye confirme se ele corresponde ao hash do corpo da solicitação para garantir a integridade dos dados.
Exemplo de código
/**
* Compute body hash (HMAC-SHA256 of the request body)
* @param body The raw request body
* @return Base64 encoded body hash
*/
private String computeBodyHash(String body) {
try {
Mac mac = Mac.getInstance(HMAC_SHA256);
SecretKeySpec secretKeySpec = new SecretKeySpec(
sharedSecretKey.getBytes(StandardCharsets.UTF_8),
HMAC_SHA256);
mac.init(secretKeySpec);
byte[] hmacBytes = mac.doFinal(body.getBytes(StandardCharsets.UTF_8));
return bytesToBase64(hmacBytes);
} catch (Exception e) {
throw new RuntimeException("Failed to compute body hash", e);
}
}
private Boolean validateBodyHash(String requestBody, String bodyHashFromHeader) {
String computedBodyHash = computeBodyHash(requestBody != null ? requestBody : "");
return computedBodyHash.equals(components.get('bodyhash'));
}Etapa 4: Gerar e validar a assinatura HMAC
Gere a assinatura HMAC, incluindo o carimbo de data/hora, nonce, método HTTP, caminho da solicitação, domínio do host, porta e hash do corpo gerado, e valide-a em relação ao valor recebido no cabeçalho para garantir a autenticidade.
Exemplo de código
/**
* Generate HMAC signature using the provided components
* @param components Parsed signature components
* @param computedBodyHash Computed body hash
* @param method HTTP method (e.g., "POST", "GET")
* @param path Request path (e.g., "/api/webhooks/events")
* @param host Host name (e.g., "api.example.com")
* @param port Port number
* @return Base64 encoded HMAC signature
*/
private String generateHmacSignature(Map<String, String> components, String computedBodyHash,
String method, String path, String host, int port) {
try {
// Normalize port (use 443 for standard HTTPS ports)
String portString = (port == 80 || port == 443) ? DEFAULT_PORT : String.valueOf(port);
// Build signature string with newline-delimited components
String signatureString = String.format("%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
components.get("ts"),
components.get("nonce"),
method.toUpperCase(),
path,
host,
portString,
computedBodyHash);
return calculateHMAC(signatureString);
} catch (Exception e) {
throw new RuntimeException("Failed to generate HMAC signature", e);
}
}
/**
* Calculate HMAC-SHA256
* @param data Data to hash
* @return Base64 encoded HMAC
*/
private String calculateHMAC(String data) {
try {
Mac mac = Mac.getInstance(HMAC_SHA256);
SecretKeySpec secretKeySpec = new SecretKeySpec(
sharedSecretKey.getBytes(StandardCharsets.UTF_8),
HMAC_SHA256);
mac.init(secretKeySpec);
byte[] hmacBytes = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
return bytesToBase64(hmacBytes);
} catch (Exception e) {
throw new RuntimeException("Failed to calculate HMAC", e);
}
}
private Boolean validateHmacSignature(Map<String, String> components, String computedBodyHash,
String method, String path, String host, int port) {
String generatedHmacSignature = generateHmacSignature(components, computedBodyHash, method, path, host, port);
return generatedHmacSignature.equals(components.get("mac"));
}Tentando novamente falhas de eventos
Se um evento falhar, o sistema tentará novamente usando um padrão de espera exponencial ao longo de 7 dias: primeiro em 5 minutos, depois em 60 minutos e, a partir daí, a cada 12 horas. Tentaremos novamente qualquer falha causada por:
- Um código de status HTTP diferente de 200
- Um tempo limite
- Uma exceção do seu endpoint
Detalhes da API de Assinaturas
Para obter mais detalhes sobre a API de Assinaturas, faça o download da especificação OpenAPI.
Entrega Pull-based
Se você possui um site de Plataforma de Viagens White Label, pode implementar a entrega pull-based para dados de Itinerários e Acúmulo de Pontos de Fidelidade, dependendo das APIs que estiver utilizando.
Para obter acesso aos endpoints de Acúmulo de Pontos de Fidelidade e Itinerários, você precisará de um ID e um segredo de cliente da API, que podem ser obtidos com seu contato comercial. Você deverá incluir um token de acesso específico para sua empresa em todas as suas solicitações de API. Solicite este token usando suas credenciais de API por meio do mecanismo de autenticação básica HTTP.
- Adicione um cabeçalho de Autorização com uma string codificada em Base64 contendo o ID e o segredo do seu cliente de API ao endpoint de token.
https://analytics.ean.com/template/v1/oauth/token. - O endpoint de token retornará um token de acesso que você usará em solicitações de API subsequentes. Para obter mais detalhes, consulte a especificação OpenAPI.
- Inclua o valor do token de acesso em futuras solicitações ao endpoint da API.
Exemplo de cabeçalho de autorização inicial
Authorization: Basic base64.b64encode({client-id}:{client-secret})Exemplo de solicitação de token
securitySchemes:
oauth:
type: oauth2
flows:
clientCredentials:
tokenUrl: https://analytics.ean.com/template/v1/oauth/tokenExemplo de cabeçalho de autorização autenticado
Authorization: Bearer {token}Após receber seu token, você poderá começar a fazer solicitações para qualquer um dos endpoints de Acúmulo de Pontos de Fidelidade ou Itinerários.
Ao solicitar o serviço, você precisará especificar a versão da sua API. Use oservers.url Valor encontrado na parte superior dos nossos arquivos de especificação OpenAPI para download. Sempre corresponderá ao número da versão do serviço de API que você está testando.
A URL deve seguir esta estrutura:
https://analytics.ean.com/[product]/[API version]/[path]
Você pode alternar entre endpoints substituindo o caminho, mas certifique-se de manter o protocolo, a designação de domínio, o produto e o número da versão da API conforme definido na especificação OpenAPI.
Exemplos de endpoints
https://analytics.ean.com/template/v1/loyalty/earn/last_update
https://analytics.ean.com/template/v1/itinerariesPara explorar o escopo dos dados e as configurações da API, consulte os esquemas de entrega da API:
Entrega de API de itinerários
Entrega da API de Acúmulo de Fidelidade