1 Empieza por el token
Todas las llamadas llevan el mismo header. El token de QA no sirve en producción.
Authorization: Bearer <AccessToken>
Guía para integrar un comercio con Leal. Un solo AccessToken abre Autenticación, Usuarios, Puntos y CDP. El host de las APIs en este ambiente es https://apiqa.leal.co.
Todas las llamadas llevan el mismo header. El token de QA no sirve en producción.
Authorization: Bearer <AccessToken>
| Módulo | Para qué |
|---|---|
| Usuarios | Crear o encontrar a la persona, asociarla al comercio y listar sucursales. |
| Puntos | Consultar saldo, acumular, ver premios, redimir con OTP y anular. |
| CDP | Armar audiencias y exportar clientes a CSV. |
El uid que devuelve Usuarios es el member_ref que pide Puntos. El commerce_id sale del token, en el claim custom:idCommerce.
POST InitiateAuth con el flujo USER_PASSWORD_AUTH. La respuesta trae el AccessToken.
Un POST a la raíz del host. QA usa https://oauthqa.leal.co/. Producción usa https://oauth.leal.co/. El header X-Amz-Target fija la operación InitiateAuth.
QA
POST https://oauthqa.leal.co/
Content-Type: application/x-amz-json-1.1
X-Amz-Target: AWSCognitoIdentityProviderService.InitiateAuth
{
"AuthFlow": "USER_PASSWORD_AUTH",
"ClientId": "<ClientId>",
"AuthParameters": {
"USERNAME": "<usuario>",
"PASSWORD": "<contraseña>"
}
}
Producción
POST https://oauth.leal.co/
Content-Type: application/x-amz-json-1.1
X-Amz-Target: AWSCognitoIdentityProviderService.InitiateAuth
{
"AuthFlow": "USER_PASSWORD_AUTH",
"ClientId": "<ClientId>",
"AuthParameters": {
"USERNAME": "<usuario>",
"PASSWORD": "<contraseña>"
}
}
Usa AuthenticationResult.AccessToken en Authorization: Bearer.
Copia el AccessToken y pégalo en Authentication → Bearer de la referencia, o en la variable token de Postman.
Se envía completo en Authorization. Estos claims se reutilizan en las demás llamadas.
| Claim | Úsalo como |
|---|---|
custom:idCommerce | commerce_id en Puntos, sucursales y CDP. |
custom:uidCms | uid_cms al listar sucursales y al encolar una exportación. |
El token identifica al usuario del comercio, no al cliente final. El cliente se crea o se busca en Usuarios.
Crea a la persona, encuéntrala si ya existe y déjala asociada a tu comercio. Las llamadas usan el AccessToken.
| Llamada | Devuelve | |
|---|---|---|
| GET | /v1/api/cnf/countries/ | Países. El código es codPais. |
| GET | /v1/api/cnf/cities/{codPais} | Ciudades de ese país. El código es codCiudad. |
| GET | /v1/api/cnf/document-type/{codPais} | Tipos de documento. El id es tipoDocumento. |
{
"cedula": "1234567890",
"tipoDocumento": 1,
"nombre": "Ana",
"apellido": "Pérez",
"celular": "3001234567",
"email": "ana@ejemplo.com",
"codPais": "CO",
"codCiudad": "1",
"plataformaOrigen": "API",
"idComercio": 3
}
Guarda el uid de la respuesta. En Puntos ese valor se envía como member_ref.
{
"criterio": "cedula",
"valor": "1234567890"
}
Para ver la ficha de un uid que ya tienes:
El correo o el celular de esa ficha son los que usa el OTP de redención.
Hazlo cuando la persona ya existe y todavía no está en tu programa.
{
"uid": "<uid>",
"idComercio": 3
}
idComercio es el mismo custom:idCommerce del token. Para quitar la asociación: PUT /v1/users/legacy/favorite/remove con el mismo cuerpo.
La redención pide branch_id. Esta lista devuelve los ids de tu comercio.
uid_cms es custom:uidCms. commerce_id es custom:idCommerce. Guarda el id de la sucursal donde opera la caja.
Saldo, acumulación, redención y anulación. Las llamadas usan el AccessToken y X-API-Version: 1. member_ref es el uid de Usuarios. commerce_id es custom:idCommerce.
Responde el commerce_id de tu token. Úsalo para comprobar que el usuario es el de este comercio.
Devuelve el saldo activo y el pendiente.
Historial. También sirve para recuperar el operation_key si hay que anular y ya no lo tienes.
{
"member_ref": "<uid>",
"operation_key": "fac-1001",
"external_ref": "fac-1001",
"source": "pos",
"user_origin": "pos",
"gross_amount": 50000,
"branch_id": "1200"
}
operation_key lo generas tú. Es la llave para no duplicar y para anular después.external_ref es el número de la factura.200 con points: 0 es válido: la regla no entregó puntos.La redención pide un reward_id. Ese id te lo entrega Leal para el premio del comercio.
Genera el OTP, valídalo y llama a la redención.
{
"usecaseId": 1,
"commerceId": 3,
"email": "ana@ejemplo.com",
"cellphone": "3001234567",
"countryCode": "CO",
"uid": "<uid>"
}
usecaseId es el de redención que te entregó Leal. La respuesta trae otpId.
{
"otpId": 12345,
"otpCode": "<código>"
}
Sigue solo si isValid es true.
{
"member_ref": "<uid>",
"reward_id": "<reward_id>",
"operation_key": "red-2001",
"external_ref": "fac-1001",
"source": "pos",
"branch_id": "1200"
}
Usa un operation_key nuevo para la anulación y señala la operación original con origin_operation_key. También vale origin_entry_id o external_ref.
{
"commerce_id": 3,
"member_ref": "<uid>",
"operation_key": "anu-fac-1001",
"origin_operation_key": "fac-1001",
"source": "pos"
}
Para anular una redención, el mismo cuerpo más motive:
{
"commerce_id": 3,
"member_ref": "<uid>",
"operation_key": "anu-red-2001",
"origin_operation_key": "red-2001",
"motive": "devolucion",
"source": "pos"
}
Estas dos llamadas registran la factura y sus líneas, con el mismo AccessToken. codigoItem es el SKU.
Acumula y, si responde code 100, escribe la cabecera y las líneas. Guarda id_transaccion.
Escribe la cabecera si no existe y reemplaza las líneas. codigoItem es el SKU. Pide ese id_transaccion. El detalle de los cuerpos está en la referencia.
Audiencias y exportación CSV, con el mismo AccessToken. commerceId es custom:idCommerce y uidCms es custom:uidCms. El detalle de cada operación está en la referencia.
Una audiencia manual es una lista de uids que tú envías. Este ejemplo aplica solo a ese tipo de audiencia.
{
"audience_name": "Clientes VIP",
"audience_type": "manual",
"uids": ["uid-1", "uid-2"],
"dry_run": true
}
dry_run: true no crea nada: responde 200 con enabled_count y excluded_count, para que revises cuántos clientes entran.dry_run: false (o quítalo) para crear la audiencia. Responde 201 con su segmentation_id.La exportación es asíncrona: primero se encola y después consultas la lista de descargas vigentes. Los tipos públicos son USERS_OF_LIST (clientes de audiencias) y CLIENT (clientes del comercio).
{
"idExportType": "USERS_OF_LIST",
"commerceId": 3,
"uidCms": "<custom:uidCms>"
}
Devuelve las descargas vigentes con su url, status y fecha de retención.
La colección trae las variables baseUrl, token y commerceId vacías. Solo baseUrl viene con el host de este ambiente. En Postman: Import → Link.