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
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.
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 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
| run | succeededThe call answered 2xx or the command exited with 0 |
| run | skippedThe previous run of the schedule was still running |
| run | missedThe slot came more than 10 minutes late |
| job | doneRan to its end; exitCode holds the verdict |
| job | failedDid not run to the end; the reason is the last line of output |
| job | timeouttimeoutSec ended it |
Every error is JSON with a sentence and a stable code. Branch on code. See the error catalog.
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
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.
On the same API, the same bill.
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