Introdução

A API PNA Member Enrollment LATAM Pass é a forma pela qual os nossos parceiros podem realizar o cadastro (enrollment) de novos clientes no programa LATAM Pass, de acordo com as Leis de Proteção de Dados Pessoais dos países em que operamos.

A API recebe os dados de identidade do cliente enviados pelo parceiro e tenta criar uma nova conta ou reconciliar com uma conta já existente, retornando o resultado de forma síncrona.

Para poder realizar requisições à API, deve-se primeiro obter um APP para ter acesso às credenciais e gerar seu token de acesso. Consulte a documentação sobre como iniciar seus testes no Portal ou sobre a Autenticação para todas as informações. Você deve solicitar acesso para a app à "API Member".

⚠️ Importante: obter apenas as credenciais não é suficiente para usar o endpoint de criação de conta. É necessário entrar em contato com o time de Acquisition da LATAM pelo e-mail grp_acquisition_squad@latam.com para que o seu client_id seja associado a um perfil de parceiro autorizado. Use o título: "Solicitação para liberar o uso da API por um partner". No corpo do email informe seu client_id por ambiente. As solicitações feitas com um client_id não associado serão rejeitadas com o erro 403 Forbidden.


Fluxo do processo

Segunda imagen


Requisição

O endpoint recebe os dados do cliente no corpo da requisição em formato JSON e tenta criar ou reconciliar uma conta no LATAM Pass.

PropriedadeValor
MétodoPOST
Caminho/v1/customer/loyalty/partner/member/enroll

Cabeçalho

HeaderObrigatórioDescrição
Client_idSimValor obtido a partir do menu Dev Tools > Minhas Apps > Client ID.
Access_tokenSimToken de acesso obtido durante a autenticação
X-Request-IdNãoToken de idempotência/correlação fornecido pelo parceiro. Máximo de 64 caracteres.

Corpo da requisição (Request Body)

Campos do objeto principal

CampoTipoObrigatórioDescrição
namestringSimPrimeiro nome do cliente. Apenas letras Unicode e espaços. Mín. 2, máx. 80 caracteres.
lastNamestringSimSobrenome do cliente. Mesmas regras de name. Mín. 2, máx. 80 caracteres.
emailstringSimEndereço de e-mail do cliente. Máx. 254 caracteres. Caractere @ obrigatório.
birthDatestringSimData de nascimento no formato ISO-8601 (YYYY-MM-DD).
genderstringNãoSexo do cliente. Valores possíveis: M (Masculino), F (Feminino), I (Indeterminado).
documentobjectSimDocumento de identificação do cliente. Ver detalhes abaixo.
phoneobjectSimTelefone de contato do cliente. Ver detalhes abaixo.
termsAndConditionsAcceptedbooleanSimA aceitação dos Termos e Condições do programa LATAM Pass é obrigatória para criar uma conta. Esse valor deve refletir a aceitação explícita do usuário no fluxo do parceiro: o parceiro deve apresentar os Termos e Condições e registrar o consentimento ativo do usuário.
parentalConsentbooleanCondicionalObrigatório para residentes brasileiros menores de 12 anos. Quando for true, indica que o pai, a mãe ou o responsável legal deu ativamente o consentimento, declarando seu vínculo com o menor e aceitando o tratamento de dados pessoais pela LATAM.

⚠️ Importante: Ao criar uma conta, um e-mail é enviado para o endereço informado no cadastro solicitando a criação da senha de acesso ao LATAM Pass. Por segurança, utilize nos testes apenas endereços de e-mail aos quais você tenha acesso, evitando que terceiros possam acessar ou assumir o controle da conta criada.

Recomendamos utilizar aliases de e-mail, por exemplo:

Campos do objeto document

CampoTipoObrigatórioDescrição
documentCountrystringSimCódigo do país emissor do documento (ISO 3166-1 alpha-2). Valores suportados: CL, EC, CO, BR, PE, AR, US, GB, ES.
documentTypestringSimTipo do documento de acordo com o país do usuário. Veja as regras abaixo.
documentNumberstringSimNúmero do documento, sem espaços. Apenas alfanuméricos, ponto e hífen. De 4 a 32 caracteres.

