v1

Справочник API ProTasks

API позволяет работать с задачами, заметками и пространствами ProTasks из ваших сервисов: CRM, ботов, таблиц, скриптов. Всё, что вы делаете через API, работает так же, как в приложении: уведомления, история изменений, лимиты тарифа.

Базовый адрес

https://protasks.ru/api/v1

Запросы и ответы — в JSON (UTF-8). У запросов с телом (POST, PATCH) обязателен заголовок Content-Type: application/json; у GET и DELETE тела нет — этот заголовок не нужен.

С чего начать

Пример запроса
curl https://protasks.ru/api/v1/me \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/me');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$res = json_decode(curl_exec($ch), true);
import requests

r = requests.get("https://protasks.ru/api/v1/me",
                 headers={"Authorization": "Bearer ptk_<API_KEY>"})
print(r.json())
const r = await fetch('https://protasks.ru/api/v1/me', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
console.log(await r.json());

Аутентификация

Каждый запрос подписывается ключом API. Ключ создаётся в разделе Интеграция и API → API (в меню приложения), выглядит как ptk_ + 40 символов и показывается один раз — сохраните его в надёжном месте. Мы храним только отпечаток ключа и не сможем показать его снова.

Передайте ключ в заголовке:

Authorization: Bearer ptk_…

Если ваш инструмент не умеет задавать Authorization, можно использовать заголовок X-Api-Key: ptk_….

Ключ даёт доступ к вашим данным от вашего имени. Не публикуйте его в открытом коде и браузерных скриптах. Утёк ключ — отзовите его в разделе «Интеграция и API»: он перестанет работать сразу.
Ключ не передан — ответ 401
{
  "ok": false,
  "error": {
    "status": 401,
    "code": "no_key",
    "message": "Нужен ключ API: заголовок Authorization: Bearer ptk_…"
  }
}

Права ключа

При создании ключа выбираются права:

ПраваЧто можно
readТолько чтение: списки и данные задач, заметок, пространств. Подходит для отчётов и дашбордов.
fullЧтение и изменение: создание, изменение и удаление.

Ключу read методы изменения отвечают ошибкой 403 read_only. Доступ к данным — такой же, как у владельца ключа в приложении: только свои личные задачи и пространства, где он участник; действия, доступные в пространстве только создателю, через API тоже доступны только ему.

Ключ только для чтения — ответ 403
{
  "ok": false,
  "error": {
    "status": 403,
    "code": "read_only",
    "message": "Ключ только для чтения — …"
  }
}

Тарифы и лимиты

API доступен на тарифах Pro и Business. Если тариф владельца ключа сменился на Free, ключи сохраняются, но запросы получают 403 tarif — до возврата на платный тариф.

ТарифЗапросов в минуту на ключ
Pro60
Business300

В каждом ответе есть заголовки лимита:

ЗаголовокЗначение
X-RateLimit-Limitлимит в минуту
X-RateLimit-Remainingсколько запросов осталось в текущей минуте
X-RateLimit-Resetчерез сколько секунд счётчик обнулится

При превышении — 429 rate_limit и заголовок Retry-After (секунды). Остальные лимиты тарифа (пространства, участники, записи) действуют так же, как в приложении. Активных ключей — не больше 10 на пользователя.

Лимит превышен — ответ 429, заголовки
Retry-After: 23
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
Тело ответа
{
  "ok": false,
  "error": {
    "status": 429,
    "code": "rate_limit",
    "message": "Слишком много запросов — не больше 60 в минуту"
  }
}

Ответы и ошибки

Успешный ответ — HTTP 200 (или 201 при создании) и объект с полем data. Ошибка — HTTP-код и объект error: status — тот же HTTP-код, code — машинный код ошибки, message — понятный текст.

HTTPcodeКогда
400validationневерные или недостающие параметры
401no_keyключ не передан
401bad_keyключ неверный или отозван
403tarifтариф владельца ключа не Pro / Business
403read_onlyметод изменения, а ключ только для чтения
400rejectedдействие запрещено правилами приложения: лимит тарифа, нельзя закрыть задачу с открытыми подзадачами и т.п. — причина в message
403forbiddenнет прав на действие (например, удалить задачу может только её автор)
403space_locked, member_lockedпространство или участник заблокированы (лимит тарифа, отключено администрацией) — доступно только чтение
403archivedпространство в архиве — его содержимое откроется, когда его вернут из архива в приложении
404not_foundметода или объекта нет, либо нет доступа к нему (чужая задача, пространство, где вы не участник)
405method_not_allowedу адреса нет такого HTTP-метода
429rate_limitпревышена частота запросов
500server_errorошибка на нашей стороне — повторите позже
Успех
{
  "ok": true,
  "data": { /* … */ }
}
Ошибка
{
  "ok": false,
  "error": {
    "status": 401,
    "code": "bad_key",
    "message": "Ключ недействителен или отозван"
  }
}

Владелец ключа

GET/me

Возвращает пользователя, которому принадлежит ключ, права ключа и лимит запросов. Удобно для проверки, что ключ работает.

Параметры

Нет.

Ответ

ПолеТипОписание
user_idstringID пользователя (как в профиле, «#123456»)
namestringимя
emailstring или nullпочта
tarifstringpro или business
key.namestringназвание ключа
key.scopestringread или full
rate_limitnumberзапросов в минуту
Запрос
curl https://protasks.ru/api/v1/me \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/me');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$me = json_decode(curl_exec($ch), true)['data'];
import requests

me = requests.get("https://protasks.ru/api/v1/me",
                  headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const { data: me } = await (await fetch('https://protasks.ru/api/v1/me', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
})).json();
Ответ
{
  "ok": true,
  "data": {
    "user_id": "123456",
    "name": "Иван Петров",
    "email": "ivan@example.com",
    "tarif": "pro",
    "key": { "name": "CRM", "scope": "full" },
    "rate_limit": 60
  }
}

Объект «Задача»

Личная задача владельца ключа. ID задачи — её номер (например «#42»).

ПолеТипОписание
idnumberномер задачи
titlestringназвание, до 255 символов
descriptionstring или nullописание
status_idnumberID статуса — см. ниже
statusstringназвание статуса — только в ответе, для чтения человеком
priority_idnumber или nullID приоритета — см. ниже; null — без приоритета
prioritystring или nullназвание приоритета — только в ответе
deadlinestring или nullдата дедлайна, YYYY-MM-DD
deadline_timestring или nullвремя дедлайна, HH:MM (московское)
remind_beforenumber или nullнапомнить за N минут до дедлайна: 15, 30, 60, 120, 720, 1440, 2880, 10080. Работает, только когда заданы и дата, и время
repeatobject или nullправило повтора — см. ниже
repeat_countnumberсколько раз регулярная задача уже выполнена
created_at, updated_atstringвремя создания и изменения, ISO 8601

Статусы (status_id)

В запросах статус задаётся только по ID — status_id. В ответе приходят оба поля: status_id и название status.

status_idСтатусЗначение
33Новаяпо умолчанию у новой задачи
66В работе
99Закрытавыполнена; у регулярной — запускает повтор
100Отмененане выполнена; повтор не запускает

Приоритеты (priority_id)

В запросах приоритет задаётся только по ID — priority_id. В ответе приходят оба поля: priority_id и название priority.

priority_idПриоритет
10Низкий
20Средний
30Высокий
nullбез приоритета

Правило повтора (repeat)

Регулярная задача при переводе в Закрыта сразу возвращается в Новая, дедлайн сдвигается по правилу, указанному в задаче.

ПолеТипОписание
frequencystringday — каждые N дней, week — недель, month — месяцев, weekdays — по будням
intervalnumberN, от 1 до 365 (по умолчанию 1)
weekdaysnumber[]для week: дни недели, 1 — понедельник … 7 — воскресенье
month_last_daybooleanдля month: в последний день месяца
endstringnever (по умолчанию), date — до даты until, count — times раз
untilstringдля end: date: YYYY-MM-DD
timesnumberдля end: count: сколько раз всего
Объект «Задача»
{
  "id": 42,
  "title": "Позвонить клиенту",
  "description": "Обсудить договор",
  "status_id": 33,
  "status": "Новая",
  "priority_id": 30,
  "priority": "Высокий",
  "deadline": "2026-10-20",
  "deadline_time": "15:00",
  "remind_before": 30,
  "repeat": null,
  "repeat_count": 0,
  "created_at": "2026-10-12T21:40:45+03:00",
  "updated_at": "2026-10-12T21:40:45+03:00"
}
Пример repeat — по понедельникам и пятницам, 10 раз
{
  "frequency": "week",
  "weekdays": [1, 5],
  "end": "count",
  "times": 10
}

Список задач

GET/personal/tasks

Личные задачи с фильтрами и сортировкой, по умолчанию новые сверху, по 50 на страницу. Чтобы получить следующие — передайте page с индексом страницы (2, 3, 4 и т.д.). Если страница не будет найдена, в ответе meta.has_more придет false.

Фильтры

ПараметрТипОписание
status_idstringстатус или несколько через запятую: 33, 33,66 — см. статусы
priority_idstringприоритет или несколько через запятую: 30, 20,30 — см. приоритеты
deadline_fromstringдедлайн не раньше этой даты (включительно)
deadline_tostringдедлайн не позже этой даты (включительно)
has_deadlinebooleantrue — только с дедлайном, false — только без
created_fromstringсоздана не раньше
created_tostringсоздана не позже (включительно)

Даты в фильтрах — YYYY-MM-DD или unix-время в секундах (1791763200). Можно задать только одну границу периода.

Сортировка

ПараметрТипОписание
sortstringid — по номеру (по умолчанию), deadline — по дедлайну, created_at — по дате создания, updated_at — по дате изменения, priority — по приоритету
orderstringasc — по возрастанию, desc — по убыванию. По умолчанию: для deadline — asc (ближайшие сначала), для остальных — desc (новые сверху)

При сортировке по дедлайну задачи без дедлайна — всегда в конце; по приоритету — задачи без приоритета в конце.

Страницы

ПараметрТипОписание
pagenumberномер страницы, с 1; на странице до 50 задач; если параметр не указан, то выводится задачи от новой к более старой по номеру

Ответ

data — массив задач - см. Объект «Задача», meta — постраничная навигация:

ПолеОписание
pageтекущая страница
per_pageзадач на странице — 50
totalвсего задач по фильтру
pagesвсего страниц
has_moreесть ли следующая страница
Запрос — открытые задачи с дедлайном в октябре, ближайшие сначала
curl "https://protasks.ru/api/v1/personal/tasks?status_id=33,66&deadline_from=2026-10-01&deadline_to=2026-10-31&sort=deadline" \
  -H "Authorization: Bearer ptk_<API_KEY>"
$url = 'https://protasks.ru/api/v1/personal/tasks?' . http_build_query([
    'status_id' => '33,66',
    'deadline_from' => '2026-10-01',
    'deadline_to' => '2026-10-31',
    'sort' => 'deadline',
]);
$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$tasks = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.get("https://protasks.ru/api/v1/personal/tasks",
                 params={"status_id": "33,66", "deadline_from": "2026-10-01",
                         "deadline_to": "2026-10-31", "sort": "deadline"},
                 headers={"Authorization": "Bearer ptk_<API_KEY>"})
tasks = r.json()["data"]
const url = 'https://protasks.ru/api/v1/personal/tasks?' + new URLSearchParams({
  status_id: '33,66', deadline_from: '2026-10-01', deadline_to: '2026-10-31', sort: 'deadline'
});
const r = await fetch(url, { headers: { Authorization: 'Bearer ptk_<API_KEY>' } });
const { data: tasks, meta } = await r.json();
Ответ
{
  "ok": true,
  "data": [ { "id": 42, "title": "Позвонить клиенту", "status_id": 66, "status": "В работе", … } ],
  "meta": { "page": 2, "per_page": 50, "total": 137, "pages": 3, "has_more": true }
}

Получить задачу

GET/personal/tasks/{id}

Одна задача по номеру. Задача не найдена — 404 not_found.

Параметры

ПараметрТипОписание
idnumberномер задачи
Запрос
curl https://protasks.ru/api/v1/personal/tasks/42 \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/personal/tasks/42');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$task = json_decode(curl_exec($ch), true)['data'];
import requests

task = requests.get("https://protasks.ru/api/v1/personal/tasks/42",
                    headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/personal/tasks/42', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: task } = await r.json();
Ответ
{ "ok": true, "data": /* объект «Задача» */ }

Создать задачу

POST/personal/tasks

Создаёт личную задачу. Права ключа: «чтение и изменение». Ответ — 201 и массив data - см. Объект «Задача».

Тело запроса

ПолеТипОписание
titlestringназвание, до 255 символов
descriptionstringописание
status_idnumber33 Новая (по умолчанию) или 66 В работе
priority_idnumber10 Низкий, 20 Средний, 30 Высокий — см. приоритеты
deadlinestringYYYY-MM-DD
deadline_timestringHH:MM
remind_beforenumberнапомнить за N минут до дедлайна: 15, 30, 60, 120, 720 (12 ч), 1440 (сутки), 2880 (2 суток), 10080 (неделя). Только вместе с deadline и deadline_time — без них 400 validation
repeatobjectправило повтора — задача станет регулярной; поля ниже. Нужен deadline: повтор считается от него
repeat.frequencystringday — каждые N дней, week — недель, month — месяцев, weekdays — по будням (пн–пт)
repeat.intervalnumberN — каждые сколько дней/недель/месяцев, 1–365, по умолчанию 1
repeat.weekdaysnumber[]для week: дни недели, 1 — пн … 7 — вс. Не задано — тот же день недели, что у дедлайна
repeat.month_last_daybooleanдля month: в последний день месяца
repeat.endstringкогда закончить: never (по умолчанию), date — до даты until, count — после times выполнений
repeat.untilstringдля end: date: последняя дата, YYYY-MM-DD
repeat.timesnumberдля end: count: сколько раз всего, 1–999
Запрос
curl -X POST https://protasks.ru/api/v1/personal/tasks \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"title": "Позвонить клиенту", "priority_id": 30, "deadline": "2026-10-20", "deadline_time": "15:00", "remind_before": 30}'
$ch = curl_init('https://protasks.ru/api/v1/personal/tasks');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'title' => 'Позвонить клиенту',
        'priority_id' => 30,
        'deadline' => '2026-10-20',
        'deadline_time' => '15:00',
        'remind_before' => 30,
    ]),
]);
$task = json_decode(curl_exec($ch), true)['data'];
import requests

