cURL
curl --request POST "${HARNESS_URL}/harness/cronjobs" \
--header "Authorization: Bearer ${HARNESS_TOKEN}" \
--header "Content-Type: application/json" \
--data '{"name": "daily-report", "prompt": "Summarize recent activity", "schedule": {"cron": "0 9 * * *", "timezone": "Asia/Shanghai"}, "idempotency_key": "daily-report-v1"}'import json
import os
from urllib.request import Request, urlopen
base_url = os.environ["HARNESS_URL"]
headers = {"Authorization": "Bearer " + os.environ["HARNESS_TOKEN"]}
headers["Content-Type"] = "application/json"
data = json.dumps({'name': 'daily-report', 'prompt': 'Summarize recent activity', 'schedule': {'cron': '0 9 * * *', 'timezone': 'Asia/Shanghai'}, 'idempotency_key': 'daily-report-v1'}).encode()
request = Request(base_url + f"/harness/cronjobs", headers=headers, method="POST", data=data)
with urlopen(request) as response:
print(json.load(response))const baseUrl = process.env.HARNESS_URL;
const headers = { Authorization: `Bearer ${process.env.HARNESS_TOKEN}` };
headers["Content-Type"] = "application/json";
const response = await fetch(`${baseUrl}/harness/cronjobs`, {
method: "POST",
headers,
body: JSON.stringify({"name": "daily-report", "prompt": "Summarize recent activity", "schedule": {"cron": "0 9 * * *", "timezone": "Asia/Shanghai"}, "idempotency_key": "daily-report-v1"}),
});
if (!response.ok) throw new Error(await response.text());
console.log(await response.json());{
"name": "daily-report",
"prompt": "Summarize recent activity",
"schedule": {
"cron": "0 9 * * *",
"at": null,
"timezone": "Asia/Shanghai"
},
"enabled": true,
"timeout_seconds": 1800,
"misfire_policy": "latest",
"misfire_grace_seconds": 120,
"harness": null,
"cronjob_id": "0e58ff7f7dcbf348c252fc70e7fdb587",
"revision": 1,
"created_at": "2026-09-16T00:00:00Z",
"updated_at": "2026-09-16T00:00:00Z",
"next_run_at": "2026-09-16T01:00:00Z",
"active": null,
"last_run": null
}Scheduled jobs
Create a scheduled task
Create a recurring or one-time task and return its definition and state
POST
/
harness
/
cronjobs
cURL
curl --request POST "${HARNESS_URL}/harness/cronjobs" \
--header "Authorization: Bearer ${HARNESS_TOKEN}" \
--header "Content-Type: application/json" \
--data '{"name": "daily-report", "prompt": "Summarize recent activity", "schedule": {"cron": "0 9 * * *", "timezone": "Asia/Shanghai"}, "idempotency_key": "daily-report-v1"}'import json
import os
from urllib.request import Request, urlopen
base_url = os.environ["HARNESS_URL"]
headers = {"Authorization": "Bearer " + os.environ["HARNESS_TOKEN"]}
headers["Content-Type"] = "application/json"
data = json.dumps({'name': 'daily-report', 'prompt': 'Summarize recent activity', 'schedule': {'cron': '0 9 * * *', 'timezone': 'Asia/Shanghai'}, 'idempotency_key': 'daily-report-v1'}).encode()
request = Request(base_url + f"/harness/cronjobs", headers=headers, method="POST", data=data)
with urlopen(request) as response:
print(json.load(response))const baseUrl = process.env.HARNESS_URL;
const headers = { Authorization: `Bearer ${process.env.HARNESS_TOKEN}` };
headers["Content-Type"] = "application/json";
const response = await fetch(`${baseUrl}/harness/cronjobs`, {
method: "POST",
headers,
body: JSON.stringify({"name": "daily-report", "prompt": "Summarize recent activity", "schedule": {"cron": "0 9 * * *", "timezone": "Asia/Shanghai"}, "idempotency_key": "daily-report-v1"}),
});
if (!response.ok) throw new Error(await response.text());
console.log(await response.json());{
"name": "daily-report",
"prompt": "Summarize recent activity",
"schedule": {
"cron": "0 9 * * *",
"at": null,
"timezone": "Asia/Shanghai"
},
"enabled": true,
"timeout_seconds": 1800,
"misfire_policy": "latest",
"misfire_grace_seconds": 120,
"harness": null,
"cronjob_id": "0e58ff7f7dcbf348c252fc70e7fdb587",
"revision": 1,
"created_at": "2026-09-16T00:00:00Z",
"updated_at": "2026-09-16T00:00:00Z",
"next_run_at": "2026-09-16T01:00:00Z",
"active": null,
"last_run": null
}Jobs are enabled by default. After creation, the schedule invokes models and tools and saves job data and results to TOS. Check the message, schedule, and access rights before submitting. Set
enabled to false to save a job without starting its scheduleschedule.cron and schedule.at must be non-null. For an enabled one-time task, at must include a timezone offset and lie in the future
Use a stable idempotency_key when retrying creation. Identical requests with the same key return the same task and HTTP 201; different input with that key returns 422. Omitting the key creates a new task on every request
harness uses the task override structure shown on this page. Omitted fields inherit deployed settings. Each execution uses a separate session, and its final output is persisted in TOSAuthorizations
Body
application/json
Request to create a task; undeclared fields are rejected
Response
Success; repeated identical idempotent requests also return 201
Last modified on September 19, 2026