cronly

API Reference

Base URL: https://cronly.eu/api/v1

Authentication

All API requests require an API key. Include it in the Authorization header:

Authorization: Bearer pk_live_xxx.sk_live_yyy

Queue API

The simplest way to execute a webhook immediately. Just POST the URL and it runs right away.

POST /queue

Queue a request for immediate execution. Creates a one-time job and executes it right away.

Request Body

Field Type Description
url string The URL to call (required)
method string HTTP method: GET, POST, PUT, PATCH, DELETE (default: POST)
headers object Custom headers to send (optional)
body string Request body, max 256KB (optional)
name string Display name (auto-generated if omitted)
timeout_ms integer Request timeout in milliseconds (default: 30000)
retry_attempts integer Number of retry attempts on failure (default: 5)
curl -X POST https://cronly.eu/api/v1/queue \
  -H "Authorization: Bearer pk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://myapp.com/api/webhook",
    "method": "POST",
    "headers": {"X-Custom": "value"},
    "body": "{\"event\": \"test\"}"
  }'

Jobs API

Full CRUD operations for managing scheduled jobs.

GET /jobs

List all jobs for your organization.

curl https://cronly.eu/api/v1/jobs \
  -H "Authorization: Bearer pk_live_xxx"
GET /jobs/:id

Get a single job by ID.

curl https://cronly.eu/api/v1/jobs/job_abc123 \
  -H "Authorization: Bearer pk_live_xxx"
POST /jobs

Create a new scheduled job.

Request Body

Field Type Description
name string Display name for this job (required)
url string The URL to call (required)
method string HTTP method: GET, POST, PUT, PATCH, DELETE (default: POST)
schedule_type string "cron" for recurring or "once" for one-time (required)
cron_expression string Cron expression (required if schedule_type is "cron")
scheduled_at string ISO 8601 timestamp (required if schedule_type is "once")
timezone string Timezone for cron jobs (default: UTC)
headers object Custom headers to send (optional)
body string Request body, max 256KB (optional)
timeout_ms integer Request timeout in ms (default: 30000)
retry_attempts integer Retry attempts for one-time jobs (default: 5)
enabled boolean Whether the job is active (default: true)
Recurring Job (cron)
curl -X POST https://cronly.eu/api/v1/jobs \
  -H "Authorization: Bearer pk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Daily backup",
    "url": "https://myapp.com/api/backup",
    "method": "POST",
    "schedule_type": "cron",
    "cron_expression": "0 6 * * *"
  }'
One-time Job
curl -X POST https://cronly.eu/api/v1/jobs \
  -H "Authorization: Bearer pk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Send reminder",
    "url": "https://myapp.com/api/remind",
    "schedule_type": "once",
    "scheduled_at": "2025-02-01T09:00:00Z"
  }'
PUT /jobs/:id

Update a job. Only include the fields you want to change.

curl -X PUT https://cronly.eu/api/v1/jobs/job_abc123 \
  -H "Authorization: Bearer pk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "cron_expression": "0 7 * * *",
    "enabled": false
  }'
DELETE /jobs/:id

Delete a job and all its execution history.

curl -X DELETE https://cronly.eu/api/v1/jobs/job_abc123 \
  -H "Authorization: Bearer pk_live_xxx"
POST /jobs/:id/trigger

Trigger a job to run immediately. Creates a new execution that runs right away.

curl -X POST https://cronly.eu/api/v1/jobs/job_abc123/trigger \
  -H "Authorization: Bearer pk_live_xxx"

Executions

GET /jobs/:id/executions

Get execution history for a job.

Query Parameters

Field Type Description
limit integer Max results to return, 1-100 (default: 50)
# Response
{
  "data": [{
    "id": "exec_123",
    "status": "success",
    "scheduled_for": "2025-01-29T10:00:00Z",
    "started_at": "2025-01-29T10:00:01Z",
    "finished_at": "2025-01-29T10:00:01Z",
    "status_code": 200,
    "duration_ms": 145,
    "attempt": 1
  }]
}

Declarative Sync

Push your entire configuration in one call. Perfect for infrastructure-as-code workflows.

PUT /sync

Sync your entire project configuration. This is idempotent - safe to call repeatedly with the same config.

Request Body

Field Type Description
jobs array Array of job configurations
jobs[].key string Unique key for this job (your identifier)
jobs[].name string Display name for this job
jobs[].url string The URL to call
jobs[].method string HTTP method (default: POST)
jobs[].cron string Cron expression for recurring jobs
jobs[].headers object Custom headers (optional)
jobs[].body string Request body, max 256KB (optional)
delete_removed boolean Delete jobs not in config (default: false)
curl -X PUT https://cronly.eu/api/v1/sync \
  -H "Authorization: Bearer pk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "jobs": [{
      "key": "daily-backup",
      "name": "Daily backup",
      "url": "https://myapp.com/api/backup",
      "cron": "0 6 * * *"
    }],
    "delete_removed": true
  }'

Limits

Limit Value Description
Request body size 256 KB Maximum size of the body field sent to webhooks
Response body storage 256 KB Responses larger than this are truncated in execution history
Request timeout 1s - 5min Configurable per job (default: 30s)
Retry attempts 0 - 10 For one-time jobs only (default: 5)

Errors

The API returns standard HTTP status codes:

Code Meaning
200 Success
201 Created
202 Accepted (for async operations like queue/trigger)
204 No content (successful delete)
400 Bad request - check your parameters
401 Unauthorized - invalid API key
404 Not found
422 Validation error
429 Rate limited - slow down
500 Server error - try again

Error responses include details:

{
  "error": {
    "message": "Invalid cron expression",
    "field": "cron_expression"
  }
}