task = requests.post("https://protasks.ru/api/v1/personal/tasks",
    headers={"Authorization": "Bearer ptk_<API_KEY>"},
    json={"title": "Позвонить клиенту", "priority": "Высокий",
          "deadline": "2026-10-20", "deadline_time": "15:00", "remind_before": 30}
).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/personal/tasks', {
  method: 'POST',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({ title: 'Позвонить клиенту', priority_id: 30,
    deadline: '2026-10-20', deadline_time: '15:00', remind_before: 30 })
});
const { data: task } = await r.json();
Тело — регулярная задача: по пн и пт, 10 раз
{
  "title": "Еженедельный отчёт",
  "deadline": "2026-10-16",
  "deadline_time": "10:00",
  "repeat": {
    "frequency": "week",
    "weekdays": [1, 5],
    "end": "count",
    "times": 10
  }
}
Ответ — 201
{ "ok": true, "data": { "id": 43, "title": "Позвонить клиенту", … } }

Изменить задачу

PATCH/personal/tasks/{id}

Меняет только переданные поля, поля не указанные в запросе остаются без изменений. Чтобы очистить поле — передайте null. Права ключа: «чтение и изменение». В ответе вернется исправленная задача с массивом data - см. Объект «Задача».

Параметры

ПараметрТипОписание
idnumberномер задачи

Тело запроса

Любые поля из «Создать задачу» (хотя бы одно), включая repeat; status_id. Чтобы убрать повтор — "repeat": null.

remind_before можно задать, только если у задачи (после изменения) есть и дата, и время дедлайна — иначе 400 validation. Если очистить дату или время у задачи с напоминанием, напоминание снимется само.

Закрыли регулярную задачу (status_id: 99, у задачи есть repeat) — она сразу вернётся в Новая со следующим дедлайном. В ответе будет поле repeated: {"next_deadline": "YYYY-MM-DD"} или {"finished": true}, если серия повторов закончилась.
Запрос — перевести в работу
curl -X PATCH https://protasks.ru/api/v1/personal/tasks/42 \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"status_id": 66}'
$ch = curl_init('https://protasks.ru/api/v1/personal/tasks/42');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'PATCH',
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode(['status_id' => 66]),
]);
$task = json_decode(curl_exec($ch), true)['data'];
import requests

task = requests.patch("https://protasks.ru/api/v1/personal/tasks/42",
    headers={"Authorization": "Bearer ptk_<API_KEY>"},
    json={"status_id": 66}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/personal/tasks/42', {
  method: 'PATCH',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({ status_id: 66 })
});
Ответ — закрыли регулярную задачу
{
  "ok": true,
  "data": {
    "id": 42,
    "status_id": 33,
    "status": "Новая",
    "deadline": "2026-10-27",
    …
    "repeated": { "next_deadline": "2026-10-27" }
  }
}

Удалить задачу

DELETE/personal/tasks/{id}

Удаляет задачу навсегда вместе с её файлами. Данное действие необратимо. Права ключа: «чтение и изменение».

Параметры

ПараметрТипОписание
idnumberномер задачи
Запрос
curl -X DELETE https://protasks.ru/api/v1/personal/tasks/42 \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/personal/tasks/42');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'DELETE',
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
curl_exec($ch);
import requests

requests.delete("https://protasks.ru/api/v1/personal/tasks/42",
                headers={"Authorization": "Bearer ptk_<API_KEY>"})
await fetch('https://protasks.ru/api/v1/personal/tasks/42', {
  method: 'DELETE',
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
Ответ
{ "ok": true, "data": { "id": 42, "deleted": true } }

Объект «Заметка»

Личная заметка владельца ключа. ID заметки — её номер (например «#7»).

ПолеТипОписание
idnumberномер заметки
titlestringназвание, до 255 символов
textstring или nullтекст заметки
created_at, updated_atstringвремя создания и изменения, ISO 8601
Объект «Заметка»
{
  "id": 7,
  "title": "Идеи для отпуска",
  "text": "Байкал, Алтай, Карелия",
  "created_at": "2026-10-12T21:40:45+03:00",
  "updated_at": "2026-10-12T21:40:45+03:00"
}

Список заметок

GET/personal/notes

Заметки владельца ключа, новые сверху, по 50 на страницу. Чтобы получить следующие — передайте page с индексом страницы (2, 3, 4 и т.д.). Если страница не будет найдена, в ответе meta.has_more придет false.

Параметры запроса

ПараметрТипОписание
pagenumberномер страницы, с 1; на странице до 50 задач; если параметр не указан, то выводится задачи от новой к более старой по номеру)

Ответ

data — массив заметок, meta — page, per_page (50), total, pages, has_more — как у списка задач.

Запрос
curl "https://protasks.ru/api/v1/personal/notes?page=1" \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/personal/notes?page=1');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$res = json_decode(curl_exec($ch), true);
import requests

r = requests.get("https://protasks.ru/api/v1/personal/notes", params={"page": 1},
                 headers={"Authorization": "Bearer ptk_<API_KEY>"})
notes = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/personal/notes?page=1', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: notes, meta } = await r.json();
Ответ
{
  "ok": true,
  "data": [
    {
      "id": 7,
      "title": "Идеи для отпуска",
      "text": "Байкал, Алтай, Карелия",
      "created_at": "2026-10-12T21:40:45+03:00",
      "updated_at": "2026-10-12T21:40:45+03:00"
    }
  ],
  "meta": { "page": 1, "per_page": 50, "total": 1, "pages": 1, "has_more": false }
}

Получить заметку

GET/personal/notes/{id}

Одна заметка по номеру. Заметка не найдена — 404 not_found.

Параметры

ПараметрТипОписание
idnumberномер заметки
Запрос
curl https://protasks.ru/api/v1/personal/notes/7 \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/personal/notes/7');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$res = json_decode(curl_exec($ch), true);
import requests

note = requests.get("https://protasks.ru/api/v1/personal/notes/7",
                    headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/personal/notes/7', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: note } = await r.json();
Ответ
{
  "ok": true,
  "data": {
    "id": 7,
    "title": "Идеи для отпуска",
    "text": "Байкал, Алтай, Карелия",
    "created_at": "2026-10-12T21:40:45+03:00",
    "updated_at": "2026-10-12T21:40:45+03:00"
  }
}

Создать заметку

POST/personal/notes

Создаёт заметку владельцу ключа. Права ключа: «чтение и изменение». Ответ — 201 и созданная заметка с присвоенным номером.

Тело запроса

ПолеТипОписание
titlestringназвание, до 255 символов
textstringтекст заметки
Запрос
curl -X POST https://protasks.ru/api/v1/personal/notes \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"title": "Идеи для отпуска", "text": "Байкал, Алтай, Карелия"}'
$ch = curl_init('https://protasks.ru/api/v1/personal/notes');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode(['title' => 'Идеи для отпуска', 'text' => 'Байкал, Алтай, Карелия']),
]);
$note = json_decode(curl_exec($ch), true)['data'];
import requests

note = requests.post("https://protasks.ru/api/v1/personal/notes",
    headers={"Authorization": "Bearer ptk_<API_KEY>"},
    json={"title": "Идеи для отпуска", "text": "Байкал, Алтай, Карелия"}
).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/personal/notes', {
  method: 'POST',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({ title: 'Идеи для отпуска', text: 'Байкал, Алтай, Карелия' })
});
const { data: note } = await r.json();
Ответ — 201
{
  "ok": true,
  "data": {
    "id": 7,
    "title": "Идеи для отпуска",
    "text": "Байкал, Алтай, Карелия",
    "created_at": "2026-10-12T21:40:45+03:00",
    "updated_at": "2026-10-12T21:40:45+03:00"
  }
}

Изменить заметку

PATCH/personal/notes/{id}

Меняет только переданные поля. Чтобы очистить текст — "text": null. Права ключа: «чтение и изменение». Ответ — заметка после изменения.

Параметры

ПараметрТипОписание
idnumberномер заметки

Тело запроса

ПолеТипОписание
titlestringновое название
textstring или nullновый текст

Нужно хотя бы одно поле.

Запрос
curl -X PATCH https://protasks.ru/api/v1/personal/notes/7 \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"text": "Байкал, Алтай, Карелия, Камчатка"}'
$ch = curl_init('https://protasks.ru/api/v1/personal/notes/7');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'PATCH',
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode(['text' => 'Байкал, Алтай, Карелия, Камчатка']),
]);
$note = json_decode(curl_exec($ch), true)['data'];
import requests

note = requests.patch("https://protasks.ru/api/v1/personal/notes/7",
    headers={"Authorization": "Bearer ptk_<API_KEY>"},
    json={"text": "Байкал, Алтай, Карелия, Камчатка"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/personal/notes/7', {
  method: 'PATCH',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({ text: 'Байкал, Алтай, Карелия, Камчатка' })
});
Ответ
{
  "ok": true,
  "data": {
    "id": 7,
    "title": "Идеи для отпуска",
    "text": "Байкал, Алтай, Карелия, Камчатка",
    "created_at": "2026-10-12T21:40:45+03:00",
    "updated_at": "2026-10-12T22:05:10+03:00"
  }
}

Удалить заметку

DELETE/personal/notes/{id}

Удаляет заметку навсегда вместе с её файлами. Права ключа: «чтение и изменение».

Параметры

ПараметрТипОписание
idnumberномер заметки
Запрос
curl -X DELETE https://protasks.ru/api/v1/personal/notes/7 \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/personal/notes/7');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'DELETE',
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$res = json_decode(curl_exec($ch), true);
import requests

requests.delete("https://protasks.ru/api/v1/personal/notes/7", headers={"Authorization": "Bearer ptk_<API_KEY>"})
await fetch('https://protasks.ru/api/v1/personal/notes/7', {
  method: 'DELETE',
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
Ответ
{
  "ok": true,
  "data": { "id": 7, "deleted": true }
}

Объект «Пространство»

Командное пространство, в котором владелец ключа — создатель или участник. ID пространства — строка в разделе «Обзор», например #611143338. Доступ через API такой же, как на платфорvе: чужие пространства не видны (404 not_found).

В пространствах доступны: пространства — чтение, создание, изменение (название, архив) и удаление; чтение участников; колонки и теги — чтение, создание, изменение и удаление; задачи, подзадачи, заметки, ссылки и база знаний — чтение, создание, изменение и удаление; «Доступы» — только добавление записи; файлы проекта, задач, заметок и статей — список, скачивание, загрузка и удаление.

ПолеТипОписание
idstringID пространства
namestringназвание
archivedbooleanв архиве: такое пространство есть в списке, но задачи, участники и теги не открываются (403 archived), пока его не вернут из архива в приложении
rolestringроль владельца ключа: owner — создатель, member — участник
ownerobjectсоздатель: user_id, name
members_countnumberучастников
lockedbooleanзаблокировано (превышен лимит тарифа создателя или отключено администрацией) — в приложении доступно только чтение
created_atstringвремя создания, ISO 8601
Объект «Пространство»
{
  "id": "611148238",
  "name": "Отдел продаж",
  "archived": false,
  "role": "owner",
  "owner": {
    "user_id": "123456",
    "name": "Иван Петров"
  },
  "members_count": 5,
  "locked": false,
  "created_at": "2026-04-11T21:39:19+03:00"
}

Список пространств

GET/spaces

Все пространства владельца ключа — свои и те, где он участник, включая архивные. Новые сверху, по 50 на страницу.

Параметры

ПараметрТипОписание
pagenumberномер страницы, с 1 (по умолчанию 1)

В ответе meta — как у списка задач: page, per_page, total, pages, has_more.

Запрос
curl https://protasks.ru/api/v1/spaces \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$spaces = json_decode(curl_exec($ch), true)['data'];
import requests

spaces = requests.get("https://protasks.ru/api/v1/spaces",
                      headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: spaces } = await r.json();
Ответ
{
  "ok": true,
  "data": [ { "id": "611148238", "name": "Отдел продаж", "role": "owner", … } ],
  "meta": { "page": 1, "per_page": 50, "total": 3, "pages": 1, "has_more": false }
}

Получить пространство

GET/spaces/{space_id}

Одно пространство — объект «Пространство» и его колонки statuses (как в методе колонок). Работает и для архивного.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
Запрос
curl https://protasks.ru/api/v1/spaces/611148238 \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$space = json_decode(curl_exec($ch), true)['data'];
import requests

space = requests.get("https://protasks.ru/api/v1/spaces/611148238",
                     headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: space } = await r.json();
Ответ
{ "ok": true, "data": { "id": "611148238", "name": "Отдел продаж", …, "statuses": [ … ] } }

Создать пространство

POST/spaces

Создаёт пространство с обычными колонками (Новая, В работе, Закрыта, Отменена); владелец ключа — создатель и участник. Ответ — 201 и пространство с колонками, как в «Получить пространство».

Права ключа: «чтение и изменение». Количество пространств ограничено тарифом создателя (архивные не считаются), иначе — 400 rejected с текстом приложения.

Тело запроса

ПараметрТипОписание
namestringназвание, до 100 символов
Запрос
curl -X POST https://protasks.ru/api/v1/spaces \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"name": "Маркетинг"}'
$ch = curl_init('https://protasks.ru/api/v1/spaces');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'name' => 'Маркетинг',
    ]),
]);
$space = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.post("https://protasks.ru/api/v1/spaces",
                  headers={"Authorization": "Bearer ptk_<API_KEY>"},
                  json={"name": "Маркетинг"})
space = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces', {
  method: 'POST',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "name": "Маркетинг"
  })
});
const { data: space } = await r.json();
Ответ — 201
{
  "ok": true,
  "data": {
    "id": "611148238",
    "name": "Маркетинг",
    "archived": false,
    "role": "owner",
    "owner": {
      "user_id": "123456",
      "name": "Иван Петров"
    },
    "members_count": 1,
    "locked": false,
    "created_at": "2026-10-16T20:36:34+03:00",
    "statuses": [
      {
        "id": 33,
        "name": "Новая",
        "color": "#9333ea",
        "system": false,
        "position": 1
      },
      "…"
    ]
  }
}

Изменить пространство

PATCH/spaces/{space_id}

Переименовывает пространство и/или отправляет его в архив или возвращает из архива. Работает и для архивного пространства. Ответ — пространство после изменения.

Вернуть из архива можно, только если на тарифе есть свободное место (иначе 400 rejected). В архив пространство уходит только по этому запросу: само по себе ничего в архив не попадает.

Права ключа: «чтение и изменение». Менять и удалять пространство может только создатель (как в приложении), иначе — 403 forbidden.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении

Тело запроса

ПараметрТипОписание
namestringновое название, до 100 символов
archivedbooleantrue — в архив, false — вернуть из архива
Запрос
curl -X PATCH https://protasks.ru/api/v1/spaces/611148238 \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"name": "Маркетинг 2026"}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'PATCH',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'name' => 'Маркетинг 2026',
    ]),
]);
$space = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.patch("https://protasks.ru/api/v1/spaces/611148238",
                   headers={"Authorization": "Bearer ptk_<API_KEY>"},
                   json={"name": "Маркетинг 2026"})
space = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238', {
  method: 'PATCH',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "name": "Маркетинг 2026"
  })
});
const { data: space } = await r.json();
Ответ
{
  "ok": true,
  "data": {
    "id": "611148238",
    "name": "Маркетинг 2026",
    "archived": false,
    "role": "owner",
    "owner": {
      "user_id": "123456",
      "name": "Иван Петров"
    },
    "members_count": 1,
    "locked": false,
    "created_at": "2026-10-16T20:36:34+03:00",
    "statuses": [
      {
        "id": 33,
        "name": "Новая",
        "color": "#9333ea",
        "system": false,
        "position": 1
      },
      "…"
    ]
  }
}

Удалить пространство

DELETE/spaces/{space_id}?confirm_name={название}

Удаляет пространство вместе со всеми данными: задачи и подзадачи, заметки, базу знаний, ссылки, доступы, файлы, участников и приглашения. Восстановить нельзя. Чтобы случайно не удалить не то, в confirm_name нужно передать точное текущее название пространства — иначе 400 validation.

Права ключа: «чтение и изменение». Менять и удалять пространство может только создатель (как в приложении), иначе — 403 forbidden.

Параметры

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
confirm_namestringточное название пространства — в параметре запроса
Запрос
curl -X DELETE https://protasks.ru/api/v1/spaces/611148238?confirm_name=%D0%9C%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%B8%D0%BD%D0%B3 \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238?confirm_name=%D0%9C%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%B8%D0%BD%D0%B3');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'DELETE',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$res = json_decode(curl_exec($ch), true);
import requests

r = requests.delete("https://protasks.ru/api/v1/spaces/611148238?confirm_name=%D0%9C%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%B8%D0%BD%D0%B3",
                    headers={"Authorization": "Bearer ptk_<API_KEY>"})
await fetch('https://protasks.ru/api/v1/spaces/611148238?confirm_name=%D0%9C%D0%B0%D1%80%D0%BA%D0%B5%D1%82%D0%B8%D0%BD%D0%B3', {
  method: 'DELETE',
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
Ответ
{
  "ok": true,
  "data": {
    "id": "611148238",
    "deleted": true
  }
}

Колонки (статусы)

GET/spaces/{space_id}/statuses

Колонки канбана пространства по порядку. Статус задачи пространства — это её колонка: status_id задачи = id колонки.

ID колонки постоянный — не меняется, если колонку переименовали или передвинули. У стандартных колонок ID те же, что у статусов личных задач: 33 Новая, 66 В работе, 99 Закрыта, 100 Отменена. Свои колонки получают 101, 102 и т.д.; ID удалённой колонки больше не выдаётся.

Колонки 99 «Закрыта» и 100 «Отменена» есть в каждом пространстве (system: true): их нельзя переименовать или удалить, они всегда последние. «Новая» и «В работе» создатель может переименовать — ID останутся 33 и 66.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении

Ответ — массив колонок

ПолеТипОписание
idnumberID колонки
namestringназвание
colorstringцвет, #rrggbb
systembooleanсистемная («Закрыта», «Отменена»)
positionnumberместо слева направо, с 1
Запрос
curl https://protasks.ru/api/v1/spaces/611148238/statuses \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/statuses');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$statuses = json_decode(curl_exec($ch), true)['data'];
import requests

statuses = requests.get("https://protasks.ru/api/v1/spaces/611148238/statuses",
                        headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/statuses', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: statuses } = await r.json();
Ответ
{
  "ok": true,
  "data": [
    {
      "id": 33,
      "name": "Новая",
      "color": "#9333ea",
      "system": false,
      "position": 1
    },
    {
      "id": 66,
      "name": "В работе",
      "color": "#5dcaa5",
      "system": false,
      "position": 2
    },
    {
      "id": 101,
      "name": "На проверке",
      "color": "#f59e0b",
      "system": false,
      "position": 3
    },
    {
      "id": 99,
      "name": "Закрыта",
      "color": "#34d399",
      "system": true,
      "position": 4
    },
    {
      "id": 100,
      "name": "Отменена",
      "color": "#f87171",
      "system": true,
      "position": 5
    }
  ]
}

Участники

GET/spaces/{space_id}/members

Участники пространства, создатель — первым. user_id участника используется в фильтрах задач (assignee_id, author_id).

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении

Ответ — массив участников

ПолеТипОписание
user_idstringID пользователя
namestring или nullимя
rolestringowner — создатель, member — участник
lockedbooleanучастник сверх лимита тарифа пространства — может только читать
joined_atstringкогда вступил, ISO 8601
Запрос
curl https://protasks.ru/api/v1/spaces/611148238/members \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/members');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$members = json_decode(curl_exec($ch), true)['data'];
import requests

members = requests.get("https://protasks.ru/api/v1/spaces/611148238/members",
                       headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/members', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: members } = await r.json();
Ответ
{
  "ok": true,
  "data": [
    {
      "user_id": "123456",
      "name": "Иван Петров",
      "role": "owner",
      "locked": false,
      "joined_at": "2026-04-11T21:39:19+03:00"
    },
    {
      "user_id": "654321",
      "name": "Анна",
      "role": "member",
      "locked": false,
      "joined_at": "2026-04-22T14:15:07+03:00"
    }
  ]
}

Теги

GET/spaces/{space_id}/tags

Теги задач пространства. В задаче теги приходят списком названий (tags), фильтр списка задач — tag по названию.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении

Ответ — массив тегов

ПолеТипОписание
namestringназвание, уникально в пространстве
colorstringцвет, #rrggbb
Запрос
curl https://protasks.ru/api/v1/spaces/611148238/tags \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/tags');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$tags = json_decode(curl_exec($ch), true)['data'];
import requests

tags = requests.get("https://protasks.ru/api/v1/spaces/611148238/tags",
                    headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/tags', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: tags } = await r.json();
Ответ
{
  "ok": true,
  "data": [
    {
      "name": "Оплаты",
      "color": "#ec4899"
    },
    {
      "name": "Сайт",
      "color": "#9333ea"
    }
  ]
}

Добавить колонку

POST/spaces/{space_id}/statuses

Добавляет колонку перед «Закрыта» и «Отменена». Колонка получает постоянный ID — 101, 102 и т.д. Ответ — 201 и колонка.

Права ключа: «чтение и изменение». Менять колонки может только создатель пространства (как в приложении), иначе — 403 forbidden.

Своих колонок (кроме «Закрыта» и «Отменена») — не больше 3 на тарифе Free и 10 на Pro и Business (по тарифу создателя), иначе — 400 rejected.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении

Тело запроса

ПараметрТипОписание
namestringназвание, до 30 символов, не повторяет существующие
colorstringцвет #rrggbb, по умолчанию #9333ea
Запрос
curl -X POST https://protasks.ru/api/v1/spaces/611148238/statuses \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"name": "На проверке", "color": "#f59e0b"}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/statuses');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'name' => 'На проверке',
        'color' => '#f59e0b',
    ]),
]);
$status = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.post("https://protasks.ru/api/v1/spaces/611148238/statuses",
                  headers={"Authorization": "Bearer ptk_<API_KEY>"},
                  json={"name": "На проверке", "color": "#f59e0b"})
status = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/statuses', {
  method: 'POST',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "name": "На проверке",
    "color": "#f59e0b"
  })
});
const { data: status } = await r.json();
Ответ — 201
{
  "ok": true,
  "data": {
    "id": 101,
    "name": "На проверке",
    "color": "#f59e0b",
    "system": false,
    "position": 3
  }
}

Изменить колонку

PATCH/spaces/{space_id}/statuses/{status_id}

Переименовывает колонку и/или меняет цвет. ID не меняется, задачи остаются в колонке. «Закрыта» (99) и «Отменена» (100) не меняются. Ответ — колонка после изменения.

Права ключа: «чтение и изменение». Менять колонки может только создатель пространства (как в приложении), иначе — 403 forbidden.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
status_idnumberID колонки — колонки пространства

Тело запроса

ПараметрТипОписание
namestringновое название, до 30 символов
colorstringцвет #rrggbb
Запрос
curl -X PATCH https://protasks.ru/api/v1/spaces/611148238/statuses/101 \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"name": "Проверка"}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/statuses/101');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'PATCH',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'name' => 'Проверка',
    ]),
]);
$status = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.patch("https://protasks.ru/api/v1/spaces/611148238/statuses/101",
                   headers={"Authorization": "Bearer ptk_<API_KEY>"},
                   json={"name": "Проверка"})
status = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/statuses/101', {
  method: 'PATCH',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "name": "Проверка"
  })
});
const { data: status } = await r.json();
Ответ
{
  "ok": true,
  "data": {
    "id": 101,
    "name": "Проверка",
    "color": "#f59e0b",
    "system": false,
    "position": 3
  }
}

Порядок колонок

POST/spaces/{space_id}/statuses/order

Задаёт порядок колонок слева направо. Передайте ID всех колонок, кроме 99 и 100, — они всегда последние. Ответ — все колонки в новом порядке.

Права ключа: «чтение и изменение». Менять колонки может только создатель пространства (как в приложении), иначе — 403 forbidden.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении

Тело запроса

ПараметрТипОписание
idsnumber[]ID колонок в новом порядке
Запрос — «На проверке» первой
curl -X POST https://protasks.ru/api/v1/spaces/611148238/statuses/order \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"ids": [101, 33, 66]}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/statuses/order');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'ids' => [101, 33, 66],
    ]),
]);
$statuses = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.post("https://protasks.ru/api/v1/spaces/611148238/statuses/order",
                  headers={"Authorization": "Bearer ptk_<API_KEY>"},
                  json={"ids": [101, 33, 66]})
statuses = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/statuses/order', {
  method: 'POST',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "ids": [
      101,
      33,
      66
    ]
  })
});
const { data: statuses } = await r.json();
Ответ
{ "ok": true, "data": [ { "id": 101, "position": 1, … }, … ] }

Удалить колонку

DELETE/spaces/{space_id}/statuses/{status_id}

Удаляет пустую колонку. Если в ней есть задачи — 400 rejected: сначала перенесите их в другую колонку (изменить задачу, status_id). Должна остаться хотя бы одна колонка, кроме «Закрыта» и «Отменена». ID удалённой колонки больше не выдаётся.

Права ключа: «чтение и изменение». Менять колонки может только создатель пространства (как в приложении), иначе — 403 forbidden.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
status_idnumberID колонки — колонки пространства
Запрос
curl -X DELETE https://protasks.ru/api/v1/spaces/611148238/statuses/101 \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/statuses/101');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'DELETE',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$res = json_decode(curl_exec($ch), true);
import requests

r = requests.delete("https://protasks.ru/api/v1/spaces/611148238/statuses/101",
                    headers={"Authorization": "Bearer ptk_<API_KEY>"})
await fetch('https://protasks.ru/api/v1/spaces/611148238/statuses/101', {
  method: 'DELETE',
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
Ответ
{
  "ok": true,
  "data": {
    "id": 101,
    "deleted": true
  }
}

Добавить тег

POST/spaces/{space_id}/tags

Создаёт тег пространства — потом его можно ставить задачам (tags). Добавлять теги может любой участник. Тег с таким названием уже есть — вернётся он (200), новый — 201. Права ключа: «чтение и изменение».

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении

Тело запроса

ПараметрТипОписание
namestringназвание, до 40 символов
colorstringцвет #rrggbb, по умолчанию #9333ea
Запрос
curl -X POST https://protasks.ru/api/v1/spaces/611148238/tags \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"name": "Срочно", "color": "#ef4444"}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/tags');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'name' => 'Срочно',
        'color' => '#ef4444',
    ]),
]);
$tag = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.post("https://protasks.ru/api/v1/spaces/611148238/tags",
                  headers={"Authorization": "Bearer ptk_<API_KEY>"},
                  json={"name": "Срочно", "color": "#ef4444"})
tag = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/tags', {
  method: 'POST',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "name": "Срочно",
    "color": "#ef4444"
  })
});
const { data: tag } = await r.json();
Ответ — 201
{
  "ok": true,
  "data": {
    "name": "Срочно",
    "color": "#ef4444"
  }
}

Удалить тег

DELETE/spaces/{space_id}/tags?name={название}

Удаляет тег и убирает его из всех задач пространства. Удалять теги может любой участник. Права ключа: «чтение и изменение».

Параметры

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
namestringназвание тега — в параметре запроса
Запрос
curl -X DELETE https://protasks.ru/api/v1/spaces/611148238/tags?name=%D0%A1%D1%80%D0%BE%D1%87%D0%BD%D0%BE \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/tags?name=%D0%A1%D1%80%D0%BE%D1%87%D0%BD%D0%BE');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'DELETE',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$res = json_decode(curl_exec($ch), true);
import requests