Regras do campo documentType por país

documentCountryValores permitidos de  documentType 
BRCPF
CLDNI, RUT, PASSPORT
PEDNI, CEPE, PASSPORT
AR, CO, ECDNI, PASSPORT
US, GB, ESPASSPORT

Utilizar um documentType não listado para o país do documento fornecido resulta em um erro 400.

Campos do objeto phone

CampoTipoObrigatórioDescrição
countryCodestringSimCódigo de discagem internacional do país, com ou sem o sinal de +. Ex.: +55, 56.
contactCodestringSimNúmero do telefone (apenas dígitos). De 6 a 15 caracteres. Ex.: 81998765432.

Exemplos de requisição

Requisição mínima (Brasil)

{
  "name": "Maria",
  "lastName": "Silva",
  "email": "maria.silva@email.com",
  "birthDate": "1990-05-20",
  "document": {
    "documentCountry": "BR",
    "documentType": "CPF",
    "documentNumber": "12345678901"
  },
  "phone": {
    "countryCode": "+55",
    "contactCode": "81998765432"
  },
  "termsAndConditionsAccepted": true
}

Requisição completa (Brasil)

{
  "name": "Maria",
  "lastName": "Silva",
  "email": "maria.silva+partner@email.com",
  "birthDate": "1990-05-20",
  "gender": "F",
  "document": {
    "documentCountry": "BR",
    "documentType": "CPF",
    "documentNumber": "12345678901"
  },
  "phone": {
    "countryCode": "+55",
    "contactCode": "81998765432"
  },
  "termsAndConditionsAccepted": true
}

Requisição com passaporte (fora do Brasil)

{
  "name": "Juan",
  "lastName": "Perez",
  "email": "juan.perez@email.com",
  "birthDate": "1988-11-02",
  "document": {
    "documentCountry": "CL",
    "documentType": "PASSPORT",
    "documentNumber": "P12345678"
  },
  "phone": {
    "countryCode": "+56",
    "contactCode": "912345678"
  },
  "termsAndConditionsAccepted": true
}

Requisição para brasileiros menores de 12 anos (Brasil)

{
  "name": "Lucas",
  "lastName": "Oliveira",
  "email": "responsavel@email.com",
  "birthDate": "2016-03-10",
  "document": {
    "documentCountry": "BR",
    "documentType": "CPF",
    "documentNumber": "98765432100"
  },
  "phone": {
    "countryCode": "+55",
    "contactCode": "11987654321"
  },
  "termsAndConditionsAccepted": true,
  "parentalConsent": true
}

Requisição completa (Chile)

{
  "name": "Sebastian",
  "lastName": "Oliveira",
  "email": "persona@email.com",
  "birthDate": "2001-09-04",
  "gender": "M",
  "document": {
    "documentCountry": "CL",
    "documentType": "RUT",
    "documentNumber": "104422594"
  },
  "phone": {
    "countryCode": "+56",
    "contactCode": "912345678"
  },
  "termsAndConditionsAccepted": true
}

Resposta

Respostas de sucesso

201 — Conta criada com sucesso

Retornado quando uma nova conta LATAM Pass é criada para o cliente.

{
  "enrollmentAccepted": true,
  "code": "ENROLLMENT_ACCEPTED",
  "message": "Enrollment completed. Account created.",
  "traceId": "c9d1f1d4a2e84a4b",
  "timestamp": "2026-01-26T20:22:30.523276Z"
}

200 — Conta já existente

Retornado quando já existe uma conta LATAM Pass vinculada aos dados informados. A resposta pode conter uma URL de recuperação de acesso (recoveryUrl), quando disponível.

Com URL de recuperação:

