Códigos de error
| Status | Condición | Body |
|---|
| 400 | Validación de input falló | { "error": "Validation failed", "details": [...] } |
| 401 | Auth requerido, token faltante o incorrecto | { "error": "Unauthorized" } + header WWW-Authenticate: Bearer |
| 404 | Ruta no encontrada | { "error": "Not found", "availableRoutes": [...] }. En modo app(), availableRoutes lista las rutas de todos los tools. |
| 405 | Método no permitido | { "error": "Method not allowed" } |
| 500 | El handler lanzó un error | { "error": "Internal function error" } |
| 504 | El handler excedió el timeout | { "error": "Function timed out" } |
Los errores del handler se registran en los logs pero el mensaje real nunca se expone al cliente.
Cuando un input no pasa la validación Zod, el response 400 incluye un array details con cada campo que falló:
{
"error": "Validation failed",
"details": [
{
"path": ["email"],
"message": "Invalid email",
"code": "invalid_string"
},
{
"path": ["nombre"],
"message": "String must contain at least 1 character(s)",
"code": "too_small"
}
]
}
| Campo | Tipo | Descripción |
|---|
path | string[] | Ruta al campo con error, ej: ["direccion", "ciudad"] |
message | string | Mensaje legible del error |
code | string | Código de error de Zod (ej: invalid_string, too_small, invalid_enum_value) |
Tus respuestas incluyen automáticamente estos headers. No los puedes configurar por función.
| Header | Valor |
|---|
X-Content-Type-Options | nosniff |
X-Frame-Options | DENY |
Referrer-Policy | strict-origin-when-cross-origin |
Strict-Transport-Security | max-age=63072000; includeSubDomains; preload |
Permissions-Policy | camera=(), microphone=(), geolocation=(), payment=() |
Content-Security-Policy | default-src 'none'; frame-ancestors 'none' |
Verificación de cron
Los triggers cron incluyen una firma criptográfica que el runtime verifica automáticamente. Esto previene invocaciones no autorizadas de tus handlers cron.
Límites de despliegue
| Límite | Valor |
|---|
| Archivos por despliegue | 20 |
| Tamaño por archivo | 256 KB |
| Tamaño total del despliegue | 1 MB |
| Tipos de archivo permitidos | .ts, .js, .json, .md, .txt |
| Entrypoint requerido | index.ts |
Límites de runtime
| Límite | Valor |
|---|
| Timeout por defecto | 30 segundos |
| Timeout máximo configurable | Según plan |
| Schedules cron por función | 10 (agregado entre todos los tools en modo app()) |
Extensiones permitidas
Solo se pueden desplegar archivos con estas extensiones:
| Extensión | Uso típico |
|---|
.ts | Código TypeScript (handler, helpers) |
.js | Código JavaScript |
.json | Configuración (jelou.json, deno.json, datos) |
.md | Documentación |
.txt | Archivos de texto |
Se excluyen automáticamente: node_modules/, .git/, .env, dist/, .jelou/ y archivos ocultos.