r = requests.delete("https://protasks.ru/api/v1/spaces/611148238/tags?name=%D0%A1%D1%80%D0%BE%D1%87%D0%BD%D0%BE",
                    headers={"Authorization": "Bearer ptk_<API_KEY>"})
await fetch('https://protasks.ru/api/v1/spaces/611148238/tags?name=%D0%A1%D1%80%D0%BE%D1%87%D0%BD%D0%BE', {
  method: 'DELETE',
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
Ответ
{
  "ok": true,
  "data": {
    "name": "Срочно",
    "deleted": true
  }
}

Объект «Задача пространства»

ID задачи — её номер (как «#562» в приложении). Номера сквозные по всем пространствам и не повторяются, даже если задачу удалили. Задача запрашивается по номеру внутри своего пространства: /spaces/{space_id}/tasks/{id}.

Поля — как у личной задачи, плюс теги, ответственные, автор и подзадачи.

ПолеТипОписание
idnumberномер задачи
titlestringназвание
descriptionstring или nullописание
status_idnumber или nullID колонки — см. колонки; null — задача в колонке, которой уже нет
statusstringназвание колонки — только в ответе
priority_idnumber или null10 Низкий, 20 Средний, 30 Высокий — как у личных; null — без приоритета
prioritystring или nullназвание приоритета — только в ответе
tagsstring[]названия тегов — см. теги
assigneesobject[]ответственные: user_id, name
authorobject или nullкто поставил задачу: user_id, name
deadlinestring или nullдата дедлайна, YYYY-MM-DD
deadline_timestring или nullвремя дедлайна, HH:MM (московское)
remind_beforenumber или nullнапомнить за N минут до дедлайна
repeatobject или nullправило повтора — как у личных
repeat_countnumberсколько раз регулярная задача уже выполнена
require_subtasks_donebooleanзадачу нельзя закрыть, пока не закрыты все подзадачи
subtasks_totalnumberподзадач всего
subtasks_donenumberподзадач закрыто или отменено
linksobject[]связи с другими задачами пространства, только в ответах «Получить», «Создать» и «Изменить» (не в списке). У связи: id; type — blocks (эта блокирует вторую), blocked_by (эту блокирует вторая) или related; task — вторая задача (id — номер, title, status); open — вторая задача ещё не закрыта и не отменена
subtasksobject[]подзадачи — только в получении задачи
created_at, updated_atstringвремя создания и изменения, ISO 8601
closed_atstring или nullкогда закрыли

Подзадача

Те же поля, кроме repeat, repeat_count, require_subtasks_done, subtasks_*. ID подзадачи — её номер в API: сквозной, не повторяется. В приложении у подзадач номера нет — он есть только в API.

Объект «Задача пространства»
{
  "id": 562,
  "title": "Оплатить хостинг",
  "description": "Счёт во вложении",
  "status_id": 101,
  "status": "На проверке",
  "priority_id": 30,
  "priority": "Высокий",
  "tags": [
    "Оплаты"
  ],
  "assignees": [
    {
      "user_id": "654321",
      "name": "Анна"
    }
  ],
  "author": {
    "user_id": "123456",
    "name": "Иван Петров"
  },
  "deadline": "2026-10-20",
  "deadline_time": "15:00",
  "remind_before": 60,
  "repeat": null,
  "repeat_count": 0,
  "require_subtasks_done": true,
  "subtasks_total": 2,
  "subtasks_done": 1,
  "created_at": "2026-10-12T21:40:45+03:00",
  "updated_at": "2026-10-14T10:02:11+03:00",
  "closed_at": null
}
Подзадача
{
  "id": 17,
  "title": "Получить счёт",
  "description": null,
  "status_id": 99,
  "status": "Закрыта",
  "priority_id": null,
  "priority": null,
  "tags": [],
  "assignees": [
    {
      "user_id": "654321",
      "name": "Анна"
    }
  ],
  "author": {
    "user_id": "123456",
    "name": "Иван Петров"
  },
  "deadline": null,
  "deadline_time": null,
  "remind_before": null,
  "created_at": "2026-10-12T21:45:02+03:00",
  "updated_at": "2026-10-13T09:12:40+03:00",
  "closed_at": "2026-10-13T09:12:40+03:00"
}

Список задач

GET/spaces/{space_id}/tasks

Задачи пространства с фильтрами и сортировкой, по умолчанию новые сверху, по 50 на страницу. Подзадачи в список не входят — они приходят в получении задачи, а в списке есть их счётчики subtasks_total и subtasks_done.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении

Фильтры

Все необязательные и сочетаются друг с другом.

ПараметрТипОписание
status_idstringколонка или несколько через запятую: 33, 33,101 — ID колонок пространства
priority_idstringприоритет или несколько через запятую: 30, 20,30
assignee_idstringзадачи, где этот участник — ответственный (user_id из участников)
author_idstringзадачи, которые поставил этот участник
tagstringзадачи с этим тегом, по названию
deadline_fromstringдедлайн не раньше этой даты (включительно)
deadline_tostringдедлайн не позже этой даты (включительно)
has_deadlinebooleantrue — только с дедлайном, false — только без
created_fromstringсоздана не раньше
created_tostringсоздана не позже (включительно)

Даты — YYYY-MM-DD или unix-время в секундах.

Сортировка и страницы

Так же, как у личных задач: sort — id, deadline, created_at, updated_at, priority; order — asc или desc; page — номер страницы.

Запрос — открытые задачи Анны, ближайший дедлайн сначала
curl "https://protasks.ru/api/v1/spaces/611148238/tasks?status_id=33,66,101&assignee_id=654321&sort=deadline" \
  -H "Authorization: Bearer ptk_<API_KEY>"
$url = 'https://protasks.ru/api/v1/spaces/611148238/tasks?' . http_build_query([
    'status_id' => '33,66,101',
    'assignee_id' => '654321',
    'sort' => 'deadline',
]);
$ch = curl_init($url);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$tasks = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.get("https://protasks.ru/api/v1/spaces/611148238/tasks",
                 params={"status_id": "33,66,101", "assignee_id": "654321", "sort": "deadline"},
                 headers={"Authorization": "Bearer ptk_<API_KEY>"})
tasks = r.json()["data"]
const url = 'https://protasks.ru/api/v1/spaces/611148238/tasks?' + new URLSearchParams({ status_id: '33,66,101', assignee_id: '654321', sort: 'deadline' });
const r = await fetch(url, { headers: { Authorization: 'Bearer ptk_<API_KEY>' } });
const { data: tasks, meta } = await r.json();
Ответ
{
  "ok": true,
  "data": [ { "id": 562, "title": "Оплатить хостинг", "status_id": 101, "status": "На проверке", … } ],
  "meta": { "page": 1, "per_page": 50, "total": 12, "pages": 1, "has_more": false }
}

Получить задачу

GET/spaces/{space_id}/tasks/{id}

Одна задача по номеру — с подзадачами (subtasks) и связями (links). Задачи с таким номером нет в этом пространстве — 404 not_found.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
idnumberномер задачи
Запрос
curl https://protasks.ru/api/v1/spaces/611148238/tasks/562 \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/tasks/562');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$task = json_decode(curl_exec($ch), true)['data'];
import requests

task = requests.get("https://protasks.ru/api/v1/spaces/611148238/tasks/562",
                    headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/tasks/562', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: task } = await r.json();
Ответ
{ "ok": true, "data": { "id": 562, …, "subtasks": [ { "id": 17, "title": "Получить счёт", … } ] } }

Создать задачу

POST/spaces/{space_id}/tasks

Создаёт задачу в пространстве. Автор — владелец ключа. Ответ — 201 и созданная задача с присвоенным номером.

Права ключа: «чтение и изменение». Всё работает так же, как в приложении: участникам уходят уведомления (Telegram, MAX, почта, push — по их настройкам), изменения попадают в историю задачи, действуют лимиты тарифа.

Ответственным приходит уведомление о новой задаче (себе — нет).

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении

Тело запроса

ПараметрТипОписание
titlestringназвание, до 500 символов
descriptionstring или nullописание
status_idnumberID колонки; по умолчанию — первая колонка. Нельзя создать сразу в 99 или 100
priority_idnumber или null10, 20, 30 или null — без приоритета
tagsstring[] или nullназвания тегов — теги пространства; новые теги создаются в приложении
assignee_idsstring[] или nullответственные — user_id участников; сколько можно — зависит от тарифа
deadlinestring или nullдата дедлайна, YYYY-MM-DD; null — убрать дедлайн
deadline_timestring или nullвремя дедлайна, HH:MM (московское)
remind_beforenumber или nullнапомнить за N минут: 15, 30, 60, 120, 720, 1440, 2880, 10080 (кроме 15 — на тарифе Pro создателя пространства). Только при дате и времени дедлайна
repeatobject или nullправило повтора — как у личных
require_subtasks_donebooleanнельзя закрыть задачу, пока не закрыты все подзадачи. Задаётся только при создании
link_tasknumberномер второй задачи этого пространства, с которой связать эту. Задаётся вместе с link_type
link_typestring или nullвид связи: blocks — эта задача блокирует вторую (вторую нельзя закрыть, пока не закрыта эта); blocked_by — эту задачу блокирует вторая; related — просто связаны. При изменении null убирает связь с задачей link_task
Запрос
curl -X POST https://protasks.ru/api/v1/spaces/611148238/tasks \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"title": "Подготовить отчёт", "status_id": 33, "priority_id": 20, "tags": ["Оплаты"], "assignee_ids": ["654321"], "deadline": "2026-10-25", "deadline_time": "18:00", "remind_before": 60}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/tasks');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'title' => 'Подготовить отчёт',
        'status_id' => 33,
        'priority_id' => 20,
        'tags' => ['Оплаты'],
        'assignee_ids' => ['654321'],
        'deadline' => '2026-10-25',
        'deadline_time' => '18:00',
        'remind_before' => 60,
    ]),
]);
$task = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.post("https://protasks.ru/api/v1/spaces/611148238/tasks",
                  headers={"Authorization": "Bearer ptk_<API_KEY>"},
                  json={"title": "Подготовить отчёт", "status_id": 33, "priority_id": 20, "tags": ["Оплаты"], "assignee_ids": ["654321"], "deadline": "2026-10-25", "deadline_time": "18:00", "remind_before": 60})
task = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/tasks', {
  method: 'POST',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "title": "Подготовить отчёт",
    "status_id": 33,
    "priority_id": 20,
    "tags": [
      "Оплаты"
    ],
    "assignee_ids": [
      "654321"
    ],
    "deadline": "2026-10-25",
    "deadline_time": "18:00",
    "remind_before": 60
  })
});
const { data: task } = await r.json();
Ответ — 201
{ "ok": true, "data": { "id": 563, "title": "Подготовить отчёт", …, "subtasks": [] } }

Изменить задачу

PATCH/spaces/{space_id}/tasks/{id}

Меняет только переданные поля. Ответ — задача после изменения (с подзадачами).

Права ключа: «чтение и изменение». Всё работает так же, как в приложении: участникам уходят уведомления (Telegram, MAX, почта, push — по их настройкам), изменения попадают в историю задачи, действуют лимиты тарифа.

Смена колонки — это смена статуса: автору задачи придёт уведомление. Изменили assignee_ids — новым ответственным придёт «вас назначили», снятым — «вас сняли».

Закрыли регулярную задачу (status_id: 99) — она сразу вернётся в первую колонку со следующим дедлайном, в ответе будет repeated: {"next_deadline": "YYYY-MM-DD"} или {"finished": true}. Если у задачи включено «нельзя закрыть без подзадач», а открытые подзадачи есть, — 400 rejected.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
idnumberномер задачи

Тело запроса

ПараметрТипОписание
titlestringназвание
descriptionstring или nullописание
status_idnumberID колонки — колонки пространства
priority_idnumber или null10, 20, 30 или null — без приоритета
tagsstring[] или nullназвания тегов — теги пространства; новые теги создаются в приложении
assignee_idsstring[] или nullответственные — user_id участников; сколько можно — зависит от тарифа
deadlinestring или nullдата дедлайна, YYYY-MM-DD; null — убрать дедлайн
deadline_timestring или nullвремя дедлайна, HH:MM (московское)
remind_beforenumber или nullнапомнить за N минут: 15, 30, 60, 120, 720, 1440, 2880, 10080 (кроме 15 — на тарифе Pro создателя пространства). Только при дате и времени дедлайна
repeatobject или nullправило повтора — как у личных
link_tasknumberномер второй задачи этого пространства, с которой связать эту. Задаётся вместе с link_type
link_typestring или nullвид связи: blocks — эта задача блокирует вторую (вторую нельзя закрыть, пока не закрыта эта); blocked_by — эту задачу блокирует вторая; related — просто связаны. При изменении null убирает связь с задачей link_task

require_subtasks_done после создания не меняется.

Связи. Пока блокирующая задача не закрыта, заблокированную нельзя ни закрыть, ни отменить: смена статуса вернёт 400 rejected с текстом «Нельзя закрыть — сначала нужно закрыть связанные задачи: #N». Связываются только обычные задачи (не подзадачи) одного пространства; между двумя задачами одна связь, на задачу — до 30; замкнутый круг запрещён, регулярная задача не может блокировать другие. Связи приходят в поле links ответа.

Запрос — закрыть задачу
curl -X PATCH https://protasks.ru/api/v1/spaces/611148238/tasks/562 \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"status_id": 99}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/tasks/562');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'PATCH',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'status_id' => 99,
    ]),
]);
$task = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.patch("https://protasks.ru/api/v1/spaces/611148238/tasks/562",
                   headers={"Authorization": "Bearer ptk_<API_KEY>"},
                   json={"status_id": 99})
task = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/tasks/562', {
  method: 'PATCH',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "status_id": 99
  })
});
const { data: task } = await r.json();
Ответ
{ "ok": true, "data": { "id": 562, "status_id": 99, "status": "Закрыта", … } }

Удалить задачу

