Schedule cron jobs from your own code.
Create, update, and monitor schedules with a REST API or the official TypeScript SDK. Everything you can do in the dashboard, you can do in code.
Create a schedule in one request.
Every schedule you create in the dashboard is backed by this same API. Pick your language.
curl -X POST "https://cronho.st/api/v1/schedules" \
-H "x-api-key: $CRONHOST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Daily health check",
"endpoint": "https://api.example.com/health",
"httpMethod": "GET",
"cronExpression": "*/5 * * * *",
"timezone": "UTC"
}'curl -X POST "https://cronho.st/api/v1/schedules" \
-H "x-api-key: $CRONHOST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Daily health check",
"endpoint": "https://api.example.com/health",
"httpMethod": "GET",
"cronExpression": "*/5 * * * *",
"timezone": "UTC"
}'Everything the dashboard does, in code.
The REST API and SDK are the same interface the dashboard uses internally.
Any cron expression
Standard 5-field cron syntax, evaluated in the timezone you choose.
Any HTTP endpoint
GET, POST, PUT, PATCH, or DELETE with custom headers and a JSON body.
Automatic retries
Configurable retry count and timeout per schedule, with exponential backoff.
API-key auth
Every request is scoped to your account with a single x-api-key header.
Manual triggers
Fire a schedule on demand from the API, outside its normal cadence.
Bulk create
Create up to 1,000 schedules in a single request when migrating.
Built for real workflows.
A few of the ways developers use the API today.
API health monitoring
Ping a critical endpoint on a fixed interval and get alerted the moment it stops responding.
const healthCheck = await cronhost.createSchedule({
name: "API monitor",
cronExpression: "*/5 * * * *",
endpoint: "https://api.example.com/health",
httpMethod: "GET",
maxRetries: 2,
});const healthCheck = await cronhost.createSchedule({
name: "API monitor",
cronExpression: "*/5 * * * *",
endpoint: "https://api.example.com/health",
httpMethod: "GET",
maxRetries: 2,
});Webhook automation
Fire a webhook to Slack, Discord, or your own service on a recurring schedule.
const weeklyReport = await cronhost.createSchedule({
name: "Weekly report",
cronExpression: "0 9 * * 1", // Mondays at 9am
endpoint: "https://hooks.slack.com/services/...",
httpMethod: "POST",
body: JSON.stringify({ text: "Weekly report is ready." }),
});const weeklyReport = await cronhost.createSchedule({
name: "Weekly report",
cronExpression: "0 9 * * 1", // Mondays at 9am
endpoint: "https://hooks.slack.com/services/...",
httpMethod: "POST",
body: JSON.stringify({ text: "Weekly report is ready." }),
});Scheduled backups
Trigger a backup job on your own infra with a generous timeout for long-running work.
const backup = await cronhost.createSchedule({
name: "Database backup",
cronExpression: "0 2 * * *",
endpoint: "https://api.example.com/backups/run",
httpMethod: "POST",
timeoutSeconds: 300,
});const backup = await cronhost.createSchedule({
name: "Database backup",
cronExpression: "0 2 * * *",
endpoint: "https://api.example.com/backups/run",
httpMethod: "POST",
timeoutSeconds: 300,
});Bulk migration
Already running cron somewhere else? Create up to 1,000 schedules in one call.
const result = await cronhost.createSchedule([
{
name: "Job A",
cronExpression: "0 * * * *",
endpoint: "https://api.example.com/a",
httpMethod: "GET",
},
{
name: "Job B",
cronExpression: "0 0 * * *",
endpoint: "https://api.example.com/b",
httpMethod: "POST",
},
// up to 1,000 per request
]);const result = await cronhost.createSchedule([
{
name: "Job A",
cronExpression: "0 * * * *",
endpoint: "https://api.example.com/a",
httpMethod: "GET",
},
{
name: "Job B",
cronExpression: "0 0 * * *",
endpoint: "https://api.example.com/b",
httpMethod: "POST",
},
// up to 1,000 per request
]);Never wonder if your cron job ran.
Create your first schedule in minutes. See every run, every response, and every failure from one place.