Esta página es una referencia técnica para desarrolladores que integran la
API de Gastuki. Si buscás cómo usar el producto, mirá Para personas
o Para comercios.
1. Superficies y montaje de rutas
Todas las rutas se montan en la raíz (/). Los grandes grupos son:
2. Autenticación
- WhatsApp: el usuario se identifica por su número de teléfono (normalizado a E.164). No hay token; el canal es el identificador.
- API web (cliente): token Bearer de Supabase (
Authorization: Bearer <token>). El ID de usuario sale del JWT. - API de comercio (
/merchant/*): token Bearer + el usuario debe tener un comercio asociado. Algunas acciones (administradores) requieren ser dueño. - MCP: token OAuth propio (o JWT de Supabase en modo compatibilidad). Ver MCP.
- Endpoints públicos:
POST /merchant/leads,GET /qr/:merchantCode, assets públicos y los webhooks no requieren auth (los webhooks validan firma). - Admin interno: ciertas operaciones administrativas usan API key.
3. snake_case vs. camelCase
Esta es una de las convenciones más importantes y fuente de bugs si se ignora:- Las rutas
/merchant/*usan snake_case en request y response. Un middleware transforma automáticamente:- Request:
snake_case→camelCase(antes de llegar a la lógica). - Response:
camelCase→snake_case(antes de salir).
- Request:
- El resto de las rutas usan camelCase directamente.
4. Formato de respuesta
Comercio (/merchant/*) — formato estándar obligatorio
- La clave envoltorio es siempre
data(nunca el nombre del dominio comospins,coupons,customers). - Los arrays paginados van en
data.items(nuncadata.data). - La paginación usa
totalPages(camelCase interno) → el middleware lo convierte atotal_pagesen la respuesta.
Otras rutas
Siguen el mismo espíritu ({ success, data | error }) pero en camelCase.
5. Errores
El cuerpo de error siempre tiene la forma
{ success: false, error: "..." }. Para
operaciones por lote puede incluir errors: [...].
6. Paginación
- Query params:
page(1-indexado) ylimit. - Las respuestas paginadas de comercio usan la estructura
data.items+data.pagination(ver sección 4).
7. Fechas y zona horaria
- Gastuki opera con calendario de Argentina (ART, UTC−3).
- Los totales mensuales se calculan con límites de mes en ART (tanto en la API HTTP como en MCP devuelven los mismos agregados).
- Los reportes de comercio aceptan rango de fechas con tope de 90 días; si no se especifica, usan los últimos 30 días.
- Los timestamps de respuesta son ISO 8601.
- En MCP, los rangos de período se resuelven en zona local y se devuelve el rango
efectivo en
period: { from, to }(ver MCP).
8. Webhooks
Los webhooks no requieren token Bearer pero validan su autenticidad (firma /
verificación de origen).
Más información
- API interactiva:
/api-docs(Swagger UI). - Esta documentación describe el comportamiento funcional del producto, no su implementación.