DELETE/spaces/{space_id}/tasks/{id}

Удаляет задачу вместе с подзадачами, историей, чатом и файлами — без возможности восстановить. Как в приложении, удалить может только автор задачи, иначе — 403 forbidden. Номер удалённой задачи больше не выдаётся.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
idnumberномер задачи
Запрос
curl -X DELETE https://protasks.ru/api/v1/spaces/611148238/tasks/562 \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/tasks/562');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'DELETE',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$res = json_decode(curl_exec($ch), true);
import requests

r = requests.delete("https://protasks.ru/api/v1/spaces/611148238/tasks/562",
                    headers={"Authorization": "Bearer ptk_<API_KEY>"})
await fetch('https://protasks.ru/api/v1/spaces/611148238/tasks/562', {
  method: 'DELETE',
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
Ответ
{
  "ok": true,
  "data": {
    "id": 562,
    "deleted": true
  }
}

Получить подзадачу

GET/spaces/{space_id}/tasks/{id}/subtasks/{sub_id}

Одна подзадача — объект «Подзадача». Все подзадачи задачи приходят в получении задачи (subtasks).

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
idnumberномер задачи
sub_idnumberID подзадачи — номер в API
Запрос
curl https://protasks.ru/api/v1/spaces/611148238/tasks/562/subtasks/17 \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/tasks/562/subtasks/17');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$subtask = json_decode(curl_exec($ch), true)['data'];
import requests

subtask = requests.get("https://protasks.ru/api/v1/spaces/611148238/tasks/562/subtasks/17",
                       headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/tasks/562/subtasks/17', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: subtask } = await r.json();
Ответ
{ "ok": true, "data": { "id": 17, "title": "Получить счёт", … } }

Добавить подзадачу

POST/spaces/{space_id}/tasks/{id}/subtasks

Добавляет подзадачу к задаче — не больше 10 на задачу, подзадачу к подзадаче добавить нельзя. Ответ — 201 и подзадача с присвоенным ID. Права ключа: «чтение и изменение».

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
idnumberномер задачи

Тело запроса

ПараметрТипОписание
titlestringназвание, до 500 символов
descriptionstring или nullописание
status_idnumberID колонки; по умолчанию — первая колонка
priority_idnumber или null10, 20, 30 или null — без приоритета
tagsstring[] или nullназвания тегов — теги пространства; новые теги создаются в приложении
assignee_idsstring[] или nullответственные — user_id участников; сколько можно — зависит от тарифа
deadlinestring или nullдата дедлайна, YYYY-MM-DD; null — убрать дедлайн
deadline_timestring или nullвремя дедлайна, HH:MM (московское)
remind_beforenumber или nullнапомнить за N минут: 15, 30, 60, 120, 720, 1440, 2880, 10080 (кроме 15 — на тарифе Pro создателя пространства). Только при дате и времени дедлайна
Запрос
curl -X POST https://protasks.ru/api/v1/spaces/611148238/tasks/562/subtasks \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"title": "Собрать цифры", "assignee_ids": ["654321"]}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/tasks/562/subtasks');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'title' => 'Собрать цифры',
        'assignee_ids' => ['654321'],
    ]),
]);
$subtask = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.post("https://protasks.ru/api/v1/spaces/611148238/tasks/562/subtasks",
                  headers={"Authorization": "Bearer ptk_<API_KEY>"},
                  json={"title": "Собрать цифры", "assignee_ids": ["654321"]})
subtask = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/tasks/562/subtasks', {
  method: 'POST',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "title": "Собрать цифры",
    "assignee_ids": [
      "654321"
    ]
  })
});
const { data: subtask } = await r.json();
Ответ — 201
{ "ok": true, "data": { "id": 18, "title": "Собрать цифры", … } }

Изменить подзадачу

PATCH/spaces/{space_id}/tasks/{id}/subtasks/{sub_id}

Меняет только переданные поля — те же, что у задачи, кроме repeat. Закрыть подзадачу — status_id: 99; смена статуса подзадачи видна и в истории задачи. Ответ — подзадача после изменения. Права ключа: «чтение и изменение».

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
idnumberномер задачи
sub_idnumberID подзадачи — номер в API

Тело запроса

ПараметрТипОписание
titlestringназвание
descriptionstring или nullописание
status_idnumberID колонки — колонки пространства
priority_idnumber или null10, 20, 30 или null — без приоритета
tagsstring[] или nullназвания тегов — теги пространства; новые теги создаются в приложении
assignee_idsstring[] или nullответственные — user_id участников; сколько можно — зависит от тарифа
deadlinestring или nullдата дедлайна, YYYY-MM-DD; null — убрать дедлайн
deadline_timestring или nullвремя дедлайна, HH:MM (московское)
remind_beforenumber или nullнапомнить за N минут: 15, 30, 60, 120, 720, 1440, 2880, 10080 (кроме 15 — на тарифе Pro создателя пространства). Только при дате и времени дедлайна
Запрос — отметить выполненной
curl -X PATCH https://protasks.ru/api/v1/spaces/611148238/tasks/562/subtasks/17 \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"status_id": 99}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/tasks/562/subtasks/17');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'PATCH',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'status_id' => 99,
    ]),
]);
$subtask = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.patch("https://protasks.ru/api/v1/spaces/611148238/tasks/562/subtasks/17",
                   headers={"Authorization": "Bearer ptk_<API_KEY>"},
                   json={"status_id": 99})
subtask = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/tasks/562/subtasks/17', {
  method: 'PATCH',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "status_id": 99
  })
});
const { data: subtask } = await r.json();
Ответ
{ "ok": true, "data": { "id": 17, "status_id": 99, … } }

Удалить подзадачу

DELETE/spaces/{space_id}/tasks/{id}/subtasks/{sub_id}

Удаляет подзадачу без возможности восстановить. Удалить может только тот, кто её добавил, иначе — 403 forbidden.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
idnumberномер задачи
sub_idnumberID подзадачи — номер в API
Запрос
curl -X DELETE https://protasks.ru/api/v1/spaces/611148238/tasks/562/subtasks/17 \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/tasks/562/subtasks/17');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'DELETE',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$res = json_decode(curl_exec($ch), true);
import requests

r = requests.delete("https://protasks.ru/api/v1/spaces/611148238/tasks/562/subtasks/17",
                    headers={"Authorization": "Bearer ptk_<API_KEY>"})
await fetch('https://protasks.ru/api/v1/spaces/611148238/tasks/562/subtasks/17', {
  method: 'DELETE',
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
Ответ
{
  "ok": true,
  "data": {
    "id": 17,
    "deleted": true
  }
}

Объект «Заметка пространства»

Заметка в разделе «Заметки» пространства. ID заметки — её номер в пространстве (как «#3» в приложении): у каждого пространства своя нумерация, номера не повторяются, даже если заметку удалили. Создавать, менять и удалять заметки может любой участник.

ПолеТипОписание
idnumberномер заметки в пространстве
titlestringзаголовок, до 200 символов
textstring или nullтекст
authorobject или nullкто создал: user_id, name
created_at, updated_atstringвремя создания и изменения, ISO 8601
Объект «Заметка пространства»
{
  "id": 3,
  "title": "Регламент созвонов",
  "text": "По понедельникам в 10:00",
  "author": {
    "user_id": "123456",
    "name": "Иван Петров"
  },
  "created_at": "2026-10-12T21:40:45+03:00",
  "updated_at": "2026-10-14T10:02:11+03:00"
}

Список заметок

GET/spaces/{space_id}/notes

Заметки пространства, по умолчанию — недавно изменённые сверху (как в приложении), по 50 на страницу.

Параметры

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
sortstringupdated_at — по изменению (по умолчанию), created_at — по созданию, id — по номеру
orderstringdesc (по умолчанию) или asc
pagenumberномер страницы, с 1
Запрос
curl https://protasks.ru/api/v1/spaces/611148238/notes \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/notes');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$notes = json_decode(curl_exec($ch), true)['data'];
import requests

notes = requests.get("https://protasks.ru/api/v1/spaces/611148238/notes",
                     headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/notes', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: notes } = await r.json();
Ответ
{
  "ok": true,
  "data": [ { "id": 3, "title": "Регламент созвонов", … } ],
  "meta": { "page": 1, "per_page": 50, "total": 1, "pages": 1, "has_more": false }
}

Получить заметку

GET/spaces/{space_id}/notes/{id}

Одна заметка по номеру. Нет такой — 404 not_found.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
idnumberномер заметки
Запрос
curl https://protasks.ru/api/v1/spaces/611148238/notes/3 \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/notes/3');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$note = json_decode(curl_exec($ch), true)['data'];
import requests

note = requests.get("https://protasks.ru/api/v1/spaces/611148238/notes/3",
                    headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/notes/3', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: note } = await r.json();
Ответ
{
  "ok": true,
  "data": {
    "id": 3,
    "title": "Регламент созвонов",
    "text": "По понедельникам в 10:00",
    "author": {
      "user_id": "123456",
      "name": "Иван Петров"
    },
    "created_at": "2026-10-12T21:40:45+03:00",
    "updated_at": "2026-10-14T10:02:11+03:00"
  }
}

Создать заметку

POST/spaces/{space_id}/notes

Создаёт заметку в пространстве, автор — владелец ключа. Ответ — 201 и заметка с присвоенным номером.

Права ключа: «чтение и изменение». Изменения попадают в историю заметки, как в приложении.

Тело запроса

ПараметрТипОписание
titlestringзаголовок, до 200 символов
textstring или nullтекст
Запрос
curl -X POST https://protasks.ru/api/v1/spaces/611148238/notes \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"title": "Регламент созвонов", "text": "По понедельникам в 10:00"}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/notes');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'title' => 'Регламент созвонов',
        'text' => 'По понедельникам в 10:00',
    ]),
]);
$note = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.post("https://protasks.ru/api/v1/spaces/611148238/notes",
                  headers={"Authorization": "Bearer ptk_<API_KEY>"},
                  json={"title": "Регламент созвонов", "text": "По понедельникам в 10:00"})
note = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/notes', {
  method: 'POST',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "title": "Регламент созвонов",
    "text": "По понедельникам в 10:00"
  })
});
const { data: note } = await r.json();
Ответ — 201
{
  "ok": true,
  "data": {
    "id": 3,
    "title": "Регламент созвонов",
    "text": "По понедельникам в 10:00",
    "author": {
      "user_id": "123456",
      "name": "Иван Петров"
    },
    "created_at": "2026-10-12T21:40:45+03:00",
    "updated_at": "2026-10-14T10:02:11+03:00"
  }
}

Изменить заметку

PATCH/spaces/{space_id}/notes/{id}

Меняет только переданные поля. Чтобы очистить текст — "text": null. Ответ — заметка после изменения.

Права ключа: «чтение и изменение». Изменения попадают в историю заметки, как в приложении.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
idnumberномер заметки

Тело запроса

ПараметрТипОписание
titlestringзаголовок
textstring или nullтекст
Запрос
curl -X PATCH https://protasks.ru/api/v1/spaces/611148238/notes/3 \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"text": "По понедельникам в 11:00"}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/notes/3');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'PATCH',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'text' => 'По понедельникам в 11:00',
    ]),
]);
$note = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.patch("https://protasks.ru/api/v1/spaces/611148238/notes/3",
                   headers={"Authorization": "Bearer ptk_<API_KEY>"},
                   json={"text": "По понедельникам в 11:00"})
note = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/notes/3', {
  method: 'PATCH',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "text": "По понедельникам в 11:00"
  })
});
const { data: note } = await r.json();
Ответ
{ "ok": true, "data": { "id": 3, "text": "По понедельникам в 11:00", … } }

Удалить заметку

DELETE/spaces/{space_id}/notes/{id}

Удаляет заметку вместе с историей и файлами — без возможности восстановить. Номер удалённой заметки больше не выдаётся. Права ключа: «чтение и изменение».

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
idnumberномер заметки
Запрос
curl -X DELETE https://protasks.ru/api/v1/spaces/611148238/notes/3 \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/notes/3');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'DELETE',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$res = json_decode(curl_exec($ch), true);
import requests

r = requests.delete("https://protasks.ru/api/v1/spaces/611148238/notes/3",
                    headers={"Authorization": "Bearer ptk_<API_KEY>"})
