Skip to main content
Schedules invoke functions on a recurring cron expression. pg_cron fires an HTTP request to the function URL at each tick and logs the result.

Concepts

A schedule is a cron expression, a target URL, and headers. On creation, ${{secrets.KEY}} placeholders in headers are resolved and encrypted with pgcrypto. At each tick, execute_job() decrypts headers, calls the function, and writes status and duration to schedules.job_logs.

Usage

Standard 5-field cron (no seconds). Reference secrets in headers instead of hardcoding keys.
Create via dashboard or SQL:

Limits

Minimum interval is 1 minute (pg_cron). Failed runs are logged but not retried, so the function must be idempotent. Deleting a referenced secret breaks every job using it until you update or disable the schedule.

Long-interval callers and keep-alive

The backend closes idle HTTP connections after 65 seconds by default (configurable with KEEP_ALIVE_TIMEOUT_MS). A job that fires less often than that — every 5 minutes, for example — always finds a reused keep-alive socket already closed on the server side. This can stall the first request in a warm function for ~30 seconds. When a scheduled function calls other APIs, you have two options. Set a short client timeout (well under 30 seconds) and retry once on a fresh connection. Or disable connection reuse by sending Connection: close so every tick opens a fresh socket.

More resources