Изменить расписание
PATCH /api/v1/schedules/{schedule}
Обновляет переданные параметры. Ближайший запуск пересчитывается при изменении времени, зоны, разрешённых часов или включения. Смена названия или политики повторов не сдвигает назначенный запуск.
Доступ
Bearer API-ключ своего пространства, с разрешением записи. Дополнительно проверяются права владельца на ресурс и действие. Для чужого объекта доступ не предоставляется.
Параметры
Параметры пути: schedule. Подставьте идентификаторы из ответов своей установки.
Тело запроса (JSON):
{
"name": "Два запуска в день",
"kind": "cron",
"preset": {
"cron": "0 2,12 * * *"
},
"timezone": "Europe/Moscow"
}
script_id менять нельзя. Для другого сценария создайте новое расписание.
Ответ 200
Сокращённый пример ответа. Дополнительные поля могут присутствовать; числовые идентификаторы условные.
{
"id": 5,
"name": "Ночной сбор",
"cron": "0 0 * * *",
"timezone": "Europe/Moscow",
"is_active": true
}
Как отправить запрос
В серверном окружении задайте BASE (адрес установки без завершающего слеша) и API_KEY. Секрет не вставляется в исходник. Подготовка клиентов и браузерный JavaScript.
curl
curl --fail-with-body -X PATCH "$BASE/api/v1/schedules/5" \
-H "Authorization: Bearer $API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
--data-binary @- <<'JSON'
{
"name": "Два запуска в день",
"kind": "cron",
"preset": {
"cron": "0 2,12 * * *"
},
"timezone": "Europe/Moscow"
}
JSON
Node.js · сервер
// Node.js, сервер. Сохраните как request.mjs.
const response = await fetch(process.env.BASE + "/api/v1/schedules/5", {
method: "PATCH",
headers: {
Authorization: `Bearer ${process.env.API_KEY}`,
Accept: "application/json",
"Content-Type": "application/json"
},
body: JSON.stringify({"name":"Два запуска в день","kind":"cron","preset":{"cron":"0 2,12 * * *"},"timezone":"Europe/Moscow"}),
signal: AbortSignal.timeout(120000)
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);
console.log(await response.json());
Python
import json
import os
import urllib.request
import urllib.error
body = '{"name":"Два запуска в день","kind":"cron","preset":{"cron":"0 2,12 * * *"},"timezone":"Europe/Moscow"}'.encode("utf-8")
request = urllib.request.Request(
os.environ["BASE"] + "/api/v1/schedules/5",
method="PATCH",
headers={"Authorization": "Bearer " + os.environ["API_KEY"],
"Accept": "application/json", "Content-Type": "application/json"},
data=body,
)
try:
with urllib.request.urlopen(request, timeout=120) as response:
print(json.load(response))
except urllib.error.HTTPError as error:
print(error.code, error.read().decode("utf-8", errors="replace"))
raise
PHP · внешний клиент
<?php
$handle = curl_init(getenv("BASE") . "/api/v1/schedules/5");
curl_setopt_array($handle, [
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 120,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("API_KEY"),
"Accept: application/json",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => <<<'JSON'
{"name":"Два запуска в день","kind":"cron","preset":{"cron":"0 2,12 * * *"},"timezone":"Europe/Moscow"}
JSON,
]);
$content = curl_exec($handle);
$status = curl_getinfo($handle, CURLINFO_RESPONSE_CODE);
if ($content === false) {
throw new RuntimeException(curl_error($handle));
}
curl_close($handle);
if ($status < 200 || $status >= 300) {
throw new RuntimeException("HTTP $status: $content");
}
print_r(json_decode($content, true, 512, JSON_THROW_ON_ERROR));
Go
package main
import (
"fmt"
"io"
"net/http"
"os"
"time"
"strings"
)
func main() {
body := strings.NewReader(`{"name":"Два запуска в день","kind":"cron","preset":{"cron":"0 2,12 * * *"},"timezone":"Europe/Moscow"}`)
request, err := http.NewRequest("PATCH", os.Getenv("BASE") + "/api/v1/schedules/5", body)
if err != nil { panic(err) }
request.Header.Set("Authorization", "Bearer " + os.Getenv("API_KEY"))
request.Header.Set("Accept", "application/json")
request.Header.Set("Content-Type", "application/json")
client := &http.Client{Timeout: 120 * time.Second}
response, err := client.Do(request)
if err != nil { panic(err) }
defer response.Body.Close()
content, err := io.ReadAll(response.Body)
if err != nil { panic(err) }
if response.StatusCode < 200 || response.StatusCode >= 300 {
panic(fmt.Sprintf("HTTP %d: %s", response.StatusCode, content))
}
fmt.Println(string(content))
}
Если запрос не выполнен
401: проверьте ключ и срок. 403: права, режим чтения/записи и 2FA. 404: идентификатор и пространство. 422: поля запроса или состояние объекта. 429: подождите Retry-After. Подробно об ошибках и повторах.
Повтор после ошибки
Для временных сбоев можно передать retry_policy: "transient",
retry_limit: 2, retry_delay_seconds: 300: это две дополнительные попытки
с паузой пять минут. never отключает повторы, inherit сохраняет правила сайта.
Ошибки кода и явные запреты не повторяются. Подпись города задаётся через
timezone_city, расчёт определяет обязательная IANA-зона timezone.
Подробные правила.