Tus endpoints, llamados
según el plan.

Llamamos a tu endpoint según el plan; tú te centras en el handler. Un constructor de peticiones real — no solo un campo de URL — con reintentos, control de timeout y un registro de ejecución completo para cada run.

Plan gratuito — sin tarjeta de crédito.

Sin SteadyCron

# /etc/cron.d/invoices
0 9 * * 1-5 deploy /app/send_invoices.sh

# Exit code: unknown.
# Retries: none.
# Logs: rotated.
# Did it run? Check manually.

Con SteadyCron

Jun 13 09:00 SUCCESS 312ms HTTP 200
Jun 12 09:00 FAILURE 5 014ms HTTP 503
RETRY 1/3 reintentando en 30s…
Jun 12 09:00 SUCCESS 289ms HTTP 200

✓ recuperado tras 1 reintento — alertado en el fallo, resuelto en la recuperación

El cron del sistema es una mentira que has aceptado

Dispara y olvida. Sin reintentos. Sin timeouts. Sin registro de auditoría. Sin alertas cuando el script falla, supera el tiempo límite o deja de ejecutarse del todo.

Fallos silenciosos

Tu cron se dispara, tu script falla, nadie se entera. El backup de DB que lleva seis semanas sin ejecutarse. El informe que está vacío desde el deploy.

exit 1 # ← zero alerts

Sin reintentos ni timeouts

Un fallo de red transitorio falla el job permanentemente. O un job se queda colgado indefinidamente, ocupando un slot de cron mientras la memoria del servidor sube.

SIGKILL? never heard of it

Sintaxis cron horrible

Cada equipo tiene un README con una leyenda para explicar qué significa 0 4 * * 1. Luego alguien lo edita mal y el job se ejecuta cada minuto a las 4 AM.

0 4 * * 1 # ???

Sin registro de auditoría

"¿Ejecutó el job de facturas el martes pasado?" Compruebas los logs. No hay logs. cron.log fue rotado hace seis días.

grep -i invoice /var/log/cron.log

Defínelo una vez. Funciona siempre.

Sin ningún daemon cron que vigilar. Sin rotación de logs de la que preocuparse. SteadyCron gestiona la ejecución — de principio a fin.

01

Definir el job

Configura la URL, el método, las cabeceras, el cuerpo, el horario y la zona horaria en dos minutos. Añade reintentos, un timeout y variables de plantilla. O decláralo como código y aplícalo desde CI.

POST /v1/invoices/send 0 9 * * 1-5 Europe/Berlin
02

Enviamos la petición

A la hora programada, SteadyCron envía la petición HTTP con tus cabeceras y cuerpo exactos. El cambio de hora se gestiona correctamente. Si el código de respuesta activa un reintento, lo hacemos con backoff exponencial.

POST → 200 OK 312ms attempt 1/1
03

Inspeccionar cada ejecución

Cada run se registra: estado de respuesta, cuerpo, cabeceras, duración y número de intento. Un run que falló y se recuperó en un reintento tiene un aspecto diferente al que agotó todos los intentos.

→ success attempt 2/3 847ms total

Un constructor de peticiones real,
no solo un campo de URL

Empieza con un nombre, una URL y un horario. Elige expresión cron o intervalo — una vista previa en directo de los próximos runs te muestra los tiempos de ejecución exactos antes de guardar, sin sorpresas a las 3 AM.

Elige cualquier método HTTP. Añade cabeceras de petición — Authorization, Content-Type, o lo que necesite tu endpoint. Adjunta un cuerpo JSON para jobs POST y PUT, con resaltado de sintaxis en directo y validación que detecta payloads malformados antes de que se envíen.

Para los casos avanzados: introduce variables {{template}} en cualquier lugar de la URL, las cabeceras o el cuerpo. Se resuelven en el servidor en el momento de la ejecución y nunca se almacenan en tus scripts — útil para tokens de API, IDs de cuenta, o cualquier valor que varía entre entornos. La programación por zona horaria a nivel de job significa que "días laborables a las 09:00 Berlin" se ejecuta a las 09:00 en Berlín, incluso en los cambios de hora.

app.steadycron.com/jobs/new
invoice-send

Request

Configure the HTTP request sent on each execution. Use {{variable}} for template substitution.

