Formato de respuestas y errores
Respuestas de éxito
Sección titulada «Respuestas de éxito»Las lambdas usan los helpers compartidos del layer (shared/response.py). El shape típico:
// Con datos{ "data": { ... } }
// Con mensaje y datos{ "message": "Team created successfully", "data": { ... } }
// Operación sin payload de retorno{ "success": true }Códigos: 200 (lectura/actualización), 201 (creación), 204 no se usa — las eliminaciones devuelven 200 con mensaje.
Respuestas de error
Sección titulada «Respuestas de error»{ "error": "Validation failed", "details": { "field": "email", "message": "Invalid email format" }}error— mensaje legible (a veces funciona como código, ver catálogo).details— opcional; en errores de validación Pydantic trae la lista de campos inválidos.
Códigos HTTP
Sección titulada «Códigos HTTP»| Código | Cuándo |
|---|---|
400 |
Body/params inválidos (validación) |
401 |
Token faltante, inválido o expirado (lo emite API Gateway, no la Lambda) |
402 |
Límite del plan alcanzado (ver TRIPS_LIMIT_REACHED) |
403 |
Autenticado pero sin permiso: no es miembro del equipo o su rol no alcanza |
404 |
Recurso inexistente o soft-deleted |
409 |
Conflicto de estado (p. ej. transición de status inválida, condición de carrera) |
500 |
Error no controlado — revisar CloudWatch |
Catálogo de códigos de negocio
Sección titulada «Catálogo de códigos de negocio»Códigos estables que el frontend interpreta (en error):
| Código | HTTP | Significado |
|---|---|---|
TRIPS_LIMIT_REACHED |
402 | El equipo agotó los viajes de su plan Stripe; el frontend muestra upsell de packs/upgrade |
Token Expired |
401 | JWT expirado (gateway response de API Gateway) |
Unauthorized |
401 | Sin token o token inválido (gateway response) |
Access Denied |
403 | Rechazado por el authorizer |
Errores que no llegan a Lambda
Sección titulada «Errores que no llegan a Lambda»401/403 del authorizer y 429 de throttling los genera API Gateway directamente (gateway responses). Traen headers CORS correctos, pero su body tiene shape propio: {"error": "...", "message": "..."}.