{
  "enrollmentAccepted": true,
  "code": "ACCOUNT_ALREADY_EXISTS",
  "message": "Account already exists.",
  "recoveryUrl": "https://latampass.com/recover?token=abc123",
  "expiresAt": "2026-01-09T00:00:00Z",
  "traceId": "1111222233334444",
  "timestamp": "2026-01-26T20:22:30.523276Z"
}

Sem URL de recuperação:

{
  "enrollmentAccepted": true,
  "code": "ACCOUNT_ALREADY_EXISTS",
  "message": "Account already exists.",
  "traceId": "1111222233334444",
  "timestamp": "2026-01-26T20:22:30.523276Z"
}

Campos da resposta de sucesso

CampoTipoDescrição
enrollmentAcceptedbooleanIndica se o cadastro foi aceito.
codestringCódigo legível por máquina para decisão do parceiro. Valores: ENROLLMENT_ACCEPTED, ACCOUNT_ALREADY_EXISTS.
messagestringDescrição legível por humanos. Não deve ser utilizada para lógica de integração.
recoveryUrlstring (nullable)URL temporária para recuperação de acesso à conta, quando disponível.
expiresAtstring (nullable)Data/hora de expiração da recoveryUrl, no formato ISO-8601.
traceIdstringIdentificador de rastreamento gerado pela API para troubleshooting.
timestampstringData/hora da resposta no formato ISO-8601.

Respostas de erro

400 — Erro de validação ou requisição malformada

Retornado quando há campos obrigatórios ausentes, valores inválidos ou JSON malformado.

Campos obrigatórios ausentes ou inválidos:

{
  "type": "VALIDATION_ERROR",
  "code": "INVALID_REQUEST",
  "message": "One or more fields are invalid.",
  "status": 400,
  "violations": [
    {
      "location": "body",
      "field": "email",
      "reason": "REQUIRED",
      "message": "email is required"
    },
    {
      "location": "body",
      "field": "name",
      "reason": "INVALID_FORMAT",
      "message": "name must contain only Unicode letters and spaces"
    }
  ],
  "traceId": "c9d1f1d4a2e84a4b",
  "timestamp": "2026-01-26T20:22:30.523276Z"
}

JSON malformado ou tipo de dado incorreto:

{
  "type": "MALFORMED_REQUEST",
  "code": "JSON_PARSE_ERROR",
  "message": "Request body is not valid JSON or contains invalid value types.",
  "status": 400,
  "violations": [
    {
      "location": "body",
      "field": "birthDate",
      "reason": "TYPE_MISMATCH",
      "message": "Invalid value type.",
      "expected": "LocalDate",
      "actual": "number"
    }
  ],
  "traceId": "09bae13226d84cfe",
  "timestamp": "2026-01-26T20:22:30.523276Z"
}

401 — Credenciais ausentes ou inválidas

Retornado quando Client_id ou Access_token estão ausentes ou são inválidos.

{
  "type": "UNAUTHORIZED",
  "code": "MISSING_OR_INVALID_CREDENTIALS",
  "message": "Missing or invalid client credentials.",
  "status": 401,
  "traceId": "9a8b7c6d5e4f3210",
  "timestamp": "2026-01-26T20:22:30.523276Z"
}

403 — Não autorizado para esta operação

Retornado quando o Client_id não é reconhecido, ou quando as credenciais são válidas porém o parceiro não possui autorização para esta operação ou ambiente.

Client_id não reconhecido:

{
  "type": "UNAUTHORIZED",
  "code": "UNRECOGNIZED_CLIENT_ID",
  "message": "The provided client_id is not recognized.",
  "status": 403,
  "traceId": "1111222233334444",
  "timestamp": "2026-01-26T20:22:30.523276Z"
}

Sem autorização para a operação/ambiente:

{
  "type": "UNAUTHORIZED",
  "code": "NOT_AUTHORIZED",
  "message": "Client credentials are not authorized for this environment/operation.",
  "status": 403,
  "traceId": "1111222233334444",
  "timestamp": "2026-01-26T20:22:30.523276Z"
}

415 — Tipo de conteúdo não suportado

