Schedules
Read and trigger schedules with an API key
Schedules run a test or a group of tests on a cron or one-time basis. API keys can read schedules and control their execution state. Creating, editing, and deleting schedules requires a console session.
GET actions take their inputs as query parameters; POST actions take a JSON body. All actions require x-project-id. The branch is resolved from x-branch-id or the project default branch. Each action lists its scopes. schedules.trigger, schedules.enable and schedules.disable require an active subscription and otherwise return 403 { "error": "LICENSE_REQUIRED" }.
See Authentication and Scopes.
List schedules
GET /v1/actions/schedules.listScope: schedules:read
Returns schedules for the active project, with pagination.
Query parameters
| Parameter | Type | Default | Notes |
|---|---|---|---|
limit | integer | 20 | Results per page. Minimum 1, maximum 100. |
page | integer | 0 | Zero-based page index. |
enabled | boolean | — | Filter by enabled state. |
name | string | — | Substring filter on schedule name. |
Response
{
"data": [
{
"id": "sch-uuid",
"name": "Nightly regression",
"scheduleType": "directory",
"scheduleMode": "recurring",
"targetId": "test-uuid",
"tagId": null,
"cronExpression": "0 2 * * *",
"enabled": true,
"branchId": "branch-uuid",
"projectId": "proj-uuid",
"organizationId": "org-uuid",
"createdAt": "2026-09-01T00:00:00.000Z",
"updatedAt": "2026-09-15T08:30:00.000Z"
}
],
"pagination": {
"page": 0,
"limit": 20,
"total": 3,
"totalPages": 1,
"hasMore": false
}
}Get a schedule
GET /v1/actions/schedules.getScope: schedules:read
Returns a single schedule by ID.
Query parameters
| Parameter | Type | Required | Notes |
|---|---|---|---|
scheduleId | UUID | yes | The schedule to read. |
Response
{
"data": {
"id": "sch-uuid",
"name": "Nightly regression",
"scheduleType": "directory",
"scheduleMode": "recurring",
"targetId": "test-uuid",
"tagId": null,
"cronExpression": "0 2 * * *",
"enabled": true,
"branchId": "branch-uuid",
"projectId": "proj-uuid",
"organizationId": "org-uuid"
}
}Status codes
| Status | Meaning |
|---|---|
200 | Schedule found |
404 | Schedule not found in this project |
Trigger a schedule
POST /v1/actions/schedules.triggerScope: schedules:run and schedules:read
Immediately executes the schedule as if it had fired on its cron, regardless of the schedule's enabled state.
Body
| Field | Required | Notes |
|---|---|---|
scheduleId | yes | UUID of the schedule. |
Response
{
"data": { "message": "Schedule triggered successfully" }
}Returns 409 with the reason when the run is skipped, and 404 when the schedule is not in this project.
Example
curl -s -X POST "https://api.smoothdeploy.com/v1/actions/schedules.trigger" \
-H "x-api-key: $SMOOTHDEPLOY_API_KEY" \
-H "x-project-id: $PROJECT_ID" \
-H "Content-Type: application/json" \
-d "{\"scheduleId\":\"$SCHEDULE_ID\"}"Enable a schedule
POST /v1/actions/schedules.enableScope: schedules:resume and schedules:read
Re-enables a disabled schedule so it fires on its next cron tick. Returns 400 for one-time schedules whose execution time has already passed.
Body
| Field | Required | Notes |
|---|---|---|
scheduleId | yes | UUID of the schedule. |
Response
{
"data": {
"id": "sch-uuid",
"enabled": true
}
}Disable a schedule
POST /v1/actions/schedules.disableScope: schedules:pause and schedules:read
Pauses a schedule so it no longer fires automatically. It can still be triggered manually.
Body
| Field | Required | Notes |
|---|---|---|
scheduleId | yes | UUID of the schedule. |
Response
{
"data": {
"id": "sch-uuid",
"enabled": false
}
}