Cron and jobs

Run something on a schedule. Keep every result.

Call a path of your app on a cron expression, signed so the app can verify it and waking it if it sleeps. Or run a command on a machine of its own, built from the app's image and secrets. A job is that machine once, with its exit code and output kept.

ry cron add web "*/15 * * * *" --path /api/tick
web, schedulesEurope/Berlin */15 * * * * POST /api/tick 0 3 * * * npm run cleanupown machine 0006121824 runssigned, HMAC-SHA256 03:00commandsucceeded 02:45pathsucceeded 02:30pathskipped 02:15pathsucceeded
A day of schedules: a signed path call every 15 minutes, a command on its own machine at 03:00, and the run log.
1 minshortest interval for a path
1 hourshortest interval for a command
20schedules per app
100runs kept per schedule
What it does

Cron and jobs, in detail.

Call a path

For frequent, light work the app does itself, down to every minute. The call goes through the app's address and wakes it. GET or POST, up to 240 seconds per attempt.

Signed calls

Every call carries Rytiv-Cron-Signature, an HMAC-SHA256 of timestamp and path under the app's secret RYTIV_CRON_SECRET, so the app can tell a genuine call from anyone else.

Run a command

For heavy, rare work: at most hourly, on a machine of its own with the app's image, secrets and environment, sized as you say, up to an hour per run.

In your time zone

Five fields or @hourly, @daily and the like, read in the IANA time zone you name. UTC by default.

No pile-ups

A slot that comes while the previous run still runs is skipped, not queued. A path call gets up to three attempts on a network error or a 5xx.

Jobs: once, with the result

One command on a throwaway machine with the app's image. Green means done with exit code 0. Up to 1 MiB of output is kept: the start and the end.

CLI, API

A schedule, a command, a job.

From the CLI or the API. ry job run streams the output and exits with the command's code.

ry cron add web "*/15 * * * *" --path /api/tick
ry cron add web "0 3 * * *" --timezone Europe/Berlin \
  --command "npm run cleanup" --memory 8192
ry cron list web
ry cron runs web cron_1a2b3c4d5e6f
ry cron run web cron_1a2b3c4d5e6f          # now, outside the expression

ry job run web -- npm run migrate      # exits with the command's code
ry job list web
curl -X POST https://api.rytiv.com/v1/apps/web/schedules \
  -H "Authorization: Bearer $RYTIV_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"schedule": "*/15 * * * *", "path": "/api/tick", "method": "POST"}'

curl -X POST https://api.rytiv.com/v1/apps/web/jobs \
  -H "Authorization: Bearer $RYTIV_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"command": ["npm", "run", "migrate"], "timeoutSec": 900}'
# 202 queued; poll GET /v1/jobs/:id until done, failed or timeout
Limits, errors and price

The bounds, as the platform enforces them.

Limits

Schedules per app
20
Path call
down to every minute; 60 s default, 240 s at most
Command
at most hourly; 900 s default, 3600 s at most
Attempts of a path call
up to 3, 5 s and then 10 s apart
Late slot
more than 10 minutes late counts as missed
Runs kept
100 per schedule
Job timeout
1 to 3600 s, default 900
Job output kept
1 MiB

Every bound is on Limits and quotas. A request outside them answers 400 with bad-request and names the field.

States of a run and a job

runsucceededThe call answered 2xx or the command exited with 0
runskippedThe previous run of the schedule was still running
runmissedThe slot came more than 10 minutes late
jobdoneRan to its end; exitCode holds the verdict
jobfailedDid not run to the end; the reason is the last line of output
jobtimeouttimeoutSec ended it

Every error is JSON with a sentence and a stable code. Branch on code. See the error catalog.

€0.0076per GB-hourMemory
€0.035per vCPU-hourCPU

A path call runs in your app's own machine. A command or a job runs on a machine of its own for as long as it runs, billed like any machine.

For businesses and freelancers. All prices excluding VAT. Prepaid credit in euros, no plans, no seats. Introductory pricing until 31 January 2027. Pricing

Questions

What developers ask about Cron and jobs.

Answers from the documentation. The Cron and jobs guide has the rest.

Path or command?

A path for frequent, light work your app does itself, down to every minute. A command for heavy, rare work, at most hourly, on a machine of its own with its own size.

How does my app know a call is genuine?

Check Rytiv-Cron-Signature: v1= and the hex HMAC-SHA256 of <timestamp>.<path> under RYTIV_CRON_SECRET. The secret is created with the app's first path schedule; the app sees it from its next deploy.

What if a run takes longer than the interval?

The next slot is skipped, not queued. Nothing piles up.

What happens when I resume a paused schedule?

It continues from the next slot. ry cron run starts a run now, also on a paused schedule.

When is a job green?

When state is done and exitCode is 0. A failing command is done with a non-zero code; failed means it did not run to the end.

Can a job reach my other apps?

In the API, links names up to 8 apps the job's machine may reach. env adds environment for this job, build runs a specific build of the app.

Schedule something.

Deploy an app, then add a schedule in one line.

claude mcp add --transport http rytiv https://api.rytiv.com/v1/mcp --header "Authorization: Bearer <your key>"

For businesses and freelancers, from a solo developer to a team. Pricing