Retornado quando o Content-Type da requisição não é suportado. Utilize application/json.

{
  "type": "MALFORMED_REQUEST",
  "code": "UNSUPPORTED_MEDIA_TYPE",
  "message": "Request Content-Type is not supported. Use application/json.",
  "status": 415,
  "traceId": "5f6e7d8c9b0a1122",
  "timestamp": "2026-01-26T20:22:30.523276Z"
}

422 — Cadastro rejeitado por regras de negócio

Retornado quando o cadastro é rejeitado por regras de negócio internas. O motivo específico da rejeição não é divulgado.

Recuperação manual necessária: O usuário deve ser orientado a procurar o suporte da LATAM para resolver problemas de cadastro.

{
  "enrollmentAccepted": false,
  "code": "ACCOUNT_MANUAL_RECOVERY_REQUIRED",
  "message": "Account cannot be created via this channel. Please contact LATAM support to recover access.",
  "traceId": "f2a0a29b9f0a4b5a",
  "timestamp": "2026-01-08T23:21:10Z"
}

Rejeição genérica:

{
  "enrollmentAccepted": false,
  "code": "ENROLLMENT_NOT_ALLOWED",
  "message": "Enrollment could not be completed.",
  "traceId": "f2a0a29b9f0a4b5a",
  "timestamp": "2026-01-08T23:21:10Z"
}

500 — Erro interno do servidor

{
  "type": "INTERNAL_ERROR",
  "code": "UNEXPECTED_ERROR",
  "message": "Unexpected server error.",
  "status": 500,
  "traceId": "deadbeefdeadbeef",
  "timestamp": "2026-01-26T20:22:30.523276Z"
}

504 — Tempo limite de serviço downstream excedido

Retornado quando um serviço downstream do LATAM não responde a tempo. A requisição pode ser reenviada posteriormente.

{
  "type": "DOWNSTREAM_ERROR",
  "code": "GATEWAY_TIMEOUT",
  "message": "A downstream service did not respond in time. Please retry later.",
  "status": 504,
  "traceId": "aabbccddeeff0011",
  "timestamp": "2026-01-26T20:22:30.523276Z"
}

Resumo dos códigos de resposta

HTTP StatuscodeenrollmentAcceptedDescriçãoAção
201ENROLLMENT_ACCEPTEDtrueNova conta criada com sucesso.Prossiga com as APIs subsequentes.
200ACCOUNT_ALREADY_EXISTStrueConta já existente. Pode conter ou não uma URL de recuperação.Prossiga. Ofereça o URL de recuperação, se presente.
400INVALID_REQUEST / JSON_PARSE_ERROR—Erro de validação ou JSON malformado.Verifique o retorno que informa as violações cometidas. Corrija o JSON enviado.
401MISSING_OR_INVALID_CREDENTIALS—Credenciais ausentes ou inválidas.Renovar o access_token.
403UNRECOGNIZED_CLIENT_ID / NOT_AUTHORIZED—Client_id não reconhecido ou sem autorização.Entre em contato com o time de suporte.
415UNSUPPORTED_MEDIA_TYPE—Content-Type não suportado.Adicione o cabeçalho Content-Type: application/json
422ACCOUNT_MANUAL_RECOVERY_REQUIRED / ENROLLMENT_NOT_ALLOWEDfalseRejeitado por regras de negócio internas da LATAM.Direcione o usuário para o suporte da LATAM. / Não tente novamente.
500UNEXPECTED_ERROR—Erro inesperado no servidor.Tentar novamente. Registrar traceId.
504GATEWAY_TIMEOUT—Serviço downstream não respondeu a tempo.Tentar novamente. Registrar traceId.

Regra importante

Se enrollmentAccepted = false, o parceiro NÃO DEVE chamar nenhuma API subsequente do LATAM Pass (ex.: Lifecycle, Accrual, Redemption ou qualquer outra API downstream), pois o usuário não existirá no ecossistema LATAM e essas chamadas retornarão erros.

Documentação técnica

Clique aqui para acessá-la.