Introduction

The LATAM Pass PNA Member Enrollment API is how our partners enroll new customers into the LATAM Pass program, in compliance with the Personal Data Protection Laws of the countries where we operate.

The API receives the customer identity data sent by the partner and attempts to create a new account or reconcile it with an existing one, returning the result synchronously.

To make requests to the API, you must first obtain an APP to access the credentials and generate your access token. See the documentation on how to start your tests in the Portal or on Authentication for all the information. You must request access for the app to the "API Member".

⚠️ Important: obtaining credentials alone is not enough to use the account creation endpoint. You must contact the LATAM Acquisition team at grp_acquisition_squad@latam.com so that your client_id can be associated with an authorized partner profile. Use the subject: "Request to enable API usage for a partner". In the email body, provide your client_id for each environment. Requests made with an unassociated client_id will be rejected with a 403 Forbidden error.


Process flow


Request

The endpoint receives the customer data in the request body in JSON format and attempts to create or reconcile a LATAM Pass account.

PropertyValue
MethodPOST
Path/v1/customer/loyalty/partner/member/enroll
HeaderRequiredDescription
Client_idYesValue obtained from the Dev Tools > My Apps > Client ID menu.
Access_tokenYesAccess token obtained during authentication
X-Request-IdNoIdempotency/correlation token provided by the partner. Maximum 64 characters.

Request Body

Top-level object fields

FieldTypeRequiredDescription
namestringYesCustomer first name. Unicode letters and spaces only. Min. 2, max. 80 characters.
lastNamestringYesCustomer last name. Same rules as name. Min. 2, max. 80 characters.
emailstringYesCustomer email address. Max. 254 characters. The @ character is required.
birthDatestringYesBirth date in ISO-8601 format (YYYY-MM-DD).
genderstringNoCustomer's gender. Possible values: M (Male), F (Female), I (Indeterminate).
documentobjectYesCustomer identity document. See details below.
phoneobjectYesCustomer contact phone. See details below.
termsAndConditionsAcceptedbooleanYesAcceptance of the LATAM Pass program Terms and Conditions is required to create an account. This value must reflect the user's explicit acceptance in the partner's flow: the partner must present the Terms and Conditions and record the user's active consent.
parentalConsentbooleanConditionalRequired for Brazilian residents under 12 years old. When true, it indicates that the parent or legal guardian has actively provided consent, declaring their relationship with the minor and accepting the processing of personal data by LATAM.

⚠️ Important: When an account is created, an email is sent to the address provided during registration requesting the creation of a LATAM Pass access password. For security reasons, when testing, use only email addresses that you have access to, preventing third parties from accessing or taking control of the created account.

We recommend using email aliases, for example:

document object fields

FieldTypeRequiredDescription
documentCountrystringYesISO 3166-1 alpha-2 country code where the document was issued. Supported values: CL, EC, CO, BR, PE, AR, US.
documentTypestringYesDocument type according to the user's country. See the rules below.
documentNumberstringYesDocument number, without spaces. Alphanumeric, periods and hyphens only. From 4 to 32 characters.

Rules for the documentType field by country

documentCountryAllowed documentType values
BRCPF
CLDNI, RUT, PASSPORT
PEDNI, PASSPORT, CEPE
AR, CO, ECDNI, PASSPORT
USPASSPORT

Using a documentType not listed for the country of the provided document results in a 400 error.

Rules for the documentType field by document type

documentCountrydocumentTypeValidationExample
BRCPFExactly 11 digits with a valid check digit. With or without '.' or '-'11122233345
CLDNI, RUT8 or 9 characters (7–8 digits + 1 check digit). All characters except the last must be digits. Last character: 'K' (or 'k') or digit '0–9'. With or without '-'11111111-1
PEDNIExactly 8 digits. With or without '.' or '-'12345678
PECEPEExactly 9 digits. With or without '.' or '-'123456789
ARDNI7 to 9 numeric digits; OR M/F followed by exactly 7 digits (migratory).12345678
CODNI5 to 10 digits1234567891
ECDNIExactly 10 digits with a valid check digit.1621036068
CL, PE, AR, CO, EC, USPASSPORT5 to 15 chars. 'A-Z' or '0-9'AB12345

