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.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 withKEEP_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
- pg_cron docs for cron syntax.
- Functions overview for the runtime.
- crontab.guru to check an expression.