Schedules

Schedules automate recurring journey execution. Assign journeys to a schedule, set a frequency, and the system runs them on a rotating basis within your agent budget.

Overview

A schedule ties a set of journeys to a recurring cadence. You define when to run (time of day, which days of the week), how often to tick, and a coverage window that determines how urgently each journey needs to be re-run. The system handles the rest.

Schedules are budget-aware. Each tenant has a daily agent budget that limits how many agents can be spawned per day across all schedules. The scheduler uses a scoring system that prioritizes journeys based on staleness (how long since they last ran) and priority (a weight you assign to each schedule item). Journeys that have not run recently are picked first. This means the system automatically rotates through all your journeys even if the daily budget does not allow running all of them in a single tick.

Schedule items

Each schedule contains a list of items. An item is a reference to a journey with a priority weight. Higher priority items are preferred when the budget forces a choice. Each item tracks when it last ran, so the staleness scoring works per-journey.

Email digest

Schedules can be configured to send an email digest after each tick. The digest summarizes the results of all agents that ran and can be set to send always or only when failures occur. Configure recipients and optionally filter by finding severity.

POST /api/v1/schedules

Create a schedule

Parameters

ParameterTypeInRequiredDescription
project_iduuidbodyYesProject ID
namestringbodyYesSchedule name
coverage_window_hoursintegerbodyNoHours within which all journeys must run (default: 120)
tick_interval_hoursintegerbodyNoHours between ticks (default: 24)
daily_budgetintegerbodyNoMax test runs per tick (null = auto)
run_daysarraybodyNoISO day numbers to run on (Mon=1..Sun=7). Default: all days. Example: [1,2,3,4,5] for weekdays.
journey_idsarraybodyNoJourney IDs to include
persona_iduuidbodyNoDefault persona for runs
role_iduuidbodyNoDefault role for runs
digest_configobjectbodyNoEmail digest settings. Example: {"enabled": true, "channels": ["email"], "notify_on": "always", "recipients": ["alice@example.com"], "min_severity": "high"}. min_severity: "critical", "high", "medium", "low" (omit for all).

Status Codes

CodeDescription
201Schedule created
400Validation error
401Unauthorized
404Project not found

Response Body

{
  "schedule": {
    "id": "019d4000-0000-7000-0000-000000000000",
    "tenant_id": "550e8400-e29b-41d4-a716-446655440000",
    "project_id": "660e8400-e29b-41d4-a716-446655440000",
    "name": "Daily QA sweep",
    "coverage_window_hours": 120,
    "daily_budget": 2,
    "tick_interval_hours": 24,
    "run_days": [1, 2, 3, 4, 5],
    "enabled": true,
    "last_tick_at": null,
    "created_at": "2026-03-31T10:00:00Z",
    "updated_at": "2026-03-31T10:00:00Z"
  },
  "items": []
}
POST /api/v1/schedules
cURL
Response
GET /api/v1/schedules

List schedules

Parameters

ParameterTypeInRequiredDescription
project_iduuidqueryNoFilter by project
limitintegerqueryNoPage size (default: 20)
afteruuidqueryNoCursor for next page

Status Codes

CodeDescription
200OK
401Unauthorized
GET /api/v1/schedules
cURL
Response
GET /api/v1/schedules/{id}

Get schedule with items and recent runs

Parameters

ParameterTypeInRequiredDescription
iduuidpathYesSchedule ID

Status Codes

CodeDescription
200OK
401Unauthorized
404Not found
GET /api/v1/schedules/{id}
cURL
Response
PATCH /api/v1/schedules/{id}

Update schedule

Parameters

ParameterTypeInRequiredDescription
iduuidpathYesSchedule ID
namestringbodyNoNew name
enabledbooleanbodyNoEnable or disable
coverage_window_hoursintegerbodyNoNew coverage window
tick_interval_hoursintegerbodyNoNew tick interval
daily_budgetintegerbodyNoNew budget (null = auto)
run_daysarraybodyNoISO day numbers (Mon=1..Sun=7)
digest_configobjectbodyNoEmail digest settings (see Create for shape). Set to null to disable.

Status Codes

CodeDescription
200Updated
401Unauthorized
404Not found
PATCH /api/v1/schedules/{id}
cURL
Response
DELETE /api/v1/schedules/{id}

Delete schedule

Parameters

ParameterTypeInRequiredDescription
iduuidpathYesSchedule ID

Status Codes

CodeDescription
204Deleted
401Unauthorized
404Not found
DELETE /api/v1/schedules/{id}
cURL
Response
POST /api/v1/schedules/{id}/items

Add user journey to schedule

Parameters

ParameterTypeInRequiredDescription
iduuidpathYesSchedule ID
journey_iduuidbodyYesJourney to add
priorityintegerbodyNoPriority (higher = preferred) (default: 0)

Status Codes

CodeDescription
201Item added
401Unauthorized
404Schedule not found
POST /api/v1/schedules/{id}/items
cURL
Response
DELETE /api/v1/schedules/{id}/items/{itemId}

Remove user journey from schedule

Parameters

ParameterTypeInRequiredDescription
iduuidpathYesSchedule ID
itemIduuidpathYesItem ID

Status Codes

CodeDescription
204Removed
401Unauthorized
404Not found
DELETE /api/v1/schedules/{id}/items/{itemId}
cURL
Response
GET /api/v1/schedules/{id}/runs

List schedule runs (audit trail)

Parameters

ParameterTypeInRequiredDescription
iduuidpathYesSchedule ID

Status Codes

CodeDescription
200OK
401Unauthorized
404Not found
GET /api/v1/schedules/{id}/runs
cURL
Response
POST /api/v1/schedules/{id}/trigger

Manually trigger a schedule tick

Runs the scheduling algorithm for this schedule immediately, ignoring last_tick_at.

Parameters

ParameterTypeInRequiredDescription
iduuidpathYesSchedule ID

Status Codes

CodeDescription
200Triggered
401Unauthorized
404Not found
POST /api/v1/schedules/{id}/trigger
cURL
Response