Developer API

CronWizard HTTP API Reference

Generate, validate, preview, and export cron schedules through the same JSON endpoints used by the web application. The API is public, requires no authentication, and usesapplication/json for request and response bodies.

Published and reviewed . Source repository identity: Mehmet Uşanmaz (repository owner).

Base URL

https://cronwizard.com

All cron operations use POST. Send a valid JSON body and a Content-Type: application/json header. The health endpoint uses GET.

Endpoints

POST/api/v1/cron/generate

Generate a cron expression

Build a Unix or Quartz expression from a supported wizard mode and parameters.

curl -X POST 'https://cronwizard.com/api/v1/cron/generate' \
  -H 'Content-Type: application/json' \
  -d '{"mode":"daily","params":{"at":{"hour":9,"minute":0}},"format":"unix"}'
Example response
{
  "cron": "0 9 * * *",
  "description": "At 09:00",
  "warnings": [],
  "normalized": {
    "unix": "0 9 * * *",
    "quartz": "0 0 9 * * ?"
  }
}
POST/api/v1/cron/next

Calculate upcoming run times

Return the next 1–50 matching run times in an IANA timezone.

curl -X POST 'https://cronwizard.com/api/v1/cron/next' \
  -H 'Content-Type: application/json' \
  -d '{"cron":"0 9 * * 1-5","format":"unix","timezone":"Europe/Istanbul","count":5}'
POST/api/v1/cron/validate

Validate a cron expression

Validate a Unix or supported Quartz cron expression. The Unix normalization is null when a valid Quartz schedule has no lossless 5-field equivalent.

curl -X POST 'https://cronwizard.com/api/v1/cron/validate' \
  -H 'Content-Type: application/json' \
  -d '{"cron":"*/15 * * * *","format":"unix"}'
Example response
{
  "valid": true,
  "errors": [],
  "normalized": "*/15 * * * *"
}
POST/api/v1/cron/export

Export a scheduler configuration

Render a schedule for Kubernetes, GitHub Actions, systemd, Docker, AWS EventBridge Scheduler Terraform, crontab, or launchd. Export requires a lossless 5-field Unix equivalent.

curl -X POST 'https://cronwizard.com/api/v1/cron/export' \
  -H 'Content-Type: application/json' \
  -d '{"cron":"0 9 * * 1-5","format":"unix","target":"k8s","options":{"name":"weekday-job","image":"busybox:latest","command":"echo hello","timezone":"Europe/Istanbul"}}'
Example response
{
  "text": "apiVersion: batch/v1\nkind: CronJob\n..."
}
GET/api/healthz

Check service health

Return the health state and current server timestamp.

curl 'https://cronwizard.com/api/healthz'
Example response
{
  "status": "ok",
  "timestamp": "2026-08-05T09:00:00.000Z"
}

Request fields

OperationRequired fieldsOptional fields and limits
generatemode, params, formatModes: minutes, hourly, daily, weekly, monthly, yearly, and advanced.
nextcron, format, timezone, countcount is 1–50. timezone is an IANA name. startDate is an optional ISO 8601 date-time.
validatecron, formatInvalid syntax is represented by valid: false. A valid Quartz expression can have normalized: null.
exportcron, format, targetHTTP API targets: k8s, gha, systemd, docker, terraform, crontab, or launchd. Options: name, image, command, description, and an IANA timezone. Kubernetes, GitHub Actions, systemd, Ofelia, and AWS EventBridge Scheduler embed the timezone. Portable crontab and launchd cannot; omit that option and configure the daemon or host timezone explicitly. Every target requires a lossless 5-field Unix equivalent, and a target can reject additional constructs it cannot encode without changing the schedule.

Generate parameter constraints

  • every: one of 1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30. These values divide a 60-minute hour evenly.
  • at.hour: integer from 0 through 23.
  • at.minute: integer from 0 through 59.
  • days: array of integers from 0 through 6.
  • month: integer from 1 through 12.
  • dayOfMonth: integer from 1 through 31.
  • expression: expression used by advanced mode.

The format field accepts unix or quartz. Generated responses contain a normalized object whose unix and quartz keys are always present but may be null when no lossless equivalent exists.

Quartz support and lossless normalization

Quartz validation and next-run calculation support 6- or 7-field expressions. Exactly one of day-of-month or day-of-week must be ?. Seconds, optional year values from 1970 through 2099, L, and day-of-week # are supported. The nearest-weekday W and hashed/random H extensions are not.

Validity does not guarantee cross-dialect portability. A Quartz expression has no lossless Unix equivalent when it uses nonzero seconds, a restricted year, or day-of-month L, weekday nL, or # syntax. A bare weekday L means Saturday and can be converted exactly. For example, validating 30 0 9 ? * MON as Quartz returns:

{
  "valid": true,
  "errors": [],
  "normalized": null
}

The inverse limitation also applies: a Unix expression that restricts both day-of-month and day-of-week uses Unix OR semantics, which cannot be represented losslessly in Quartz. Its normalized.quartz value is null.

Errors

Invalid request shapes and invalid cron values return HTTP 400 where applicable. Unexpected processing failures return HTTP 500. Error bodies use this shape:

{
  "code": "VALIDATION_ERROR",
  "message": "Invalid input",
  "details": []
}

The validation endpoint is intentionally different: a well-formed request containing an invalid cron expression returns HTTP 200 with valid: false and an errors array.

Export accepts only schedules with a lossless 5-field Unix equivalent. A valid but non-portable Quartz schedule returns HTTP 400 with this explicit error:

{
  "code": "UNSUPPORTED_EXPORT_FORMAT",
  "message": "This expression has no lossless 5-field Unix equivalent and cannot be exported to this target."
}

Machine-readable contract

The canonical OpenAPI 3.1 document is available at /openapi.json. Use it to generate clients or import the API into tools that understand OpenAPI. The document lists only targets and fields accepted by the deployed HTTP route schemas.