Cron-as-a-service. Hoody Cron wraps the system crontab in a REST API with managed entries, enable/disable toggles, auto-expiration, and per-user isolation. Standard 5-field cron expressions plus macros like @hourly and @daily.
What You Can Do
Section titled “What You Can Do”- Managed Entries - Create, update, delete cron jobs via JSON API with UUIDs
- Enable/Disable - Toggle jobs on and off without deleting them
- Auto-Expiration - Set
expires_atfor temporary jobs that clean themselves up - Per-User Isolation - Each system user has their own crontab
- Raw Crontab - Read and write the full crontab file directly
- Standard Cron - 5-field expressions (
* * * * *) plus macros (@hourly,@daily,@weekly,@monthly,@yearly) - Comments & Metadata - Attach human-readable comments to managed entries
API Endpoints Summary
Section titled “API Endpoints Summary”All endpoints accessed relative to your Cron service URL:
https://PROJECT_ID-CONTAINER_ID-cron-1.SERVER.containers.hoody.icuManaged Entries:
GET /users/{user}/entries- List managed entries for a userPOST /users/{user}/entries- Create a new managed entryGET /users/{user}/entries/{id}- Get a specific entryPATCH /users/{user}/entries/{id}- Update an entryDELETE /users/{user}/entries/{id}- Delete an entry
Raw Crontab:
GET /crontab- List all user crontabsGET /users/{user}/crontab- Get raw crontab for a userPUT /users/{user}/crontab- Replace raw crontab for a user
System:
GET /health- Health check
Quick Start: Create a Scheduled Job
Section titled “Quick Start: Create a Scheduled Job”# Create a cron job that runs daily at 9 AMhoody cron entries create root \ --schedule "0 9 * * *" \ --command "/usr/local/bin/backup.sh" \ --comment "Daily backup at 9 AM"
# List all cron entrieshoody cron entries list root
# Update a job's schedulehoody cron entries update root $ENTRY_ID \ --schedule "0 12 * * *"
# View the raw crontabhoody cron crontabs get rootimport { HoodyClient } from '@hoody-ai/hoody-sdk';
const client = new HoodyClient({ baseURL: 'https://api.hoody.icu', token: process.env.HOODY_TOKEN });const containerClient = await client.withContainer({ id: CONTAINER_ID, project_id: PROJECT_ID, server: SERVER });
// Create a daily cron jobconst entry = await containerClient.cron.entries.create('root', { schedule: '0 9 * * *', command: '/usr/local/bin/backup.sh', comment: 'Daily backup at 9 AM', enabled: true,});
// List all entriesconst entries = await containerClient.cron.entries.list('root');
// Disable temporarilyawait containerClient.cron.entries.update('root', entryId, { enabled: false,});# Create a daily cron jobcurl -X POST "https://PROJECT-CONTAINER-cron-1.SERVER.containers.hoody.icu/users/root/entries" \ -H "Content-Type: application/json" \ -d '{ "schedule": "0 9 * * *", "command": "/usr/local/bin/backup.sh", "comment": "Daily backup at 9 AM", "enabled": true }'
# List all entriescurl "https://PROJECT-CONTAINER-cron-1.SERVER.containers.hoody.icu/users/root/entries"
# Disable a jobcurl -X PATCH "https://PROJECT-CONTAINER-cron-1.SERVER.containers.hoody.icu/users/root/entries/$ENTRY_ID" \ -H "Content-Type: application/json" \ -d '{"enabled": false}'1. Create a managed cron entry:
POST Create a cron job that runs every day at 9 AM
/users/root/entries
Click "Run" to execute the request
2. List all managed entries:
GET List all cron entries for root user
/users/root/entries
Click "Run" to execute the request
3. Disable a job temporarily:
PATCH Disable a cron entry without deleting it
/users/root/entries/{id}
Click "Run" to execute the request
Cron Schedule Reference
Section titled “Cron Schedule Reference”Standard 5-field cron expressions:
┌───────────── minute (0-59)│ ┌───────────── hour (0-23)│ │ ┌───────────── day of month (1-31)│ │ │ ┌───────────── month (1-12)│ │ │ │ ┌───────────── day of week (0-6, Sun=0)│ │ │ │ │* * * * *Common patterns:
| Schedule | Expression |
|---|---|
| Every minute | * * * * * |
| Every hour | 0 * * * * |
| Every day at midnight | 0 0 * * * |
| Weekdays at 9 AM | 0 9 * * 1-5 |
| Every Sunday at 3 AM | 0 3 * * 0 |
| First day of month | 0 0 1 * * |
Macros: @yearly, @monthly, @weekly, @daily, @hourly
Auto-Expiration
Section titled “Auto-Expiration”Set expires_at on managed entries for temporary jobs that automatically remove themselves:
POST Create a temporary monitoring job that expires in 24 hours
/users/root/entries
Click "Run" to execute the request
Raw Crontab Access
Section titled “Raw Crontab Access”For full control, read and write the raw crontab directly:
Read the current crontab:
GET Get the raw crontab for root
/users/root/crontab
Click "Run" to execute the request
Replace the entire crontab:
PUT Replace the raw crontab for root
/users/root/crontab
Click "Run" to execute the request
Use Cases
Section titled “Use Cases”- Scheduled backups - Run backup scripts at regular intervals
- Data processing - ETL jobs, report generation, log rotation
- Health monitoring - Periodic health checks with auto-expiring entries
- Temporary tasks - Time-limited monitoring or data collection
- Maintenance - Cache cleanup, database optimization, certificate renewal
What’s Next
Section titled “What’s Next”- Cron API Reference - Complete API documentation
- Managed Entries API - CRUD operations for managed entries
- Raw Crontab API - Direct crontab file access
- Daemons - For always-running processes (vs scheduled tasks)
- Exec - Execute scripts as HTTP endpoints