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 o token de acesso. Consulte a documentação Autenticação para todas as informações.

Requisição

POST https://api.latampass.com/sandbox/v1/customer/loyalty/partner/member/enroll

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.

Cabeçalho

HeaderObrigatórioDescrição
Client_idSimValor obtido a partir do menu Dev Tools > Minhas Apps > Client ID.
Access_tokenSimToken de acesso obtido anteriormente. Válido por 24 horas.
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.
birthDatestringSimData de nascimento no formato ISO-8601 (YYYY-MM-DD).
genderstringNãoSexo do cliente. Valores possíveis: M, F, I. Se omitido, assume o valor padrão I.
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. Este campo deve ser true — se false ou não enviado, a requisição será rejeitada.
parentalConsentbooleanCondicionalObrigatório para residentes brasileiros com menos de 12 anos. Quando true, o remetente declara ser pai, mãe ou responsável legal do menor e consente com o tratamento dos dados pessoais pela LATAM. Se obrigatório e não enviado ou false, a requisição será rejeitada. Não validado para usuários com 12 anos ou mais, ou para residentes não brasileiros.

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. BR: CPF. Demais países (recomendados): DNI, RUT, PASSPORT. PASSPORT é permitido apenas quando documentCountry não for BR.
documentNumberstringSimNúmero do documento, sem espaços. Apenas alfanuméricos, ponto e hífen. De 4 a 32 caracteres.

Campos do objeto phone

CampoTipoObrigatórioDescrição
countryCodestringSimCódigo de discagem internacional do país, com 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:

{
  "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ção
201ENROLLMENT_ACCEPTEDtrueNova conta criada com sucesso.
200ACCOUNT_ALREADY_EXISTStrueConta já existente. Pode conter URL de recuperação.
400INVALID_REQUEST / JSON_PARSE_ERRORErro de validação ou JSON malformado.
401MISSING_OR_INVALID_CREDENTIALSCredenciais ausentes ou inválidas.
403UNRECOGNIZED_CLIENT_ID / NOT_AUTHORIZEDClient_id não reconhecido ou sem autorização.
415UNSUPPORTED_MEDIA_TYPEContent-Type não suportado.
422ACCOUNT_MANUAL_RECOVERY_REQUIRED / ENROLLMENT_NOT_ALLOWEDfalseRejeitado por regras de negócio.
500UNEXPECTED_ERRORErro inesperado no servidor.
504GATEWAY_TIMEOUTServiço downstream não respondeu a tempo.

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.