Scheduling
Cron Schedule & Runtime Guard
Inspect strict five-field UNIX cron expressions, return bounded prior or future reference runs, summarize windows, compare schedules, and apply explicit runtime policy with IANA timezone evidence.
CONTRACT
Predictable for agents. Legible for reviewers.
- REST
POST /v1/cron-schedules/policy-check- MCP tool
check_cron_schedule_policy- Inputs
- One strict numeric UNIX_5_FIELD expression, a separate IANA timezone, offset-aware reference or half-open window times, and optional caller run-budget, minimum-gap, local-hour, weekday, and offset-change policy.
- Returns
- CLEAR, REVIEW_REQUIRED, or BLOCKED with normalized fields, bounded local and UTC occurrences, exact gaps, UTC-offset changes, schedule differences, stable findings, and a non-executing next action.
- Latency
- Synchronous
- Usage unit
- Cron schedule operation
The suite also exposes /v1/cron-schedules/inspect, /next-runs, /previous-runs, /window-summary, and /compare plus /mcp/cron. Version one intentionally rejects names, aliases, embedded TZ/CRON_TZ, seconds, year, ?, L, W, #, H, and provider-specific extensions. It creates no job, invokes no target, accesses no scheduler, predicts no delivery guarantee, and stores no payload. Its RapidAPI release is queued behind the provider's twenty-public-API cap.
AGENT-READABLE EXCEPTIONS
CRON_DIALECT_MISMATCHCRON_UNSUPPORTED_SYNTAXCRON_FIELD_OUT_OF_RANGECRON_DAY_FIELDS_USE_ORCRON_TIMEZONE_UNKNOWNCRON_OCCURRENCE_HORIZON_EXCEEDEDCRON_OCCURRENCE_LIMIT_EXCEEDEDCRON_TIMEZONE_OFFSET_CHANGEDCRON_SCHEDULES_DIVERGECRON_RUN_BUDGET_EXCEEDEDCRON_MINIMUM_GAP_VIOLATEDCRON_LOCAL_HOUR_NOT_ALLOWEDCRON_LOCAL_WEEKDAY_NOT_ALLOWEDCRON_OFFSET_CHANGE_BLOCKEDPOST /v1/cron-schedules/policy-check
Authorization: Bearer apc_...
Content-Type: application/json
{
"schedule": {
"expression": "0 9 * * 1-5",
"timezone": "America/Denver",
"dialect": "UNIX_5_FIELD"
},
"window_start": "2026-08-10T00:00:00Z",
"window_end": "2026-08-20T00:00:00Z",
"maximum_occurrences": 100,
"minimum_gap_minutes": 60,
"maximum_runs_in_window": 10,
"allowed_local_hours": [
9
],
"allowed_local_weekdays": [
0,
1,
2,
3,
4
],
"block_timezone_offset_changes": true
}curl --request POST \
--url 'https://api-production-9502.up.railway.app/v1/cron-schedules/policy-check' \
--header 'Authorization: Bearer ${AP_CONTROL_API_KEY}' \
--header 'Content-Type: application/json' \
--data '{
"schedule": {
"expression": "0 9 * * 1-5",
"timezone": "America/Denver",
"dialect": "UNIX_5_FIELD"
},
"window_start": "2026-08-10T00:00:00Z",
"window_end": "2026-08-20T00:00:00Z",
"maximum_occurrences": 100,
"minimum_gap_minutes": 60,
"maximum_runs_in_window": 10,
"allowed_local_hours": [
9
],
"allowed_local_weekdays": [
0,
1,
2,
3,
4
],
"block_timezone_offset_changes": true
}'{
"status": "COMPLETED",
"decision": "CLEAR",
"normalized_expression": "0 9 * * 1-5",
"timezone": "America/Denver",
"window_start": "2026-08-09T18:00:00-06:00",
"window_end": "2026-08-19T18:00:00-06:00",
"occurrence_count": 8,
"first_occurrence": {
"local_time": "2026-08-10T09:00:00-06:00",
"utc_time": "2026-08-10T15:00:00Z",
"utc_offset": "-06:00",
"fold": 0
},
"last_occurrence": {
"local_time": "2026-08-19T09:00:00-06:00",
"utc_time": "2026-08-19T15:00:00Z",
"utc_offset": "-06:00",
"fold": 0
},
"minimum_gap_seconds": 86400,
"maximum_gap_seconds": 259200,
"offset_change_count": 0,
"truncated": false,
"findings": [],
"allowed_by_policy": true,
"evaluated_policy": {
"minimum_gap_minutes": 60,
"maximum_runs_in_window": 10,
"allowed_local_hours": [
9
],
"allowed_local_weekdays": [
0,
1,
2,
3,
4
],
"block_timezone_offset_changes": true
},
"ruleset_version": "UNIX_5_FIELD_REFERENCE_2026",
"scope": "CALLER_SUPPLIED_CRON_FACTS_ONLY",
"scheduler_accessed": false,
"job_created": false,
"target_invoked": false,
"delivery_guaranteed": false,
"payload_stored": false,
"next_action": "Verify the target platform preview, permissions, concurrency, misfire, retry, and idempotency settings before deployment."
}Try Cron Schedule & Runtime Guard with your own workflow.
Start with the workspace, inspect the typed result, then integrate with REST or the focused MCP server.