Developers
Documentación
Referencia API
Documentación
QuickstartDocumentación técnica para consultar clientes y transacciones por tienda con autenticación basada en apiKey, secretKey, bearer tokens temporales y límites operativos por apiKey.
Overview
La API externa de LoyalEats permite a cada tienda consultar los clientes y transacciones de sus propias campañas sin exponer operaciones internas del dashboard.
Todos los recursos se filtran por la tienda dueña de la credencial. Si envías un campaignId, debe pertenecer a ese shop.
El flujo es apiKey + secretKey para obtener un token temporal y luego consumir los endpoints con bearer token. Cada apiKey tiene límites operativos para proteger la base de datos.
Esta primera versión está orientada a lectura: clientes, detalle de cliente y transacciones, con DTOs públicos estables desacoplados del modelo interno y un uso controlado para partners.
Quickstart
Si ya tienes tus credenciales, estos son los pasos mínimos para empezar.
Obtén tu API_KEY y SECRET_KEY desde Configuración > Mi cuenta.
Solicita un access token de 15 minutos en POST /api/external/v1/auth/token.
Consume los endpoints con Authorization: Bearer <token>.
curl
Ejemplo
curl -X POST "https://tu-dominio.com/api/external/v1/auth/token" \
-H "Content-Type: application/json" \
-d '{
"apiKey": "le_pk_xxxxxxxxxxxx",
"secretKey": "le_sk_xxxxxxxxxxxxxxxxxxxxxxxx"
}'
curl "https://tu-dominio.com/api/external/v1/customers?page=1&pageSize=20" \
-H "Authorization: Bearer TU_ACCESS_TOKEN"fetch
Ejemplo
const tokenResponse = await fetch("https://tu-dominio.com/api/external/v1/auth/token", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
apiKey: "le_pk_xxxxxxxxxxxx",
secretKey: "le_sk_xxxxxxxxxxxxxxxxxxxxxxxx",
}),
});
const { accessToken } = await tokenResponse.json();
const customersResponse = await fetch(
"https://tu-dominio.com/api/external/v1/customers?page=1&pageSize=20",
{
headers: {
Authorization: `Bearer ${accessToken}`,
},
},
);
const customers = await customersResponse.json();Autenticación
Primero obtén un access token con tus credenciales. Luego usa ese token como Bearer en todos los endpoints de datos.
POST /api/external/v1/auth/tokenEnvía apiKey y secretKey en el body JSON. Si una apiKey excede el límite permitido, recibirás 429.
La respuesta devuelve accessToken y expiresIn: 900. Ese token debe enviarse en Authorization: Bearer. Los endpoints de lectura aplican rate limit por apiKey.
Endpoints
A continuación encontrarás los cuatro endpoints disponibles en la API externa v1 y ejemplos reales del contrato público expuesto.
/api/external/v1/auth/tokenValida la pareja API_KEY + SECRET_KEY y devuelve un bearer token temporal para consumir la API externa.
No requiere bearer token. Usa apiKey y secretKey en el body.
apiKeyRequerido
Identificador público de la credencial asignada a la tienda.
secretKeyRequerido
Secreto asociado a la credencial. Solo se muestra al crear o regenerar.
curl
Ejemplo
curl -X POST "https://tu-dominio.com/api/external/v1/auth/token" \
-H "Content-Type: application/json" \
-d '{
"apiKey": "le_pk_xxxxxxxxxxxx",
"secretKey": "le_sk_xxxxxxxxxxxxxxxxxxxxxxxx"
}'fetch
Ejemplo
const response = await fetch("https://tu-dominio.com/api/external/v1/auth/token", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
apiKey: "le_pk_xxxxxxxxxxxx",
secretKey: "le_sk_xxxxxxxxxxxxxxxxxxxxxxxx",
}),
});
const data = await response.json();json
Ejemplo
{
"success": true,
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expiresIn": 900
}/api/external/v1/customersDevuelve clientes de una campaña específica o de todas las campañas de la tienda autenticada.
Requiere Authorization: Bearer <token>.
campaignIdOpcional
Si se envía, la campaña debe pertenecer a la tienda. Si no se envía, la consulta agrega todas las campañas del shop.
pageOpcional
Número de página. Valor por defecto: 1.
pageSizeOpcional
Tamaño de página. Máximo actual: 100.
statusFilterOpcional
Acepta "all", "active" o "inactive".
curl
Ejemplo
curl "https://tu-dominio.com/api/external/v1/customers?campaignId=6844a2d1b0c123456789abcd&page=1&pageSize=20&statusFilter=active" \ -H "Authorization: Bearer TU_ACCESS_TOKEN"
fetch
Ejemplo
const response = await fetch(
"https://tu-dominio.com/api/external/v1/customers?campaignId=6844a2d1b0c123456789abcd&page=1&pageSize=20&statusFilter=active",
{
headers: {
Authorization: "Bearer TU_ACCESS_TOKEN",
},
},
);
const data = await response.json();json
Ejemplo
{
"success": true,
"items": [
{
"id": "6844a6f9b0c123456789abef",
"shopId": "shop-123",
"campaignId": "6844a2d1b0c123456789abcd",
"firstName": "Ana",
"lastName": "Pérez",
"secondLastName": "Díaz",
"email": "ana@correo.com",
"phone": "51999999999",
"points": 12,
"rewards": 1,
"rewardsGranted": 0,
"maxPoints": 20,
"isActive": true,
"createdAt": "2026-06-03T14:05:00.000Z",
"dateOfBirth": "1995-08-21T00:00:00.000Z",
"customFields": {
"favoriteDrink": "Cold Brew"
}
}
],
"pagination": {
"page": 1,
"pageSize": 20,
"total": 1,
"totalPages": 1
}
}/api/external/v1/customers/:idDevuelve el detalle de un cliente específico siempre que su campaña pertenezca a la tienda autenticada.
Requiere Authorization: Bearer <token>.
idRequerido
ObjectId del cliente en la colección cards_users.
curl
Ejemplo
curl "https://tu-dominio.com/api/external/v1/customers/6844a6f9b0c123456789abef" \ -H "Authorization: Bearer TU_ACCESS_TOKEN"
fetch
Ejemplo
const response = await fetch(
"https://tu-dominio.com/api/external/v1/customers/6844a6f9b0c123456789abef",
{
headers: {
Authorization: "Bearer TU_ACCESS_TOKEN",
},
},
);
const data = await response.json();json
Ejemplo
{
"success": true,
"item": {
"id": "6844a6f9b0c123456789abef",
"shopId": "shop-123",
"campaignId": "6844a2d1b0c123456789abcd",
"firstName": "Ana",
"lastName": "Pérez",
"secondLastName": "Díaz",
"email": "ana@correo.com",
"phone": "51999999999",
"points": 12,
"rewards": 1,
"rewardsGranted": 0,
"maxPoints": 20,
"isActive": true,
"createdAt": "2026-06-03T14:05:00.000Z",
"dateOfBirth": "1995-08-21T00:00:00.000Z",
"customFields": {
"favoriteDrink": "Cold Brew"
}
}
}/api/external/v1/transactionsDevuelve transacciones de una campaña específica o agregadas de todas las campañas de la tienda.
Requiere Authorization: Bearer <token>.
campaignIdOpcional
Si se envía, debe pertenecer a la tienda autenticada. Si no se envía, devuelve transacciones de todas las campañas del shop.
clientIdOpcional
Filtra por el identificador público del cliente.
pageOpcional
Número de página. Valor por defecto: 1.
pageSizeOpcional
Tamaño de página. Máximo actual: 100.
dateFromOpcional
Fecha/hora inicial en formato ISO 8601.
dateToOpcional
Fecha/hora final en formato ISO 8601.
curl
Ejemplo
curl "https://tu-dominio.com/api/external/v1/transactions?campaignId=6844a2d1b0c123456789abcd&page=1&pageSize=20&dateFrom=2026-06-01T00:00:00.000Z" \ -H "Authorization: Bearer TU_ACCESS_TOKEN"
fetch
Ejemplo
const response = await fetch(
"https://tu-dominio.com/api/external/v1/transactions?campaignId=6844a2d1b0c123456789abcd&page=1&pageSize=20&dateFrom=2026-06-01T00:00:00.000Z",
{
headers: {
Authorization: "Bearer TU_ACCESS_TOKEN",
},
},
);
const data = await response.json();json
Ejemplo
{
"success": true,
"items": [
{
"id": "6844b013b0c123456789ac10",
"campaignId": "6844a2d1b0c123456789abcd",
"customerId": "6844a6f9b0c123456789abef",
"branchId": "6844af77b0c123456789ac01",
"employeeId": "6844af8bb0c123456789ac02",
"productId": "6844afc2b0c123456789ac03",
"action": "add_points",
"email": "ana@correo.com",
"stampCount": 1,
"rewardCount": 0,
"createdAt": "2026-06-03T14:22:00.000Z",
"productName": "Latte grande",
"branchName": "Miraflores",
"employeeName": "Luis Torres"
}
],
"pagination": {
"page": 1,
"pageSize": 20,
"total": 1,
"totalPages": 1
}
}Errores
Estos son los estados HTTP que deberías contemplar al integrar la API.
Ocurre cuando falta el bearer token, el token es inválido o las credenciales del token endpoint no son correctas.
Se devuelve cuando el campaignId o el cliente no pertenecen a la tienda autenticada.
Se usa cuando el cliente solicitado no existe o no tiene una campaña válida asociada.
Se devuelve cuando falta apiKey o secretKey, cuando se envía searchTerm o cuando algún parámetro como page, pageSize, statusFilter, dateFrom, dateTo o IDs no tiene formato válido.
Se devuelve cuando una apiKey excede el límite de requests permitido en la ventana actual.
Se devuelve ante una falla inesperada del servidor o del acceso a base de datos.
Notas
Dos conceptos importantes para interpretar correctamente los resultados.
Si envías campaignId, la API valida que esa campaña pertenezca a la tienda autenticada.
Si no envías campaignId, la consulta agrega los resultados de todas las campañas asociadas al shop dueño del token.
Los listados devuelven siempre un objeto pagination con:
page: página solicitada.
pageSize: cantidad de resultados por página.
total: cantidad total de registros.
totalPages: total de páginas disponibles.
page y pageSize se validan de forma estricta. El máximo actual de pageSize es 100.