await fetch('https://protasks.ru/api/v1/spaces/611148238/notes/3', {
  method: 'DELETE',
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
Ответ
{
  "ok": true,
  "data": {
    "id": 3,
    "deleted": true
  }
}

Сообщения задачи

GET/spaces/{space_id}/comments

Сообщения из чата задачи, новые сверху, по 50 на страницу. Номер задачи — обязательный параметр task. Только чтение: писать в чат задачи через API пока нельзя.

Параметры

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
tasknumberномер задачи этого пространства (поле id задачи) — вернутся сообщения из её чата
pagenumberномер страницы, с 1

Объект «Сообщение»

ПолеТипОписание
idstringID сообщения
taskobject | nullзадача, к которой относится сообщение: id (номер) и title; null, если задачу уже удалили
authorobject | nullавтор: user_id и name
textstringтекст сообщения
created_atstringкогда отправлено, ISO 8601
Запрос
curl "https://protasks.ru/api/v1/spaces/611148238/comments?task=12" \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/comments?task=12');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$comments = json_decode(curl_exec($ch), true)['data'];
import requests

comments = requests.get("https://protasks.ru/api/v1/spaces/611148238/comments",
                        params={"task": 12},
                        headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/comments?task=12', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: comments } = await r.json();
Ответ
{
  "ok": true,
  "data": [
    {
      "id": "cfde62550a331077b3869927",
      "task": { "id": 12, "title": "Подготовить договор" },
      "author": { "user_id": "935806", "name": "Анна Петрова" },
      "text": "Договор отправлен клиенту",
      "created_at": "2026-10-20T23:44:37+03:00"
    }
  ],
  "meta": { "page": 1, "per_page": 50, "total": 1, "pages": 1, "has_more": false }
}

Объект «Статья базы знаний»

Запись раздела «Проект → База знаний». ID статьи — её номер в пространстве (как «#5» в приложении): у каждого пространства своя нумерация, номера не повторяются, даже если статью удалили. Работать со статьями, разделами и тегами может любой участник.

ПолеТипОписание
idnumberномер статьи в пространстве
titlestringзаголовок, до 200 символов
textstring или nullтекст
section_idstring или nullID раздела (колонки БЗ)
sectionstring или nullназвание раздела
tagsobject[]теги статьи: name, color
authorobject или nullкто создал: user_id, name
created_at, updated_atstringвремя создания и изменения, ISO 8601

Картинки и файлы статьи через API не передаются — только заголовок и текст.

Объект «Статья базы знаний»
{
  "id": 5,
  "title": "Как заводить клиента",
  "text": "1. Создать карточку...",
  "section_id": "0d59fce75ee3",
  "section": "Регламенты",
  "tags": [
    {
      "name": "важно",
      "color": "#f59e0b"
    }
  ],
  "author": {
    "user_id": "123456",
    "name": "Иван Петров"
  },
  "created_at": "2026-10-12T21:40:45+03:00",
  "updated_at": "2026-10-14T10:02:11+03:00"
}

Список статей

GET/spaces/{space_id}/kb/articles

Статьи пространства, по умолчанию — недавно изменённые сверху, по 50 на страницу.

Параметры

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
section_idstringтолько статьи этого раздела
tagstringтолько статьи с этим тегом (название)
sortstringupdated_at (по умолчанию), created_at, id
orderstringdesc (по умолчанию) или asc
pagenumberномер страницы, с 1
Запрос
curl https://protasks.ru/api/v1/spaces/611148238/kb/articles \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/kb/articles');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$articles = json_decode(curl_exec($ch), true)['data'];
import requests

articles = requests.get("https://protasks.ru/api/v1/spaces/611148238/kb/articles",
                        headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/kb/articles', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: articles } = await r.json();
Ответ
{
  "ok": true,
  "data": [ { "id": 5, "title": "Как заводить клиента", … } ],
  "meta": { "page": 1, "per_page": 50, "total": 1, "pages": 1, "has_more": false }
}

Получить статью

GET/spaces/{space_id}/kb/articles/{id}

Одна статья по номеру. Нет такой — 404 not_found.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
idnumberномер статьи
Запрос
curl https://protasks.ru/api/v1/spaces/611148238/kb/articles/5 \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/kb/articles/5');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$article = json_decode(curl_exec($ch), true)['data'];
import requests

article = requests.get("https://protasks.ru/api/v1/spaces/611148238/kb/articles/5",
                       headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/kb/articles/5', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: article } = await r.json();
Ответ
{
  "ok": true,
  "data": {
    "id": 5,
    "title": "Как заводить клиента",
    "text": "1. Создать карточку...",
    "section_id": "0d59fce75ee3",
    "section": "Регламенты",
    "tags": [
      {
        "name": "важно",
        "color": "#f59e0b"
      }
    ],
    "author": {
      "user_id": "123456",
      "name": "Иван Петров"
    },
    "created_at": "2026-10-12T21:40:45+03:00",
    "updated_at": "2026-10-14T10:02:11+03:00"
  }
}

Создать статью

POST/spaces/{space_id}/kb/articles

Создаёт статью, автор — владелец ключа. Ответ — 201 и статья с присвоенным номером.

Права ключа: «чтение и изменение». Лимит записей по тарифу владельца пространства — как в приложении (иначе 400 rejected).

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении

Тело запроса

ПараметрТипОписание
titlestringзаголовок, до 200 символов
textstring или nullтекст
section_idstring или nullID раздела из списка разделов; null — без раздела
tagsstring[] или nullназвания тегов БЗ из списка тегов; заменяют текущие
Запрос
curl -X POST https://protasks.ru/api/v1/spaces/611148238/kb/articles \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"title": "Как заводить клиента", "text": "1. Создать карточку...", "section_id": "0d59fce75ee3", "tags": ["важно"]}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/kb/articles');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'title' => 'Как заводить клиента',
        'text' => '1. Создать карточку...',
        'section_id' => '0d59fce75ee3',
        'tags' => ['важно'],
    ]),
]);
$article = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.post("https://protasks.ru/api/v1/spaces/611148238/kb/articles",
                  headers={"Authorization": "Bearer ptk_<API_KEY>"},
                  json={"title": "Как заводить клиента", "text": "1. Создать карточку...", "section_id": "0d59fce75ee3", "tags": ["важно"]})
article = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/kb/articles', {
  method: 'POST',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "title": "Как заводить клиента",
    "text": "1. Создать карточку...",
    "section_id": "0d59fce75ee3",
    "tags": [
      "важно"
    ]
  })
});
const { data: article } = await r.json();
Ответ — 201
{
  "ok": true,
  "data": {
    "id": 5,
    "title": "Как заводить клиента",
    "text": "1. Создать карточку...",
    "section_id": "0d59fce75ee3",
    "section": "Регламенты",
    "tags": [
      {
        "name": "важно",
        "color": "#f59e0b"
      }
    ],
    "author": {
      "user_id": "123456",
      "name": "Иван Петров"
    },
    "created_at": "2026-10-12T21:40:45+03:00",
    "updated_at": "2026-10-14T10:02:11+03:00"
  }
}

Изменить статью

PATCH/spaces/{space_id}/kb/articles/{id}

Меняет только переданные поля. Перенос в другой раздел — section_id, без раздела — null. Ответ — статья после изменения.

Права ключа: «чтение и изменение».

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
idnumberномер статьи

Тело запроса

ПараметрТипОписание
titlestringзаголовок, до 200 символов
textstring или nullтекст
section_idstring или nullID раздела из списка разделов; null — без раздела
tagsstring[] или nullназвания тегов БЗ из списка тегов; заменяют текущие
Запрос
curl -X PATCH https://protasks.ru/api/v1/spaces/611148238/kb/articles/5 \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"section_id": "0c10327a0932"}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/kb/articles/5');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'PATCH',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'section_id' => '0c10327a0932',
    ]),
]);
$article = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.patch("https://protasks.ru/api/v1/spaces/611148238/kb/articles/5",
                   headers={"Authorization": "Bearer ptk_<API_KEY>"},
                   json={"section_id": "0c10327a0932"})
article = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/kb/articles/5', {
  method: 'PATCH',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "section_id": "0c10327a0932"
  })
});
const { data: article } = await r.json();
Ответ
{ "ok": true, "data": { "id": 5, "section_id": "0c10327a0932", … } }

Удалить статью

DELETE/spaces/{space_id}/kb/articles/{id}

Удаляет статью вместе с её файлами — без возможности восстановить. Номер удалённой статьи больше не выдаётся. Права ключа: «чтение и изменение».

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
idnumberномер статьи
Запрос
curl -X DELETE https://protasks.ru/api/v1/spaces/611148238/kb/articles/5 \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/kb/articles/5');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'DELETE',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$res = json_decode(curl_exec($ch), true);
import requests

r = requests.delete("https://protasks.ru/api/v1/spaces/611148238/kb/articles/5",
                    headers={"Authorization": "Bearer ptk_<API_KEY>"})
await fetch('https://protasks.ru/api/v1/spaces/611148238/kb/articles/5', {
  method: 'DELETE',
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
Ответ
{
  "ok": true,
  "data": {
    "id": 5,
    "deleted": true
  }
}

Разделы базы знаний

GET/spaces/{space_id}/kb/sections

Разделы (колонки) базы знаний слева направо. ID раздела — короткий постоянный идентификатор (12 символов), не меняется при переименовании и перестановке.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении

Объект «Раздел»

ПолеТипОписание
idstringID раздела
namestringназвание, до 30 символов
colorstringцвет #rrggbb
positionnumberпорядок слева направо, с 1
Запрос
curl https://protasks.ru/api/v1/spaces/611148238/kb/sections \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/kb/sections');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$sections = json_decode(curl_exec($ch), true)['data'];
import requests

sections = requests.get("https://protasks.ru/api/v1/spaces/611148238/kb/sections",
                        headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/kb/sections', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: sections } = await r.json();
Ответ
{
  "ok": true,
  "data": [
    {
      "id": "0d59fce75ee3",
      "name": "Регламенты",
      "color": "#ef4444",
      "position": 1
    }
  ]
}

Добавить раздел

POST/spaces/{space_id}/kb/sections

Добавляет раздел в конец. Не больше 10 разделов; название не повторяет существующие (без учёта регистра), иначе — 400 rejected. Ответ — 201 и раздел.

Права ключа: «чтение и изменение».

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении

Тело запроса

ПараметрТипОписание
namestringназвание, до 30 символов
colorstringцвет #rrggbb, по умолчанию #9333ea
Запрос
curl -X POST https://protasks.ru/api/v1/spaces/611148238/kb/sections \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"name": "Регламенты", "color": "#ef4444"}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/kb/sections');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'name' => 'Регламенты',
        'color' => '#ef4444',
    ]),
]);
$section = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.post("https://protasks.ru/api/v1/spaces/611148238/kb/sections",
                  headers={"Authorization": "Bearer ptk_<API_KEY>"},
                  json={"name": "Регламенты", "color": "#ef4444"})
section = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/kb/sections', {
  method: 'POST',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "name": "Регламенты",
    "color": "#ef4444"
  })
});
const { data: section } = await r.json();
Ответ — 201
{
  "ok": true,
  "data": {
    "id": "0d59fce75ee3",
    "name": "Регламенты",
    "color": "#ef4444",
    "position": 1
  }
}

Изменить раздел

PATCH/spaces/{space_id}/kb/sections/{section_id}

Переименовывает раздел и/или меняет цвет. ID не меняется, статьи остаются в разделе. Ответ — раздел после изменения.

Права ключа: «чтение и изменение».

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
section_idstringID раздела — список разделов

Тело запроса

ПараметрТипОписание
namestringновое название, до 30 символов
colorstringцвет #rrggbb
Запрос
curl -X PATCH https://protasks.ru/api/v1/spaces/611148238/kb/sections/0d59fce75ee3 \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"name": "Регламенты 2"}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/kb/sections/0d59fce75ee3');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'PATCH',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'name' => 'Регламенты 2',
    ]),
]);
$section = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.patch("https://protasks.ru/api/v1/spaces/611148238/kb/sections/0d59fce75ee3",
                   headers={"Authorization": "Bearer ptk_<API_KEY>"},
                   json={"name": "Регламенты 2"})
section = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/kb/sections/0d59fce75ee3', {
  method: 'PATCH',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "name": "Регламенты 2"
  })
});
const { data: section } = await r.json();
Ответ
{
  "ok": true,
  "data": {
    "id": "0d59fce75ee3",
    "name": "Регламенты 2",
    "color": "#ef4444",
    "position": 1
  }
}

Порядок разделов

POST/spaces/{space_id}/kb/sections/order

Задаёт порядок разделов слева направо. Передайте ID всех разделов, иначе — 400 rejected. Ответ — разделы в новом порядке.

Права ключа: «чтение и изменение».

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении

Тело запроса

ПараметрТипОписание
idsstring[]ID разделов в новом порядке
Запрос
curl -X POST https://protasks.ru/api/v1/spaces/611148238/kb/sections/order \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"ids": ["0c10327a0932", "0d59fce75ee3"]}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/kb/sections/order');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'ids' => ['0c10327a0932', '0d59fce75ee3'],
    ]),
]);
$sections = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.post("https://protasks.ru/api/v1/spaces/611148238/kb/sections/order",
                  headers={"Authorization": "Bearer ptk_<API_KEY>"},
                  json={"ids": ["0c10327a0932", "0d59fce75ee3"]})
sections = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/kb/sections/order', {
  method: 'POST',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "ids": [
      "0c10327a0932",
      "0d59fce75ee3"
    ]
  })
});
const { data: sections } = await r.json();
Ответ
{ "ok": true, "data": [ { "id": "0c10327a0932", "position": 1, … }, … ] }

Удалить раздел

DELETE/spaces/{space_id}/kb/sections/{section_id}

Удаляет пустой раздел. Если в нём есть статьи — 400 rejected: сначала перенесите их (изменить статью, section_id). Права ключа: «чтение и изменение».

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
section_idstringID раздела — список разделов
Запрос
curl -X DELETE https://protasks.ru/api/v1/spaces/611148238/kb/sections/0d59fce75ee3 \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/kb/sections/0d59fce75ee3');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'DELETE',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$res = json_decode(curl_exec($ch), true);
import requests

r = requests.delete("https://protasks.ru/api/v1/spaces/611148238/kb/sections/0d59fce75ee3",
                    headers={"Authorization": "Bearer ptk_<API_KEY>"})
await fetch('https://protasks.ru/api/v1/spaces/611148238/kb/sections/0d59fce75ee3', {
  method: 'DELETE',
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
Ответ
{
  "ok": true,
  "data": {
    "id": "0d59fce75ee3",
    "deleted": true
  }
}

Теги базы знаний

GET/spaces/{space_id}/kb/tags

Теги статей. Они независимы от тегов задач: ID у тега нет, тег задаётся названием.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
Запрос
curl https://protasks.ru/api/v1/spaces/611148238/kb/tags \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/kb/tags');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$tags = json_decode(curl_exec($ch), true)['data'];
import requests

tags = requests.get("https://protasks.ru/api/v1/spaces/611148238/kb/tags",
                    headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/kb/tags', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: tags } = await r.json();
Ответ
{
  "ok": true,
  "data": [
    {
      "name": "важно",
      "color": "#f59e0b"
    }
  ]
}

Добавить тег БЗ

POST/spaces/{space_id}/kb/tags

Создаёт тег — потом его можно ставить статьям (tags). Тег с таким названием уже есть — вернётся он (200), новый — 201. Права ключа: «чтение и изменение».

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении

Тело запроса

ПараметрТипОписание
namestringназвание, до 40 символов
colorstringцвет #rrggbb, по умолчанию #9333ea
Запрос
curl -X POST https://protasks.ru/api/v1/spaces/611148238/kb/tags \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"name": "важно", "color": "#f59e0b"}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/kb/tags');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'name' => 'важно',
        'color' => '#f59e0b',
    ]),
]);
$tag = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.post("https://protasks.ru/api/v1/spaces/611148238/kb/tags",
                  headers={"Authorization": "Bearer ptk_<API_KEY>"},
                  json={"name": "важно", "color": "#f59e0b"})
