XnoleXDocs

Continuous Monitoring

Scheduled scans use cron expressions to automatically run scans at regular intervals. Configure a schedule once and XnoleX will scan your target on the defined frequency.

Cron Expressions

Schedules use standard 5-field cron expressions:

Cron format
minute  hour  day  month  weekday

Examples:
0 * * * *       Every hour (at minute 0)
0 0 * * *       Every day at midnight
0 0 * * 1       Every Monday at midnight
0 0 1 * *       First day of every month

Supported syntax in each field:

Specific values: 0, 15, 30, etc. Must be within valid range for the field.
Wildcards: * matches any value.
Steps: */N steps by N. E.g., */15 for every 15 minutes.

Field Ranges

Field
Range
minute
0 - 59
hour
0 - 23
day
1 - 31
month
1 - 12
weekday
0 - 7

Creating a Schedule

Create a schedule by selecting a target, scan engine, and cron expression. The target must exist and belong to your account.

POST /api/v1/schedules
curl -X POST https://api.xnolex.com/api/v1/schedules \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "target_id": "550e8400-e29b-41d4-a716-446655440000",
    "engine": "full",
    "cron_expression": "0 0 * * *"
  }'

Response:

200 OK
{
  "id": "schedule-uuid-...",
  "target_id": "550e8400-...",
  "target_domain": "example.com",
  "engine": "full",
  "cron_expression": "0 0 * * *",
  "is_active": true,
  "next_run_at": "2025-01-16T00:00:00Z"
}

Preset Frequencies

Common scheduling patterns:

Frequency
Cron Expression
Hourly
0 * * * *
Daily
0 0 * * *
Weekly
0 0 * * 1
Monthly
0 0 1 * *

Managing Schedules

Toggle Active/Paused

Pause a schedule without deleting it by setting is_active to false. Resume it by setting is_active back to true.

PUT /api/v1/schedules/{id}
curl -X PUT https://api.xnolex.com/api/v1/schedules/{schedule_id} \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{ "is_active": false }'

Manual Trigger

Run a schedule immediately without waiting for the next cron trigger. This creates a new scan using the schedule's target and engine.

POST /api/v1/schedules/{id}/run-now
curl -X POST https://api.xnolex.com/api/v1/schedules/{schedule_id}/run-now \
  -H "Authorization: Bearer <token>"
Note
Manual triggers respect your concurrent scan limit. If you have reached your tier's limit, the request returns a 429 status code.

Delete a Schedule

DELETE /api/v1/schedules/{id}
curl -X DELETE https://api.xnolex.com/api/v1/schedules/{schedule_id} \
  -H "Authorization: Bearer <token>"

Tracking

Each schedule tracks two timestamps:

last_run_at — When the schedule last triggered a scan (updated on each trigger).
next_run_at — When the schedule will next trigger. Calculated from the cron expression when the schedule is created or updated.

Architecture Note

Info
The cron scheduler runs server-side. Actual scan execution depends on the backend scheduler process being active. If the scheduler is not running, scheduled scans will not trigger automatically. Manual triggers via the run-now endpoint are always available regardless of scheduler status.