phone object fields

FieldTypeRequiredDescription
countryCodestringYesInternational country calling code, with or without the + sign. E.g.: +55, 56.
contactCodestringYesPhone number (digits only). From 6 to 15 characters. E.g.: 81998765432.

Request examples

Minimal request (Brazil)

{
  "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
}

Full request (Brazil)

{
  "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
}

Passport request (outside Brazil)

{
  "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
}

Request for Brazilians under 12 years of age (Brazil)

{
  "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
}

Full request (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
}

Response

Success responses

201 — Account created successfully

Returned when a new LATAM Pass account is created for the customer.

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

200 — Account already exists

Returned when a LATAM Pass account linked to the provided data already exists. The response may contain an access recovery URL (recoveryUrl), when available.

With recovery URL:

{
  "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"
}

Without recovery URL:

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

Success response fields

FieldTypeDescription
enrollmentAcceptedbooleanIndicates whether the enrollment was accepted.
codestringMachine-readable code for the partner's decision. Values: ENROLLMENT_ACCEPTED, ACCOUNT_ALREADY_EXISTS.
messagestringHuman-readable description. Should not be used for integration logic.
recoveryUrlstring (nullable)Temporary URL to recover access to the account, when available.
expiresAtstring (nullable)Expiration date/time of the recoveryUrl, in ISO-8601 format.
traceIdstringTrace identifier generated by the API for troubleshooting.
timestampstringResponse date/time in ISO-8601 format.

Error responses

400 — Validation error or malformed request

Returned when there are missing required fields, invalid values, or malformed JSON.

Missing or invalid required fields:

{
  "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"
}

Malformed JSON or incorrect data type:

{
  "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 — Missing or invalid credentials

Returned when Client_id or Access_token are missing or invalid.

{
  "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 — Not authorized for this operation

Returned when the Client_id is not recognized, or when the credentials are valid but the partner is not authorized for this operation or environment.

Unrecognized client_id:

{
  "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"
}

Not authorized for the operation/environment:

{
  "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 — Unsupported media type

Returned when the request Content-Type is not supported. Use 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 — Enrollment rejected by business rules

Returned when the enrollment is rejected by internal business rules. The specific reason for the rejection is not disclosed.

Manual recovery required:

{
  "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"
}

Generic rejection:

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

500 — Internal server error

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

504 — Downstream service timeout

Returned when a downstream LATAM service does not respond in time. The request may be retried later.

{
  "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"
}

Response code summary

HTTP StatuscodeenrollmentAcceptedDescriptionAction
201ENROLLMENT_ACCEPTEDtrueNew account created successfully.Proceed with downstream APIs
200ACCOUNT_ALREADY_EXISTStrueAccount already exists. May contain recovery URL.Proceed. Offer recoveryUrl if present
400INVALID_REQUEST / JSON_PARSE_ERROR—Validation error or malformed JSON.Check violations array. Fix JSON structure/types
401MISSING_OR_INVALID_CREDENTIALS—Missing or invalid credentials.Renew access_token
403UNRECOGNIZED_CLIENT_ID / NOT_AUTHORIZED—Unrecognized client_id or not authorized.Contact LATAM support.
415UNSUPPORTED_MEDIA_TYPE—Unsupported Content-Type.Add Content-Type: application/json
422ACCOUNT_MANUAL_RECOVERY_REQUIREDfalseRejected by business rules.Direct user to LATAM support.
422ENROLLMENT_NOT_ALLOWEDfalseRejected by business rules.Direct user to LATAM support. / Do not retry. Do not proceed with downstream APIs.
500UNEXPECTED_ERROR—Unexpected server error.Retry with backoff. Log traceId
504GATEWAY_TIMEOUT—Downstream service did not respond in time.Retry with backoff. Log traceId

Important rule

If enrollmentAccepted = false and code = ENROLLMENT_NOT_ALLOWED the partner MUST NOT call any subsequent LATAM Pass API (e.g.: Lifecycle, Accrual, Redemption, or any other downstream API), because the user will not exist in the LATAM ecosystem and those calls will return errors.

Technical documentation

Click here to access it.