tag = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/kb/tags', {
  method: 'POST',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "name": "важно",
    "color": "#f59e0b"
  })
});
const { data: tag } = await r.json();
Ответ — 201
{
  "ok": true,
  "data": {
    "name": "важно",
    "color": "#f59e0b"
  }
}

Удалить тег БЗ

DELETE/spaces/{space_id}/kb/tags?name={название}

Удаляет тег и убирает его из всех статей. Права ключа: «чтение и изменение».

Параметры

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
namestringназвание тега — в параметре запроса
Запрос
curl -X DELETE https://protasks.ru/api/v1/spaces/611148238/kb/tags?name=%D0%B2%D0%B0%D0%B6%D0%BD%D0%BE \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/kb/tags?name=%D0%B2%D0%B0%D0%B6%D0%BD%D0%BE');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'DELETE',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$res = json_decode(curl_exec($ch), true);
import requests

r = requests.delete("https://protasks.ru/api/v1/spaces/611148238/kb/tags?name=%D0%B2%D0%B0%D0%B6%D0%BD%D0%BE",
                    headers={"Authorization": "Bearer ptk_<API_KEY>"})
await fetch('https://protasks.ru/api/v1/spaces/611148238/kb/tags?name=%D0%B2%D0%B0%D0%B6%D0%BD%D0%BE', {
  method: 'DELETE',
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
Ответ
{
  "ok": true,
  "data": {
    "name": "важно",
    "deleted": true
  }
}

Добавить запись в «Доступы»

POST/spaces/{space_id}/access

Добавляет запись в раздел «Проект → Доступы». Это единственный метод для «Доступов»: читать, менять и удалять записи через API нельзя — в разделе лежат логины и пароли, и утёкший ключ не должен их раскрывать. Пароль раздела (второй фактор приложения) для добавления не нужен; записи видны в приложении после ввода пароля раздела. Ответ — 201, без логина и пароля.

Права ключа: «чтение и изменение». Лимит записей по тарифу владельца пространства — как в приложении (иначе 400 rejected).

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении

Тело запроса

ПараметрТипОписание
titlestringназвание, до 255 символов
urlstringадрес кабинета, http/https; без схемы допишется https://
loginstringлогин, до 255 символов
passwordstringпароль, до 255 символов
notestringзаметка
Запрос
curl -X POST https://protasks.ru/api/v1/spaces/611148238/access \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"title": "Хостинг", "url": "https://timeweb.com", "login": "admin", "password": "s3cret", "note": "основной аккаунт"}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/access');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'POST',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'title' => 'Хостинг',
        'url' => 'https://timeweb.com',
        'login' => 'admin',
        'password' => 's3cret',
        'note' => 'основной аккаунт',
    ]),
]);
$entry = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.post("https://protasks.ru/api/v1/spaces/611148238/access",
                  headers={"Authorization": "Bearer ptk_<API_KEY>"},
                  json={"title": "Хостинг", "url": "https://timeweb.com", "login": "admin", "password": "s3cret", "note": "основной аккаунт"})
entry = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/access', {
  method: 'POST',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "title": "Хостинг",
    "url": "https://timeweb.com",
    "login": "admin",
    "password": "s3cret",
    "note": "основной аккаунт"
  })
});
const { data: entry } = await r.json();
Ответ — 201
{
  "ok": true,
  "data": {
    "created": true,
    "title": "Хостинг"
  }
}

Объект «Файл»

Файл раздела «Проект → Файлы». ID файла — его номер в разделе: служебный, только для API (в приложении не показывается); номера не повторяются, даже если файл удалили. Имя файла не уникально по смыслу, но в разделе всегда разное: при загрузке файла с таким же именем к нему добавляется _1, _2…

ПолеТипОписание
idnumberномер файла в разделе
namestringимя файла (итоговое, после загрузки)
sizenumberразмер в байтах
extstring или nullрасширение
uploaded_byobject или nullкто загрузил: user_id, name (у файлов, загруженных давно, может не быть)
created_atstringвремя загрузки, ISO 8601
download_urlstringадрес для скачивания — тоже с ключом API
Объект «Файл»
{
  "id": 4,
  "name": "Бриф.pdf",
  "size": 183204,
  "ext": "pdf",
  "uploaded_by": {
    "user_id": "123456",
    "name": "Иван Петров"
  },
  "created_at": "2026-10-12T21:40:45+03:00",
  "download_url": "https://protasks.ru/api/v1/spaces/611148238/files/4/download"
}

Список файлов

GET/spaces/{space_id}/files

Файлы раздела «Файлы» проекта, по умолчанию — новые сверху, по 50 на страницу. В meta.quota — занятое место и лимит в байтах.

Параметры

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
sortstringcreated_at (по умолчанию), id, name, size
orderstringdesc (по умолчанию) или asc
pagenumberномер страницы, с 1
Запрос
curl https://protasks.ru/api/v1/spaces/611148238/files \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/files');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$files = json_decode(curl_exec($ch), true)['data'];
import requests

files = requests.get("https://protasks.ru/api/v1/spaces/611148238/files",
                     headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/files', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: files } = await r.json();
Ответ
{
  "ok": true,
  "data": [ { "id": 4, "name": "Бриф.pdf", … } ],
  "meta": { …, "quota": { "used": 1843200, "limit": 157286400 } }
}

Получить файл

GET/spaces/{space_id}/files/{id}

Сведения о файле (без содержимого). Нет такого — 404 not_found.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
idnumberномер файла
Запрос
curl https://protasks.ru/api/v1/spaces/611148238/files/4 \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/files/4');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$file = json_decode(curl_exec($ch), true)['data'];
import requests

file = requests.get("https://protasks.ru/api/v1/spaces/611148238/files/4",
                    headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/files/4', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const { data: file } = await r.json();
Ответ
{
  "ok": true,
  "data": {
    "id": 4,
    "name": "Бриф.pdf",
    "size": 183204,
    "ext": "pdf",
    "uploaded_by": {
      "user_id": "123456",
      "name": "Иван Петров"
    },
    "created_at": "2026-10-12T21:40:45+03:00",
    "download_url": "https://protasks.ru/api/v1/spaces/611148238/files/4/download"
  }
}

Скачать файл

GET/spaces/{space_id}/files/{id}/download

Отдаёт само содержимое файла (не JSON): Content-Type и имя файла — в заголовках. Нужен тот же ключ, что и для остальных методов. Нет файла — 404 not_found в обычном JSON.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
idnumberномер файла
Запрос
curl https://protasks.ru/api/v1/spaces/611148238/files/4/download \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -o "Бриф.pdf"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/files/4/download');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
file_put_contents('Бриф.pdf', curl_exec($ch));
import requests

r = requests.get("https://protasks.ru/api/v1/spaces/611148238/files/4/download",
                 headers={"Authorization": "Bearer ptk_<API_KEY>"})
open("Бриф.pdf", "wb").write(r.content)
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/files/4/download', {
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
const blob = await r.blob();

Загрузить файл

POST/spaces/{space_id}/files

Загружает один или несколько файлов (до 10 за запрос). Тело — multipart/form-data, поле file (один файл) или files[] (несколько). Все файлы проверяются до сохранения — при ошибке не сохраняется ни один. Ответ — 201 и массив созданных файлов с присвоенными номерами; итоговое имя может отличаться от переданного (повтор имени, недопустимые символы заменяются на _).

Права ключа: «чтение и изменение». Ограничения — как в приложении: файл до 20 МБ, исполняемые и веб-типы (.php, .html, .svg, .js, .xml и т.п.) нельзя, общий объём — по тарифу владельца пространства (иначе 400 rejected). В пространство «только для чтения» (заблокированное или отключённое) загружать нельзя — 403 locked.

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении

Тело запроса

ПараметрТипОписание
filefileфайл; для нескольких — повторяйте поле files[]
Запрос
curl -X POST https://protasks.ru/api/v1/spaces/611148238/files \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -F "file=@Бриф.pdf"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/files');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
    CURLOPT_POSTFIELDS => ['file' => new CURLFile('Бриф.pdf')],
]);
$files = json_decode(curl_exec($ch), true)['data'];
import requests

r = requests.post("https://protasks.ru/api/v1/spaces/611148238/files",
                  headers={"Authorization": "Bearer ptk_<API_KEY>"},
                  files={"file": open("Бриф.pdf", "rb")})
files = r.json()["data"]
const form = new FormData();
form.append('file', fileInput.files[0]);
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/files', {
  method: 'POST',
  headers: { Authorization: 'Bearer ptk_<API_KEY>' },
  body: form
});
const { data: files } = await r.json();
Ответ — 201
{
  "ok": true,
  "data": [
    {
      "id": 4,
      "name": "Бриф.pdf",
      "size": 183204,
      "ext": "pdf",
      "uploaded_by": {
        "user_id": "123456",
        "name": "Иван Петров"
      },
      "created_at": "2026-10-12T21:40:45+03:00",
      "download_url": "https://protasks.ru/api/v1/spaces/611148238/files/4/download"
    }
  ]
}

Удалить файл

DELETE/spaces/{space_id}/files/{id}

Удаляет файл без возможности восстановить. Номер удалённого файла больше не выдаётся. Как в приложении, удалить может только автор файла или создатель пространства (иначе 403 forbidden). Права ключа: «чтение и изменение».

Параметры пути

ПараметрТипОписание
space_idstringID пространства — из списка пространств или из адреса пространства в приложении
idnumberномер файла
Запрос
curl -X DELETE https://protasks.ru/api/v1/spaces/611148238/files/4 \
  -H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/files/4');
curl_setopt_array($ch, [
    CURLOPT_CUSTOMREQUEST => 'DELETE',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'],
]);
$res = json_decode(curl_exec($ch), true);
import requests

r = requests.delete("https://protasks.ru/api/v1/spaces/611148238/files/4",
                    headers={"Authorization": "Bearer ptk_<API_KEY>"})
await fetch('https://protasks.ru/api/v1/spaces/611148238/files/4', {
  method: 'DELETE',
  headers: { Authorization: 'Bearer ptk_<API_KEY>' }
});
Ответ
{
  "ok": true,
  "data": {
    "id": 4,
    "deleted": true
  }
}

Файлы задач, заметок и статей

Файлы можно прикреплять и к записям пространства. Методы те же, что у файлов проекта (список, получить, скачать, загрузить, удалить), объект «Файл» — тот же; номер файла отсчитывается в пределах записи. Меняется только адрес:

К чемуАдрес
Задача/spaces/{space_id}/tasks/{id}/files
Заметка/spaces/{space_id}/notes/{id}/files
Статья базы знаний/spaces/{space_id}/kb/articles/{id}/files

Дальше, как у файлов проекта: GET …/files, GET …/files/{file_id}, GET …/files/{file_id}/download, POST …/files (multipart/form-data, поле file или files[]), DELETE …/files/{file_id}.

Отличия от файлов проекта

  • Как в приложении, загружать и удалять файлы записи может любой участник пространства (не только автор). Автор файла в объекте — null.
  • Общей квоты по тарифу для таких файлов нет: действует только лимит 20 МБ на файл и запрет исполняемых типов.
  • Файлы подзадач через API пока не поддерживаются.
  • Нет такой записи — 404 not_found; запись в архивном или «только для чтения» пространстве — 403.
  • Изменять записи (загружать и удалять файлы) нужно ключом «чтение и изменение».
Пример: файл к задаче №42
curl -X POST https://protasks.ru/api/v1/spaces/611148238/tasks/42/files \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -F "file=@Бриф.pdf"

Входящий вебхук

POSThttps://protasks.ru/hook/{token}

Вебхук — секретный адрес, который вставляется в amoCRM и другие сервисы. Когда сервис отправляет на него запрос, в ProTasks создаётся задача: в ваши личные или в пространство, где вы создатель. Это не метод API: ключ не нужен, доступ по адресу. Адрес создаётся в приложении, в разделе Интеграция и API → Уведомления — там же можно отключить вебхук, выпустить новый адрес и посмотреть журнал вызовов.

Вебхуки доступны на тех же тарифах, что и API (Pro и Business). Адрес — секрет: не публикуйте его в открытом коде. Если он утёк, выпустите новый («Новый адрес») — старый перестанет работать сразу.

Формат запроса

Принимается JSON (Content-Type: application/json) или обычная форма (application/x-www-form-urlencoded, в том числе вложенные ключи вида leads[add][0][name], как присылает amoCRM). Параметры в адресе (?title=…) тоже читаются. Размер — до 64 КБ.

Поля запроса

Если в настройках вебхука задан шаблон, название и описание берутся из него. Без шаблона — из полей ниже; остальные поля нужны, чтобы заполнить задачу.

ПараметрТипОписание
titlestringназвание задачи, до 200 символов (также name, subject); обязательно, если нет шаблона названия
descriptionstringописание (также text, comment, message)
deadlinestringсрок: 2026-11-01, 2026-11-01 15:00, 01.11.2026 или unix-время в секундах (так присылает amoCRM)
deadline_timestringвремя срока HH:MM, если оно не в deadline
priority_idnumber10 низкий, 20 средний, 30 высокий (также priority словами: low/medium/high, низкий/средний/высокий)
assignee_idstringID ответственного — только для вебхука пространства, пользователь должен быть участником; по умолчанию — из настроек вебхука
tagsstringназвания тегов через запятую — только уже существующие теги пространства
external_idstringID события во внешнем сервисе: повторный запрос с тем же external_id в течение 24 часов задачу не создаёт
urlstringссылка на сделку/заявку в исходном сервисе — добавляется в описание задачи

В описание задачи автоматически дописывается «создано вебхуком «название»». Повтор тех же данных (без external_id — по тому же содержимому) за 24 часа тоже не создаёт дубль.

Когда путь меняется: знак *