POST
{{baseUrl}}/v1/invoices/{{invoiceId}}/send
Send
Params Headers 1 Body

Headers

Authorization Bearer {{apiToken}}
Body raw · JSON
{
  "account_id": "{{accountId}}",
  "amount_cents": 4900,
  "send_email": true
}

Valid JSON

Schedule

When it runs — cron or interval, with DST-correct timezones and a live next-runs preview.

Cron Interval

Cron expression

0 9 * * 1-5

Weekdays at 09:00

Timezone

Europe/Berlin

Next runs

Mon 09:00Tue 09:00Wed 09:00Thu 09:00
timeout 30sretries 3skip if still running

Cuatro posibles resultados de una ejecución

Cada resultado es distinto, registrado y visible en el dashboard con su propio color y etiqueta.

invoice-send SUCCESS

Éxito

El endpoint devolvió una respuesta 2xx dentro del timeout configurado. Ejecución completada, respuesta completa registrada.

Estado HTTP 200 OK
Duración 312ms
Intento 1 / 1
report-export FAILURE

Fallo

El endpoint devolvió un estado no-2xx en todos los intentos, o la conexión falló. Cada intento es una entrada de registro separada.

Estado HTTP 503
Intentos 3 / 3
Tiempo total 95s
data-sync TIMEOUT

Timeout

El endpoint no respondió dentro del timeout por job. La petición se cancela limpiamente — sin conexiones zombie.

Timeout después de 30s
Estado HTTP
Tipo de error request_timeout
slow-etl SKIPPED

Omitido

El run anterior aún estaba en progreso cuando este disparo era debido. El guard de solapamiento evitó una ejecución concurrente.

Motivo still_running
Run anterior en progreso
Alertado no

Diseñado para jobs que no deben fallar en silencio

Los controles que de otro modo implementarías manualmente alrededor del cron del sistema son aquí configuración de primer nivel.

Reintentos con backoff exponencial

Configura hasta 5 reintentos con backoff exponencial. Elige exactamente qué códigos de estado HTTP activan un reintento — para que un 404 siga siendo un fallo definitivo pero un 503 tenga otra oportunidad.

retry_on: [429, 503, 502]
max_retries: 3 backoff: 30s

Control de timeout por job

Si tu endpoint se bloquea — consulta DB lenta, API upstream degradada — SteadyCron cancela la petición tras el timeout configurado. Sin conexiones zombie, sin fugas de recursos silenciosas.

timeout_seconds: 30
# error_kind: request_timeout

Guard de solapamiento

Si el run anterior no ha terminado cuando el próximo disparo es debido, omitimos el nuevo run en lugar de apilar peticiones concurrentes contra tu endpoint. Evita fallos en cascada en jobs lentos.

skip_if_still_running: true
# status: skipped

Cada run, registrado por completo

Estado de respuesta, cuerpo, cabeceras, duración y número de intento — almacenados para cada ejecución. Nunca más preguntar "¿ejecutó el job de facturas el martes pasado?" y obtener un encogimiento de hombros.

Los runs fallidos que se recuperaron en un reintento tienen un aspecto diferente a los que agotaron todos los intentos. Cada intento es su propia entrada de registro con su propio timing y código de estado, para que puedas ver exactamente dónde salieron mal las cosas.

invoice-send · registro de ejecución

Jun 13 09:00 SUCCESS 200 312ms 1/1
Jun 12 09:00 SUCCESS 200 284ms 1/1
Jun 11 09:00 FAILURE 503 95 341ms 3/3
Jun 10 09:00 SUCCESS 200 401ms 1/1
Jun 09 09:00 SKIPPED

Ejecución HTTP

Estás aquí

Llama a tus endpoints según el horario — reintentos, tiempos de espera y logs completos.

Monitorización heartbeat

Vigila los jobs que ejecutas donde sea; recibe alerta en cuanto uno se silencia.

Cron as code

Define cada job, monitor y alerta en YAML o Terraform.

Deja de preguntarte si tu job se ejecutó.

Define el job una vez. Nosotros gestionamos la ejecución, los reintentos, los timeouts y el registro de auditoría. Tú gestionas el handler.

  • Plan gratuito — sin tarjeta de crédito
  • Alojado en la UE, RGPD nativo
  • 5 HTTP jobs en el plan gratuito