Если сервис шлёт одни и те же данные под разными ключами, в шаблоне вместо ключа ставится * — «любой ключ на этом уровне» (берётся первое подходящее поле). Например, amoCRM присылает сделку как leads.status.0… при смене этапа и как leads.update.0… при изменении, а шаблон {leads.*.0.name} подходит к обоим.

Защита от дублей

В настройках вебхука можно задать шаблон «Защита от дублей», например {leads.*.0.id}-{leads.*.0.status_id}. Если у двух запросов за 24 часа он дал одинаковый результат, второй задачу не создаёт. Порядок: этот шаблон → поле external_id запроса → совпадение всего содержимого.

Тег и приоритет

В настройках вебхука пространства есть поле «Тег» (несколько — через запятую, можно с подстановками): задаче ставятся теги с такими названиями, которые уже есть в пространстве, плюс теги из запроса. У личных задач тегов нет. Приоритет по умолчанию задаётся там же.

Запрос
curl -X POST https://protasks.ru/hook/<ТОКЕН> \
  -H "Content-Type: application/json" \
  -d '{"title": "Позвонить клиенту", "description": "Обсудить договор", "deadline": "2026-11-01 15:00", "priority_id": 30, "external_id": "deal-1042", "url": "https://crm.example.com/deal/1042"}'
$ch = curl_init('https://protasks.ru/hook/<ТОКЕН>');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'title' => 'Позвонить клиенту',
        'description' => 'Обсудить договор',
        'deadline' => '2026-11-01 15:00',
        'priority_id' => 30,
        'external_id' => 'deal-1042',
        'url' => 'https://crm.example.com/deal/1042',
    ]),
]);
$res = json_decode(curl_exec($ch), true);
import requests

r = requests.post("https://protasks.ru/hook/<ТОКЕН>", json={
    "title": "Позвонить клиенту",
    "description": "Обсудить договор",
    "deadline": "2026-11-01 15:00",
    "priority_id": 30,
    "external_id": "deal-1042",
    "url": "https://crm.example.com/deal/1042",
})
print(r.json())
const r = await fetch('https://protasks.ru/hook/<ТОКЕН>', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    "title": "Позвонить клиенту",
    "description": "Обсудить договор",
    "deadline": "2026-11-01 15:00",
    "priority_id": 30,
    "external_id": "deal-1042",
    "url": "https://crm.example.com/deal/1042"
  })
});
const res = await r.json();
Ответ — 201
{
  "ok": true,
  "id": 612,
  "scope": "space",
  "url": "https://protasks.ru/spaces/space/611148238/task/…",
  "space_id": "611148238"
}
Повтор — 200
{
  "ok": true,
  "duplicate": true,
  "id": 612
}

Шаблоны названия и описания

Сервисы присылают данные в своём формате, поэтому в настройках вебхука задаются шаблоны: поля запроса подставляются в фигурных скобках по пути через точку. Вложенные данные и массивы разворачиваются: leads[add][0][name] становится {leads.add.0.name}. Поля, которых нет в запросе, подставляются пустыми.

Чтобы не угадывать пути, отправьте из сервиса тестовый запрос и откройте «Настроить» у вебхука: внизу покажутся поля последнего принятого запроса — нажатие вставляет путь в шаблон. Принятые данные видно и в «Журнале».

Пример

ПутьТипЧто это
{leads.add.0.name}шаблонназвание сделки из события amoCRM «новая сделка»
{leads.add.0.id}шаблонID сделки
{leads.add.0.price}шаблонбюджет сделки
{account.subdomain}шаблонподдомен аккаунта amoCRM

Шаблон названия Новая сделка: {leads.add.0.name} (#{leads.add.0.id}) при данных ниже создаст задачу «Новая сделка: Рога и копыта (#555)».

Без шаблона задача создаётся из полей title и description запроса. Если название получилось пустым (нет title и шаблон дал пустой результат), вебхук отвечает 400, а причина видна в «Журнале».

Что присылает сервис (форма)
leads[add][0][id]=555
leads[add][0][name]=Рога и копыта
leads[add][0][price]=120000
account[subdomain]=demo
Те же данные — пути для шаблонов
{leads.add.0.id}    = 555
{leads.add.0.name}  = Рога и копыта
{leads.add.0.price} = 120000
{account.subdomain} = demo
Результат
Название:  Новая сделка: Рога и копыта (#555)
Описание: Бюджет: 120000 ₽
          (создано вебхуком «amoCRM»)

Ответы и ошибки вебхука

Ответ — JSON: {"ok": true, …} при успехе и {"ok": false, "error": "…"} при ошибке. Любой вызов (успешный, повтор, ошибка) попадает в «Журнал» с принятыми данными — пароли и токены в них скрываются, хранится 30 дней.

КодКогда
201задача создана: id — её номер, url — ссылка
200повтор (duplicate: true) — такая задача уже создавалась за 24 часа; а также GET на адрес — проверка, что он живой
400пустой запрос, некорректный JSON, не задано название задачи, задача отклонена (лимит тарифа и т.п. — текст как в приложении)
403вебхук отключён; тариф не Pro/Business; вебхук пространства работает только у его создателя; пространство в архиве или только для чтения
404вебхук не найден (адрес неверный или выпущен новый) либо пространство удалено
413запрос больше 64 КБ
429больше 60 запросов в минуту на один вебхук; повторите через время из заголовка Retry-After
Ошибка — нет названия
{
  "ok": false,
  "error": "Не задано название задачи: в запросе нет поля title, а шаблон названия дал пустой результат. Проверьте шаблон в настройках вебхука."
}
Ошибка — вебхук отключён
{
  "ok": false,
  "error": "Вебхук отключён владельцем"
}

Исходящие вебхуки

ProTasks сам сообщает вашему сервису о событии: вы создаёте подписку методом API, и при событии на её адрес приходит POST с описанием. Опрашивать API по кругу не нужно, а подписку можно создавать и удалять из кода (так её ведёт, например, Albato).

События

СобытиеКогда приходит
comment.createdв чате задачи пространства появилось новое сообщение. Подписка на всё пространство или на одну задачу (параметр task)
task.createdв пространстве создана задача
task.updatedу задачи изменились поля (название, описание, срок, ответственные, теги, статус и т. д.); в событии — список changes
task.status_changedзадачу перенесли в другую колонку; приходит вместе с task.updated, если нужен только статус
task.deletedзадача удалена

Подзадачи в событиях не участвуют. Подписка на одну задачу (task) работает для любого события.

Что приходит

Тело — JSON, заголовок Content-Type: application/json. Ваш сервер должен ответить кодом 2xx в течение 10 секунд.

{
  "event": "comment.created",
  "delivery_id": "064d727646494d7521d9e460",
  "created_at": "2026-10-21T16:08:27+03:00",
  "space": { "id": "611148238", "name": "Отдел продаж" },
  "task": { "id": 12, "title": "Подготовить договор", "status": "В работе" },
  "comment": {
    "id": "cfde62550a331077b3869927",
    "text": "Договор отправлен клиенту",
    "files_count": 0,
    "author": { "user_id": "935806", "name": "Анна Петрова" },
    "created_at": "2026-10-21T16:08:27+03:00"
  }
}

Заголовки запроса: X-ProTasks-Event (событие), X-ProTasks-Delivery (ID доставки — один и тот же при повторах, по нему можно отсеивать дубли), X-ProTasks-Signature (подпись).

События task.* устроены так же, но вместо comment в них — поля задачи и тот, кто сделал действие (by). Пример task.updated:

{
  "event": "task.updated",
  "delivery_id": "7c1a0e93b2d54f68a1e0d4c7",
  "created_at": "2026-10-23T12:40:05+03:00",
  "space": { "id": "611148238", "name": "Отдел продаж" },
  "task": { "id": 12, "title": "Подготовить договор", "status": "На проверке",
            "description": "", "priority": "20", "deadline": "25.10.2026", "deadline_time": "18:00",
            "assignee": "Анна Петрова", "author": "Иван Сидоров" },
  "by": { "user_id": "935806", "name": "Анна Петрова" },
  "changes": { "status_task": { "old": "В работе", "new": "На проверке" } }
}

У task.status_changed вместо changes — old_status и new_status. Названия полей в changes — внутренние (heading, description, status_task, ddl, tag_ids и т. д.), значения — текстом, как в истории задачи.

Подпись

При создании подписки в ответе один раз приходит secret. Подпись — это sha256= и HMAC-SHA256 от сырого тела запроса с этим секретом. Проверяйте её, прежде чем верить событию.

Проверка подписи
$body = file_get_contents('php://input');
$sig  = $_SERVER['HTTP_X_PROTASKS_SIGNATURE'] ?? '';
$ok   = hash_equals('sha256=' . hash_hmac('sha256', $body, $secret), $sig);
if (!$ok) { http_response_code(401); exit; }
http_response_code(200);
import hmac, hashlib

def valid(body: bytes, signature: str, secret: str) -> bool:
    expected = "sha256=" + hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, signature)
const crypto = require('crypto');

function valid(rawBody, signature, secret) {
  const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
  return signature.length === expected.length &&
    crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
}
Повторы и отключение
Не 2xx или нет ответа за 10 с → повтор через 1 мин, 5 мин, 30 мин, 2 ч, 6 ч (всего 6 попыток)
Ответ 410 Gone → подписка сразу выключается (вы сняли её на своей стороне)
30 неудачных доставок подряд → подписка выключается
Ключ отозван или заблокирован, владелец вышел из пространства или перешёл на Free → подписка выключается
Требования к адресу
Только https, порт 443, имя сайта (не IP-адрес), публичный адрес.
Нельзя localhost, внутренние зоны, адреса частных сетей и сам protasks.ru.
Редиректы не поддерживаются. До 20 активных подписок на ключ.

Создать подписку

POST/webhooks

Создаёт подписку. Ответ — 201 и подписка с secret (показывается только сейчас, сохраните его). Повторный запрос с теми же параметрами не создаёт дубль, а возвращает существующую подписку (200, без secret).

Права ключа: «чтение и изменение». Пространство должно быть вашим (вы создатель или участник), иначе — 404.

Тело запроса

ПараметрТипОписание
urlstringадрес, на который слать события, https, до 500 символов (требования)
eventstringодно из: comment.created, task.created, task.updated, task.status_changed, task.deleted
space_idstringID пространства — из списка пространств
tasknumberномер задачи пространства: слать только события этой задачи. Без параметра — по всему пространству
Запрос
curl -X POST https://protasks.ru/api/v1/webhooks \
  -H "Authorization: Bearer ptk_<API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/protasks-hook", "event": "comment.created", "space_id": "611148238"}'
$ch = curl_init('https://protasks.ru/api/v1/webhooks');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>', 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode(['url' => 'https://example.com/protasks-hook', 'event' => 'comment.created', 'space_id' => '611148238']),
]);
$hook = json_decode(curl_exec($ch), true)['data'];
import requests

hook = requests.post("https://protasks.ru/api/v1/webhooks",
    headers={"Authorization": "Bearer ptk_<API_KEY>"},
    json={"url": "https://example.com/protasks-hook", "event": "comment.created", "space_id": "611148238"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/webhooks', {
  method: 'POST',
  headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' },
  body: JSON.stringify({ url: 'https://example.com/protasks-hook', event: 'comment.created', space_id: '611148238' })
});
const { data: hook } = await r.json();
Ответ
{
  "ok": true,
  "data": {
    "id": "5f1c0a9e7b3d4c2e8a6b1f09",
    "url": "https://example.com/protasks-hook",
    "event": "comment.created",
    "space_id": "611148238",
    "task": null,
    "status": "active",
    "last_status": null,
    "last_error": null,
    "last_delivery_at": null,
    "created_at": "2026-10-21T16:08:27+03:00",
    "secret": "9b1f…(64 символа)"
  }
}
Ошибка — адрес не подходит
{
  "ok": false,
  "error": { "status": 400, "code": "validation", "message": "url — только https" }
}

Список подписок

GET/webhooks

Подписки владельца ключа, новые сверху, по 50 на страницу. secret не возвращается. По status (active или disabled), last_status, last_error и last_delivery_at видно, работает ли подписка: причина выключения указана в last_error.

Параметры

ПараметрТипОписание
pagenumberномер страницы, с 1
Запрос
curl https://protasks.ru/api/v1/webhooks \
  -H "Authorization: Bearer ptk_<API_KEY>"
Ответ
{
  "ok": true,
  "data": [ { "id": "5f1c0a9e7b3d4c2e8a6b1f09", "event": "comment.created", "status": "active", … } ],
  "meta": { "page": 1, "per_page": 50, "total": 1, "pages": 1, "has_more": false }
}

Удалить подписку

DELETE/webhooks/{id}

Удаляет подписку; события, ждавшие отправки, отменяются. Права ключа: «чтение и изменение». Чужая подписка — 404.

Параметры

ПараметрТипОписание
idstringID подписки из ответа при создании или из списка
Запрос
curl -X DELETE https://protasks.ru/api/v1/webhooks/5f1c0a9e7b3d4c2e8a6b1f09 \
  -H "Authorization: Bearer ptk_<API_KEY>"
Ответ
{
  "ok": true,
  "data": { "id": "5f1c0a9e7b3d4c2e8a6b1f09", "deleted": true }
}

Пробное событие

POST/webhooks/{id}/test

Сразу отправляет на адрес подписки событие ping (с подписью, как обычное) и возвращает, что ответил ваш сервер. Так можно проверить адрес и проверку подписи, не дожидаясь реального сообщения. Права ключа: «чтение и изменение».

Параметры

ПараметрТипОписание
idstringID подписки
Запрос
curl -X POST https://protasks.ru/api/v1/webhooks/5f1c0a9e7b3d4c2e8a6b1f09/test \
  -H "Authorization: Bearer ptk_<API_KEY>"
Ответ
{
  "ok": true,
  "data": { "delivered": true, "status": 200, "error": null }
}

API-ключ для консоли

Ключ создаётся в разделе Интеграция и API → API. Он хранится только в этой вкладке браузера и стирается, когда вы её закроете. Запросы из консоли — настоящие: создание, изменение и удаление работают с вашими данными.