Справочник API ProTasks
API позволяет работать с задачами, заметками и пространствами ProTasks из ваших сервисов: CRM, ботов, таблиц, скриптов. Всё, что вы делаете через API, работает так же, как в приложении: уведомления, история изменений, лимиты тарифа.
Базовый адрес
Запросы и ответы — в JSON (UTF-8). У запросов с телом (POST, PATCH) обязателен заголовок Content-Type: application/json; у GET и DELETE тела нет — этот заголовок не нужен.
С чего начать
- Создайте ключ в разделе Интеграция и API → API (тарифы Pro и Business).
- Передавайте ключ в каждом запросе — см. Аутентификация.
- Проверьте ключ методом GET /me.
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, можно использовать заголовок X-Api-Key: ptk_….
{
"ok": false,
"error": {
"status": 401,
"code": "no_key",
"message": "Нужен ключ API: заголовок Authorization: Bearer ptk_…"
}
}
Права ключа
При создании ключа выбираются права:
| Права | Что можно |
|---|---|
read | Только чтение: списки и данные задач, заметок, пространств. Подходит для отчётов и дашбордов. |
full | Чтение и изменение: создание, изменение и удаление. |
Ключу read методы изменения отвечают ошибкой 403 read_only. Доступ к данным — такой же, как у владельца ключа в приложении: только свои личные задачи и пространства, где он участник; действия, доступные в пространстве только создателю, через API тоже доступны только ему.
{
"ok": false,
"error": {
"status": 403,
"code": "read_only",
"message": "Ключ только для чтения — …"
}
}
Тарифы и лимиты
API доступен на тарифах Pro и Business. Если тариф владельца ключа сменился на Free, ключи сохраняются, но запросы получают 403 tarif — до возврата на платный тариф.
| Тариф | Запросов в минуту на ключ |
|---|---|
| Pro | 60 |
| Business | 300 |
В каждом ответе есть заголовки лимита:
| Заголовок | Значение |
|---|---|
X-RateLimit-Limit | лимит в минуту |
X-RateLimit-Remaining | сколько запросов осталось в текущей минуте |
X-RateLimit-Reset | через сколько секунд счётчик обнулится |
При превышении — 429 rate_limit и заголовок Retry-After (секунды). Остальные лимиты тарифа (пространства, участники, записи) действуют так же, как в приложении. Активных ключей — не больше 10 на пользователя.
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 — понятный текст.
| HTTP | code | Когда |
|---|---|---|
| 400 | validation | неверные или недостающие параметры |
| 401 | no_key | ключ не передан |
| 401 | bad_key | ключ неверный или отозван |
| 403 | tarif | тариф владельца ключа не Pro / Business |
| 403 | read_only | метод изменения, а ключ только для чтения |
| 400 | rejected | действие запрещено правилами приложения: лимит тарифа, нельзя закрыть задачу с открытыми подзадачами и т.п. — причина в message |
| 403 | forbidden | нет прав на действие (например, удалить задачу может только её автор) |
| 403 | space_locked, member_locked | пространство или участник заблокированы (лимит тарифа, отключено администрацией) — доступно только чтение |
| 403 | archived | пространство в архиве — его содержимое откроется, когда его вернут из архива в приложении |
| 404 | not_found | метода или объекта нет, либо нет доступа к нему (чужая задача, пространство, где вы не участник) |
| 405 | method_not_allowed | у адреса нет такого HTTP-метода |
| 429 | rate_limit | превышена частота запросов |
| 500 | server_error | ошибка на нашей стороне — повторите позже |
{
"ok": true,
"data": { /* … */ }
}
{
"ok": false,
"error": {
"status": 401,
"code": "bad_key",
"message": "Ключ недействителен или отозван"
}
}
Владелец ключа
Возвращает пользователя, которому принадлежит ключ, права ключа и лимит запросов. Удобно для проверки, что ключ работает.
Параметры
Нет.
Ответ
| Поле | Тип | Описание |
|---|---|---|
user_id | string | ID пользователя (как в профиле, «#123456») |
name | string | имя |
email | string или null | почта |
tarif | string | pro или business |
key.name | string | название ключа |
key.scope | string | read или full |
rate_limit | number | запросов в минуту |
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»).
| Поле | Тип | Описание |
|---|---|---|
id | number | номер задачи |
title | string | название, до 255 символов |
description | string или null | описание |
status_id | number | ID статуса — см. ниже |
status | string | название статуса — только в ответе, для чтения человеком |
priority_id | number или null | ID приоритета — см. ниже; null — без приоритета |
priority | string или null | название приоритета — только в ответе |
deadline | string или null | дата дедлайна, YYYY-MM-DD |
deadline_time | string или null | время дедлайна, HH:MM (московское) |
remind_before | number или null | напомнить за N минут до дедлайна: 15, 30, 60, 120, 720, 1440, 2880, 10080. Работает, только когда заданы и дата, и время |
repeat | object или null | правило повтора — см. ниже |
repeat_count | number | сколько раз регулярная задача уже выполнена |
created_at, updated_at | string | время создания и изменения, 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)
Регулярная задача при переводе в Закрыта сразу возвращается в Новая, дедлайн сдвигается по правилу, указанному в задаче.
| Поле | Тип | Описание |
|---|---|---|
frequency | string | day — каждые N дней, week — недель, month — месяцев, weekdays — по будням |
interval | number | N, от 1 до 365 (по умолчанию 1) |
weekdays | number[] | для week: дни недели, 1 — понедельник … 7 — воскресенье |
month_last_day | boolean | для month: в последний день месяца |
end | string | never (по умолчанию), date — до даты until, count — times раз |
until | string | для end: date: YYYY-MM-DD |
times | number | для 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"
}
{
"frequency": "week",
"weekdays": [1, 5],
"end": "count",
"times": 10
}
Список задач
Личные задачи с фильтрами и сортировкой, по умолчанию новые сверху, по 50 на страницу. Чтобы получить следующие — передайте page с индексом страницы (2, 3, 4 и т.д.). Если страница не будет найдена, в ответе meta.has_more придет false.
Фильтры
| Параметр | Тип | Описание |
|---|---|---|
status_id | string | статус или несколько через запятую: 33, 33,66 — см. статусы |
priority_id | string | приоритет или несколько через запятую: 30, 20,30 — см. приоритеты |
deadline_from | string | дедлайн не раньше этой даты (включительно) |
deadline_to | string | дедлайн не позже этой даты (включительно) |
has_deadline | boolean | true — только с дедлайном, false — только без |
created_from | string | создана не раньше |
created_to | string | создана не позже (включительно) |
Даты в фильтрах — YYYY-MM-DD или unix-время в секундах (1791763200). Можно задать только одну границу периода.
Сортировка
| Параметр | Тип | Описание |
|---|---|---|
sort | string | id — по номеру (по умолчанию), deadline — по дедлайну, created_at — по дате создания, updated_at — по дате изменения, priority — по приоритету |
order | string | asc — по возрастанию, desc — по убыванию. По умолчанию: для deadline — asc (ближайшие сначала), для остальных — desc (новые сверху) |
При сортировке по дедлайну задачи без дедлайна — всегда в конце; по приоритету — задачи без приоритета в конце.
Страницы
| Параметр | Тип | Описание |
|---|---|---|
page | number | номер страницы, с 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 }
}
Получить задачу
Одна задача по номеру. Задача не найдена — 404 not_found.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
id | number | номер задачи |
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": /* объект «Задача» */ }
Создать задачу
Создаёт личную задачу. Права ключа: «чтение и изменение». Ответ — 201 и массив data - см. Объект «Задача».
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
title | string | название, до 255 символов |
description | string | описание |
status_id | number | 33 Новая (по умолчанию) или 66 В работе |
priority_id | number | 10 Низкий, 20 Средний, 30 Высокий — см. приоритеты |
deadline | string | YYYY-MM-DD |
deadline_time | string | HH:MM |
remind_before | number | напомнить за N минут до дедлайна: 15, 30, 60, 120, 720 (12 ч), 1440 (сутки), 2880 (2 суток), 10080 (неделя). Только вместе с deadline и deadline_time — без них 400 validation |
repeat | object | правило повтора — задача станет регулярной; поля ниже. Нужен deadline: повтор считается от него |
repeat.frequency | string | day — каждые N дней, week — недель, month — месяцев, weekdays — по будням (пн–пт) |
repeat.interval | number | N — каждые сколько дней/недель/месяцев, 1–365, по умолчанию 1 |
repeat.weekdays | number[] | для week: дни недели, 1 — пн … 7 — вс. Не задано — тот же день недели, что у дедлайна |
repeat.month_last_day | boolean | для month: в последний день месяца |
repeat.end | string | когда закончить: never (по умолчанию), date — до даты until, count — после times выполнений |
repeat.until | string | для end: date: последняя дата, YYYY-MM-DD |
repeat.times | number | для 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();
{
"title": "Еженедельный отчёт",
"deadline": "2026-10-16",
"deadline_time": "10:00",
"repeat": {
"frequency": "week",
"weekdays": [1, 5],
"end": "count",
"times": 10
}
}
{ "ok": true, "data": { "id": 43, "title": "Позвонить клиенту", … } }
Изменить задачу
Меняет только переданные поля, поля не указанные в запросе остаются без изменений. Чтобы очистить поле — передайте null. Права ключа: «чтение и изменение». В ответе вернется исправленная задача с массивом data - см. Объект «Задача».
Параметры
| Параметр | Тип | Описание |
|---|---|---|
id | number | номер задачи |
Тело запроса
Любые поля из «Создать задачу» (хотя бы одно), включая 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" }
}
}
Удалить задачу
Удаляет задачу навсегда вместе с её файлами. Данное действие необратимо. Права ключа: «чтение и изменение».
Параметры
| Параметр | Тип | Описание |
|---|---|---|
id | number | номер задачи |
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»).
| Поле | Тип | Описание |
|---|---|---|
id | number | номер заметки |
title | string | название, до 255 символов |
text | string или null | текст заметки |
created_at, updated_at | string | время создания и изменения, ISO 8601 |
{
"id": 7,
"title": "Идеи для отпуска",
"text": "Байкал, Алтай, Карелия",
"created_at": "2026-10-12T21:40:45+03:00",
"updated_at": "2026-10-12T21:40:45+03:00"
}
Список заметок
Заметки владельца ключа, новые сверху, по 50 на страницу. Чтобы получить следующие — передайте page с индексом страницы (2, 3, 4 и т.д.). Если страница не будет найдена, в ответе meta.has_more придет false.
Параметры запроса
| Параметр | Тип | Описание |
|---|---|---|
page | number | номер страницы, с 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 }
}
Получить заметку
Одна заметка по номеру. Заметка не найдена — 404 not_found.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
id | number | номер заметки |
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"
}
}
Создать заметку
Создаёт заметку владельцу ключа. Права ключа: «чтение и изменение». Ответ — 201 и созданная заметка с присвоенным номером.
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
title | string | название, до 255 символов |
text | string | текст заметки |
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();
{
"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"
}
}
Изменить заметку
Меняет только переданные поля. Чтобы очистить текст — "text": null. Права ключа: «чтение и изменение». Ответ — заметка после изменения.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
id | number | номер заметки |
Тело запроса
| Поле | Тип | Описание |
|---|---|---|
title | string | новое название |
text | string или 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"
}
}
Удалить заметку
Удаляет заметку навсегда вместе с её файлами. Права ключа: «чтение и изменение».
Параметры
| Параметр | Тип | Описание |
|---|---|---|
id | number | номер заметки |
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).
В пространствах доступны: пространства — чтение, создание, изменение (название, архив) и удаление; чтение участников; колонки и теги — чтение, создание, изменение и удаление; задачи, подзадачи, заметки, ссылки и база знаний — чтение, создание, изменение и удаление; «Доступы» — только добавление записи; файлы проекта, задач, заметок и статей — список, скачивание, загрузка и удаление.
| Поле | Тип | Описание |
|---|---|---|
id | string | ID пространства |
name | string | название |
archived | boolean | в архиве: такое пространство есть в списке, но задачи, участники и теги не открываются (403 archived), пока его не вернут из архива в приложении |
role | string | роль владельца ключа: owner — создатель, member — участник |
owner | object | создатель: user_id, name |
members_count | number | участников |
locked | boolean | заблокировано (превышен лимит тарифа создателя или отключено администрацией) — в приложении доступно только чтение |
created_at | string | время создания, 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"
}
Список пространств
Все пространства владельца ключа — свои и те, где он участник, включая архивные. Новые сверху, по 50 на страницу.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
page | number | номер страницы, с 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 }
}
Получить пространство
Одно пространство — объект «Пространство» и его колонки statuses (как в методе колонок). Работает и для архивного.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
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": [ … ] } }
Создать пространство
Создаёт пространство с обычными колонками (Новая, В работе, Закрыта, Отменена); владелец ключа — создатель и участник. Ответ — 201 и пространство с колонками, как в «Получить пространство».
Права ключа: «чтение и изменение». Количество пространств ограничено тарифом создателя (архивные не считаются), иначе — 400 rejected с текстом приложения.
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
name | string | название, до 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();
{
"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
},
"…"
]
}
}
Изменить пространство
Переименовывает пространство и/или отправляет его в архив или возвращает из архива. Работает и для архивного пространства. Ответ — пространство после изменения.
Вернуть из архива можно, только если на тарифе есть свободное место (иначе 400 rejected). В архив пространство уходит только по этому запросу: само по себе ничего в архив не попадает.
Права ключа: «чтение и изменение». Менять и удалять пространство может только создатель (как в приложении), иначе — 403 forbidden.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
name | string | новое название, до 100 символов |
archived | boolean | true — в архив, 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
},
"…"
]
}
}
Удалить пространство
Удаляет пространство вместе со всеми данными: задачи и подзадачи, заметки, базу знаний, ссылки, доступы, файлы, участников и приглашения. Восстановить нельзя. Чтобы случайно не удалить не то, в confirm_name нужно передать точное текущее название пространства — иначе 400 validation.
Права ключа: «чтение и изменение». Менять и удалять пространство может только создатель (как в приложении), иначе — 403 forbidden.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
confirm_name | string | точное название пространства — в параметре запроса |
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
}
}
Колонки (статусы)
Колонки канбана пространства по порядку. Статус задачи пространства — это её колонка: status_id задачи = id колонки.
ID колонки постоянный — не меняется, если колонку переименовали или передвинули. У стандартных колонок ID те же, что у статусов личных задач: 33 Новая, 66 В работе, 99 Закрыта, 100 Отменена. Свои колонки получают 101, 102 и т.д.; ID удалённой колонки больше не выдаётся.
99 «Закрыта» и 100 «Отменена» есть в каждом пространстве (system: true): их нельзя переименовать или удалить, они всегда последние. «Новая» и «В работе» создатель может переименовать — ID останутся 33 и 66.Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
Ответ — массив колонок
| Поле | Тип | Описание |
|---|---|---|
id | number | ID колонки |
name | string | название |
color | string | цвет, #rrggbb |
system | boolean | системная («Закрыта», «Отменена») |
position | number | место слева направо, с 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
}
]
}
Участники
Участники пространства, создатель — первым. user_id участника используется в фильтрах задач (assignee_id, author_id).
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
Ответ — массив участников
| Поле | Тип | Описание |
|---|---|---|
user_id | string | ID пользователя |
name | string или null | имя |
role | string | owner — создатель, member — участник |
locked | boolean | участник сверх лимита тарифа пространства — может только читать |
joined_at | string | когда вступил, 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"
}
]
}
Теги
Теги задач пространства. В задаче теги приходят списком названий (tags), фильтр списка задач — tag по названию.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
Ответ — массив тегов
| Поле | Тип | Описание |
|---|---|---|
name | string | название, уникально в пространстве |
color | string | цвет, #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"
}
]
}
Добавить колонку
Добавляет колонку перед «Закрыта» и «Отменена». Колонка получает постоянный ID — 101, 102 и т.д. Ответ — 201 и колонка.
Права ключа: «чтение и изменение». Менять колонки может только создатель пространства (как в приложении), иначе — 403 forbidden.
Своих колонок (кроме «Закрыта» и «Отменена») — не больше 3 на тарифе Free и 10 на Pro и Business (по тарифу создателя), иначе — 400 rejected.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
name | string | название, до 30 символов, не повторяет существующие |
color | string | цвет #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();
{
"ok": true,
"data": {
"id": 101,
"name": "На проверке",
"color": "#f59e0b",
"system": false,
"position": 3
}
}
Изменить колонку
Переименовывает колонку и/или меняет цвет. ID не меняется, задачи остаются в колонке. «Закрыта» (99) и «Отменена» (100) не меняются. Ответ — колонка после изменения.
Права ключа: «чтение и изменение». Менять колонки может только создатель пространства (как в приложении), иначе — 403 forbidden.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
status_id | number | ID колонки — колонки пространства |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
name | string | новое название, до 30 символов |
color | string | цвет #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
}
}
Порядок колонок
Задаёт порядок колонок слева направо. Передайте ID всех колонок, кроме 99 и 100, — они всегда последние. Ответ — все колонки в новом порядке.
Права ключа: «чтение и изменение». Менять колонки может только создатель пространства (как в приложении), иначе — 403 forbidden.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
ids | number[] | 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, … }, … ] }
Удалить колонку
Удаляет пустую колонку. Если в ней есть задачи — 400 rejected: сначала перенесите их в другую колонку (изменить задачу, status_id). Должна остаться хотя бы одна колонка, кроме «Закрыта» и «Отменена». ID удалённой колонки больше не выдаётся.
Права ключа: «чтение и изменение». Менять колонки может только создатель пространства (как в приложении), иначе — 403 forbidden.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
status_id | number | ID колонки — колонки пространства |
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
}
}
Добавить тег
Создаёт тег пространства — потом его можно ставить задачам (tags). Добавлять теги может любой участник. Тег с таким названием уже есть — вернётся он (200), новый — 201. Права ключа: «чтение и изменение».
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
name | string | название, до 40 символов |
color | string | цвет #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();
{
"ok": true,
"data": {
"name": "Срочно",
"color": "#ef4444"
}
}
Удалить тег
Удаляет тег и убирает его из всех задач пространства. Удалять теги может любой участник. Права ключа: «чтение и изменение».
Параметры
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
name | string | название тега — в параметре запроса |
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}.
Поля — как у личной задачи, плюс теги, ответственные, автор и подзадачи.
| Поле | Тип | Описание |
|---|---|---|
id | number | номер задачи |
title | string | название |
description | string или null | описание |
status_id | number или null | ID колонки — см. колонки; null — задача в колонке, которой уже нет |
status | string | название колонки — только в ответе |
priority_id | number или null | 10 Низкий, 20 Средний, 30 Высокий — как у личных; null — без приоритета |
priority | string или null | название приоритета — только в ответе |
tags | string[] | названия тегов — см. теги |
assignees | object[] | ответственные: user_id, name |
author | object или null | кто поставил задачу: user_id, name |
deadline | string или null | дата дедлайна, YYYY-MM-DD |
deadline_time | string или null | время дедлайна, HH:MM (московское) |
remind_before | number или null | напомнить за N минут до дедлайна |
repeat | object или null | правило повтора — как у личных |
repeat_count | number | сколько раз регулярная задача уже выполнена |
require_subtasks_done | boolean | задачу нельзя закрыть, пока не закрыты все подзадачи |
subtasks_total | number | подзадач всего |
subtasks_done | number | подзадач закрыто или отменено |
links | object[] | связи с другими задачами пространства, только в ответах «Получить», «Создать» и «Изменить» (не в списке). У связи: id; type — blocks (эта блокирует вторую), blocked_by (эту блокирует вторая) или related; task — вторая задача (id — номер, title, status); open — вторая задача ещё не закрыта и не отменена |
subtasks | object[] | подзадачи — только в получении задачи |
created_at, updated_at | string | время создания и изменения, ISO 8601 |
closed_at | string или 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"
}
Список задач
Задачи пространства с фильтрами и сортировкой, по умолчанию новые сверху, по 50 на страницу. Подзадачи в список не входят — они приходят в получении задачи, а в списке есть их счётчики subtasks_total и subtasks_done.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
Фильтры
Все необязательные и сочетаются друг с другом.
| Параметр | Тип | Описание |
|---|---|---|
status_id | string | колонка или несколько через запятую: 33, 33,101 — ID колонок пространства |
priority_id | string | приоритет или несколько через запятую: 30, 20,30 |
assignee_id | string | задачи, где этот участник — ответственный (user_id из участников) |
author_id | string | задачи, которые поставил этот участник |
tag | string | задачи с этим тегом, по названию |
deadline_from | string | дедлайн не раньше этой даты (включительно) |
deadline_to | string | дедлайн не позже этой даты (включительно) |
has_deadline | boolean | true — только с дедлайном, false — только без |
created_from | string | создана не раньше |
created_to | string | создана не позже (включительно) |
Даты — 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 }
}
Получить задачу
Одна задача по номеру — с подзадачами (subtasks) и связями (links). Задачи с таким номером нет в этом пространстве — 404 not_found.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер задачи |
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": "Получить счёт", … } ] } }
Создать задачу
Создаёт задачу в пространстве. Автор — владелец ключа. Ответ — 201 и созданная задача с присвоенным номером.
Права ключа: «чтение и изменение». Всё работает так же, как в приложении: участникам уходят уведомления (Telegram, MAX, почта, push — по их настройкам), изменения попадают в историю задачи, действуют лимиты тарифа.
Ответственным приходит уведомление о новой задаче (себе — нет).
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
title | string | название, до 500 символов |
description | string или null | описание |
status_id | number | ID колонки; по умолчанию — первая колонка. Нельзя создать сразу в 99 или 100 |
priority_id | number или null | 10, 20, 30 или null — без приоритета |
tags | string[] или null | названия тегов — теги пространства; новые теги создаются в приложении |
assignee_ids | string[] или null | ответственные — user_id участников; сколько можно — зависит от тарифа |
deadline | string или null | дата дедлайна, YYYY-MM-DD; null — убрать дедлайн |
deadline_time | string или null | время дедлайна, HH:MM (московское) |
remind_before | number или null | напомнить за N минут: 15, 30, 60, 120, 720, 1440, 2880, 10080 (кроме 15 — на тарифе Pro создателя пространства). Только при дате и времени дедлайна |
repeat | object или null | правило повтора — как у личных |
require_subtasks_done | boolean | нельзя закрыть задачу, пока не закрыты все подзадачи. Задаётся только при создании |
link_task | number | номер второй задачи этого пространства, с которой связать эту. Задаётся вместе с link_type |
link_type | string или 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();
{ "ok": true, "data": { "id": 563, "title": "Подготовить отчёт", …, "subtasks": [] } }
Изменить задачу
Меняет только переданные поля. Ответ — задача после изменения (с подзадачами).
Права ключа: «чтение и изменение». Всё работает так же, как в приложении: участникам уходят уведомления (Telegram, MAX, почта, push — по их настройкам), изменения попадают в историю задачи, действуют лимиты тарифа.
Смена колонки — это смена статуса: автору задачи придёт уведомление. Изменили assignee_ids — новым ответственным придёт «вас назначили», снятым — «вас сняли».
status_id: 99) — она сразу вернётся в первую колонку со следующим дедлайном, в ответе будет repeated: {"next_deadline": "YYYY-MM-DD"} или {"finished": true}. Если у задачи включено «нельзя закрыть без подзадач», а открытые подзадачи есть, — 400 rejected.Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер задачи |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
title | string | название |
description | string или null | описание |
status_id | number | ID колонки — колонки пространства |
priority_id | number или null | 10, 20, 30 или null — без приоритета |
tags | string[] или null | названия тегов — теги пространства; новые теги создаются в приложении |
assignee_ids | string[] или null | ответственные — user_id участников; сколько можно — зависит от тарифа |
deadline | string или null | дата дедлайна, YYYY-MM-DD; null — убрать дедлайн |
deadline_time | string или null | время дедлайна, HH:MM (московское) |
remind_before | number или null | напомнить за N минут: 15, 30, 60, 120, 720, 1440, 2880, 10080 (кроме 15 — на тарифе Pro создателя пространства). Только при дате и времени дедлайна |
repeat | object или null | правило повтора — как у личных |
link_task | number | номер второй задачи этого пространства, с которой связать эту. Задаётся вместе с link_type |
link_type | string или 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": "Закрыта", … } }
Удалить задачу
Удаляет задачу вместе с подзадачами, историей, чатом и файлами — без возможности восстановить. Как в приложении, удалить может только автор задачи, иначе — 403 forbidden. Номер удалённой задачи больше не выдаётся.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер задачи |
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
}
}
Получить подзадачу
Одна подзадача — объект «Подзадача». Все подзадачи задачи приходят в получении задачи (subtasks).
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер задачи |
sub_id | number | ID подзадачи — номер в 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": "Получить счёт", … } }
Добавить подзадачу
Добавляет подзадачу к задаче — не больше 10 на задачу, подзадачу к подзадаче добавить нельзя. Ответ — 201 и подзадача с присвоенным ID. Права ключа: «чтение и изменение».
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер задачи |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
title | string | название, до 500 символов |
description | string или null | описание |
status_id | number | ID колонки; по умолчанию — первая колонка |
priority_id | number или null | 10, 20, 30 или null — без приоритета |
tags | string[] или null | названия тегов — теги пространства; новые теги создаются в приложении |
assignee_ids | string[] или null | ответственные — user_id участников; сколько можно — зависит от тарифа |
deadline | string или null | дата дедлайна, YYYY-MM-DD; null — убрать дедлайн |
deadline_time | string или null | время дедлайна, HH:MM (московское) |
remind_before | number или 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();
{ "ok": true, "data": { "id": 18, "title": "Собрать цифры", … } }
Изменить подзадачу
Меняет только переданные поля — те же, что у задачи, кроме repeat. Закрыть подзадачу — status_id: 99; смена статуса подзадачи видна и в истории задачи. Ответ — подзадача после изменения. Права ключа: «чтение и изменение».
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер задачи |
sub_id | number | ID подзадачи — номер в API |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
title | string | название |
description | string или null | описание |
status_id | number | ID колонки — колонки пространства |
priority_id | number или null | 10, 20, 30 или null — без приоритета |
tags | string[] или null | названия тегов — теги пространства; новые теги создаются в приложении |
assignee_ids | string[] или null | ответственные — user_id участников; сколько можно — зависит от тарифа |
deadline | string или null | дата дедлайна, YYYY-MM-DD; null — убрать дедлайн |
deadline_time | string или null | время дедлайна, HH:MM (московское) |
remind_before | number или 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, … } }
Удалить подзадачу
Удаляет подзадачу без возможности восстановить. Удалить может только тот, кто её добавил, иначе — 403 forbidden.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер задачи |
sub_id | number | ID подзадачи — номер в 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» в приложении): у каждого пространства своя нумерация, номера не повторяются, даже если заметку удалили. Создавать, менять и удалять заметки может любой участник.
| Поле | Тип | Описание |
|---|---|---|
id | number | номер заметки в пространстве |
title | string | заголовок, до 200 символов |
text | string или null | текст |
author | object или null | кто создал: user_id, name |
created_at, updated_at | string | время создания и изменения, 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"
}
Список заметок
Заметки пространства, по умолчанию — недавно изменённые сверху (как в приложении), по 50 на страницу.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
sort | string | updated_at — по изменению (по умолчанию), created_at — по созданию, id — по номеру |
order | string | desc (по умолчанию) или asc |
page | number | номер страницы, с 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 }
}
Получить заметку
Одна заметка по номеру. Нет такой — 404 not_found.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер заметки |
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"
}
}
Создать заметку
Создаёт заметку в пространстве, автор — владелец ключа. Ответ — 201 и заметка с присвоенным номером.
Права ключа: «чтение и изменение». Изменения попадают в историю заметки, как в приложении.
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
title | string | заголовок, до 200 символов |
text | string или 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();
{
"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"
}
}
Изменить заметку
Меняет только переданные поля. Чтобы очистить текст — "text": null. Ответ — заметка после изменения.
Права ключа: «чтение и изменение». Изменения попадают в историю заметки, как в приложении.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер заметки |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
title | string | заголовок |
text | string или 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", … } }
Удалить заметку
Удаляет заметку вместе с историей и файлами — без возможности восстановить. Номер удалённой заметки больше не выдаётся. Права ключа: «чтение и изменение».
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер заметки |
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
}
}
Сообщения задачи
Сообщения из чата задачи, новые сверху, по 50 на страницу. Номер задачи — обязательный параметр task. Только чтение: писать в чат задачи через API пока нельзя.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
task | number | номер задачи этого пространства (поле id задачи) — вернутся сообщения из её чата |
page | number | номер страницы, с 1 |
Объект «Сообщение»
| Поле | Тип | Описание |
|---|---|---|
id | string | ID сообщения |
task | object | null | задача, к которой относится сообщение: id (номер) и title; null, если задачу уже удалили |
author | object | null | автор: user_id и name |
text | string | текст сообщения |
created_at | string | когда отправлено, 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 ссылки — её номер в пространстве: служебный, только для API (в приложении не показывается). У каждого пространства своя нумерация, номера не повторяются, даже если ссылку удалили. Добавлять, менять и удалять ссылки может любой участник.
| Поле | Тип | Описание |
|---|---|---|
id | number | номер ссылки в пространстве |
url | string | адрес, только http/https |
note | string или null | описание |
author | object или null | кто добавил: user_id, name |
created_at, updated_at | string | время создания и изменения, ISO 8601 |
{
"id": 3,
"url": "https://example.com/brief",
"note": "Бриф клиента",
"author": {
"user_id": "123456",
"name": "Иван Петров"
},
"created_at": "2026-10-12T21:40:45+03:00",
"updated_at": "2026-10-14T10:02:11+03:00"
}
Список ссылок
Ссылки пространства, по умолчанию — новые сверху (как в приложении), по 50 на страницу.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
sort | string | created_at — по созданию (по умолчанию), updated_at — по изменению, id — по номеру |
order | string | desc (по умолчанию) или asc |
page | number | номер страницы, с 1 |
curl https://protasks.ru/api/v1/spaces/611148238/links \
-H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/links'); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'], ]); $links = json_decode(curl_exec($ch), true)['data'];
import requests links = requests.get("https://protasks.ru/api/v1/spaces/611148238/links", headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/links', { headers: { Authorization: 'Bearer ptk_<API_KEY>' } }); const { data: links } = await r.json();
{
"ok": true,
"data": [ { "id": 3, "url": "https://example.com/brief", … } ],
"meta": { "page": 1, "per_page": 50, "total": 1, "pages": 1, "has_more": false }
}
Получить ссылку
Одна ссылка по номеру. Нет такой — 404 not_found.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер ссылки |
curl https://protasks.ru/api/v1/spaces/611148238/links/3 \
-H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/links/3'); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer ptk_<API_KEY>'], ]); $link = json_decode(curl_exec($ch), true)['data'];
import requests link = requests.get("https://protasks.ru/api/v1/spaces/611148238/links/3", headers={"Authorization": "Bearer ptk_<API_KEY>"}).json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/links/3', { headers: { Authorization: 'Bearer ptk_<API_KEY>' } }); const { data: link } = await r.json();
{
"ok": true,
"data": {
"id": 3,
"url": "https://example.com/brief",
"note": "Бриф клиента",
"author": {
"user_id": "123456",
"name": "Иван Петров"
},
"created_at": "2026-10-12T21:40:45+03:00",
"updated_at": "2026-10-14T10:02:11+03:00"
}
}
Добавить ссылку
Добавляет ссылку в пространство, автор — владелец ключа. Ответ — 201 и ссылка с присвоенным номером.
Права ключа: «чтение и изменение». Лимит записей по тарифу владельца пространства — как в приложении (иначе 400 rejected).
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
url | string | адрес; без http:// / https:// допишется https://; другие схемы (например javascript:) — 400 rejected |
note | string или null | описание |
curl -X POST https://protasks.ru/api/v1/spaces/611148238/links \ -H "Authorization: Bearer ptk_<API_KEY>" \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com/brief", "note": "Бриф клиента"}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/links'); 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([ 'url' => 'https://example.com/brief', 'note' => 'Бриф клиента', ]), ]); $link = json_decode(curl_exec($ch), true)['data'];
import requests r = requests.post("https://protasks.ru/api/v1/spaces/611148238/links", headers={"Authorization": "Bearer ptk_<API_KEY>"}, json={"url": "https://example.com/brief", "note": "Бриф клиента"}) link = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/links', { method: 'POST', headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' }, body: JSON.stringify({ "url": "https://example.com/brief", "note": "Бриф клиента" }) }); const { data: link } = await r.json();
{
"ok": true,
"data": {
"id": 3,
"url": "https://example.com/brief",
"note": "Бриф клиента",
"author": {
"user_id": "123456",
"name": "Иван Петров"
},
"created_at": "2026-10-12T21:40:45+03:00",
"updated_at": "2026-10-14T10:02:11+03:00"
}
}
Изменить ссылку
Меняет только переданные поля. Чтобы убрать описание — "note": null. Ответ — ссылка после изменения.
Права ключа: «чтение и изменение».
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер ссылки |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
url | string | адрес |
note | string или null | описание |
curl -X PATCH https://protasks.ru/api/v1/spaces/611148238/links/3 \ -H "Authorization: Bearer ptk_<API_KEY>" \ -H "Content-Type: application/json" \ -d '{"note": "Новое описание"}'
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/links/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([ 'note' => 'Новое описание', ]), ]); $link = json_decode(curl_exec($ch), true)['data'];
import requests r = requests.patch("https://protasks.ru/api/v1/spaces/611148238/links/3", headers={"Authorization": "Bearer ptk_<API_KEY>"}, json={"note": "Новое описание"}) link = r.json()["data"]
const r = await fetch('https://protasks.ru/api/v1/spaces/611148238/links/3', { method: 'PATCH', headers: { Authorization: 'Bearer ptk_<API_KEY>', 'Content-Type': 'application/json' }, body: JSON.stringify({ "note": "Новое описание" }) }); const { data: link } = await r.json();
{ "ok": true, "data": { "id": 3, "note": "Новое описание", … } }
Удалить ссылку
Удаляет ссылку без возможности восстановить. Номер удалённой ссылки больше не выдаётся. Права ключа: «чтение и изменение».
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер ссылки |
curl -X DELETE https://protasks.ru/api/v1/spaces/611148238/links/3 \
-H "Authorization: Bearer ptk_<API_KEY>"
$ch = curl_init('https://protasks.ru/api/v1/spaces/611148238/links/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/links/3", headers={"Authorization": "Bearer ptk_<API_KEY>"})
await fetch('https://protasks.ru/api/v1/spaces/611148238/links/3', { method: 'DELETE', headers: { Authorization: 'Bearer ptk_<API_KEY>' } });
{
"ok": true,
"data": {
"id": 3,
"deleted": true
}
}
Объект «Статья базы знаний»
Запись раздела «Проект → База знаний». ID статьи — её номер в пространстве (как «#5» в приложении): у каждого пространства своя нумерация, номера не повторяются, даже если статью удалили. Работать со статьями, разделами и тегами может любой участник.
| Поле | Тип | Описание |
|---|---|---|
id | number | номер статьи в пространстве |
title | string | заголовок, до 200 символов |
text | string или null | текст |
section_id | string или null | ID раздела (колонки БЗ) |
section | string или null | название раздела |
tags | object[] | теги статьи: name, color |
author | object или null | кто создал: user_id, name |
created_at, updated_at | string | время создания и изменения, 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"
}
Список статей
Статьи пространства, по умолчанию — недавно изменённые сверху, по 50 на страницу.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
section_id | string | только статьи этого раздела |
tag | string | только статьи с этим тегом (название) |
sort | string | updated_at (по умолчанию), created_at, id |
order | string | desc (по умолчанию) или asc |
page | number | номер страницы, с 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 }
}
Получить статью
Одна статья по номеру. Нет такой — 404 not_found.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер статьи |
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"
}
}
Создать статью
Создаёт статью, автор — владелец ключа. Ответ — 201 и статья с присвоенным номером.
Права ключа: «чтение и изменение». Лимит записей по тарифу владельца пространства — как в приложении (иначе 400 rejected).
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
title | string | заголовок, до 200 символов |
text | string или null | текст |
section_id | string или null | ID раздела из списка разделов; null — без раздела |
tags | string[] или 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();
{
"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"
}
}
Изменить статью
Меняет только переданные поля. Перенос в другой раздел — section_id, без раздела — null. Ответ — статья после изменения.
Права ключа: «чтение и изменение».
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер статьи |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
title | string | заголовок, до 200 символов |
text | string или null | текст |
section_id | string или null | ID раздела из списка разделов; null — без раздела |
tags | string[] или 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", … } }
Удалить статью
Удаляет статью вместе с её файлами — без возможности восстановить. Номер удалённой статьи больше не выдаётся. Права ключа: «чтение и изменение».
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер статьи |
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
}
}
Разделы базы знаний
Разделы (колонки) базы знаний слева направо. ID раздела — короткий постоянный идентификатор (12 символов), не меняется при переименовании и перестановке.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
Объект «Раздел»
| Поле | Тип | Описание |
|---|---|---|
id | string | ID раздела |
name | string | название, до 30 символов |
color | string | цвет #rrggbb |
position | number | порядок слева направо, с 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
}
]
}
Добавить раздел
Добавляет раздел в конец. Не больше 10 разделов; название не повторяет существующие (без учёта регистра), иначе — 400 rejected. Ответ — 201 и раздел.
Права ключа: «чтение и изменение».
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
name | string | название, до 30 символов |
color | string | цвет #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();
{
"ok": true,
"data": {
"id": "0d59fce75ee3",
"name": "Регламенты",
"color": "#ef4444",
"position": 1
}
}
Изменить раздел
Переименовывает раздел и/или меняет цвет. ID не меняется, статьи остаются в разделе. Ответ — раздел после изменения.
Права ключа: «чтение и изменение».
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
section_id | string | ID раздела — список разделов |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
name | string | новое название, до 30 символов |
color | string | цвет #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
}
}
Порядок разделов
Задаёт порядок разделов слева направо. Передайте ID всех разделов, иначе — 400 rejected. Ответ — разделы в новом порядке.
Права ключа: «чтение и изменение».
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
ids | string[] | 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, … }, … ] }
Удалить раздел
Удаляет пустой раздел. Если в нём есть статьи — 400 rejected: сначала перенесите их (изменить статью, section_id). Права ключа: «чтение и изменение».
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
section_id | string | ID раздела — список разделов |
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
}
}
Теги базы знаний
Теги статей. Они независимы от тегов задач: ID у тега нет, тег задаётся названием.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
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"
}
]
}
Добавить тег БЗ
Создаёт тег — потом его можно ставить статьям (tags). Тег с таким названием уже есть — вернётся он (200), новый — 201. Права ключа: «чтение и изменение».
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
name | string | название, до 40 символов |
color | string | цвет #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();
{
"ok": true,
"data": {
"name": "важно",
"color": "#f59e0b"
}
}
Удалить тег БЗ
Удаляет тег и убирает его из всех статей. Права ключа: «чтение и изменение».
Параметры
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
name | string | название тега — в параметре запроса |
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
}
}
Добавить запись в «Доступы»
Добавляет запись в раздел «Проект → Доступы». Это единственный метод для «Доступов»: читать, менять и удалять записи через API нельзя — в разделе лежат логины и пароли, и утёкший ключ не должен их раскрывать. Пароль раздела (второй фактор приложения) для добавления не нужен; записи видны в приложении после ввода пароля раздела. Ответ — 201, без логина и пароля.
Права ключа: «чтение и изменение». Лимит записей по тарифу владельца пространства — как в приложении (иначе 400 rejected).
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
title | string | название, до 255 символов |
url | string | адрес кабинета, http/https; без схемы допишется https:// |
login | string | логин, до 255 символов |
password | string | пароль, до 255 символов |
note | string | заметка |
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();
{
"ok": true,
"data": {
"created": true,
"title": "Хостинг"
}
}
Объект «Файл»
Файл раздела «Проект → Файлы». ID файла — его номер в разделе: служебный, только для API (в приложении не показывается); номера не повторяются, даже если файл удалили. Имя файла не уникально по смыслу, но в разделе всегда разное: при загрузке файла с таким же именем к нему добавляется _1, _2…
| Поле | Тип | Описание |
|---|---|---|
id | number | номер файла в разделе |
name | string | имя файла (итоговое, после загрузки) |
size | number | размер в байтах |
ext | string или null | расширение |
uploaded_by | object или null | кто загрузил: user_id, name (у файлов, загруженных давно, может не быть) |
created_at | string | время загрузки, ISO 8601 |
download_url | string | адрес для скачивания — тоже с ключом 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"
}
Список файлов
Файлы раздела «Файлы» проекта, по умолчанию — новые сверху, по 50 на страницу. В meta.quota — занятое место и лимит в байтах.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
sort | string | created_at (по умолчанию), id, name, size |
order | string | desc (по умолчанию) или asc |
page | number | номер страницы, с 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 } }
}
Получить файл
Сведения о файле (без содержимого). Нет такого — 404 not_found.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер файла |
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"
}
}
Скачать файл
Отдаёт само содержимое файла (не JSON): Content-Type и имя файла — в заголовках. Нужен тот же ключ, что и для остальных методов. Нет файла — 404 not_found в обычном JSON.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер файла |
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();
Загрузить файл
Загружает один или несколько файлов (до 10 за запрос). Тело — multipart/form-data, поле file (один файл) или files[] (несколько). Все файлы проверяются до сохранения — при ошибке не сохраняется ни один. Ответ — 201 и массив созданных файлов с присвоенными номерами; итоговое имя может отличаться от переданного (повтор имени, недопустимые символы заменяются на _).
Права ключа: «чтение и изменение». Ограничения — как в приложении: файл до 20 МБ, исполняемые и веб-типы (.php, .html, .svg, .js, .xml и т.п.) нельзя, общий объём — по тарифу владельца пространства (иначе 400 rejected). В пространство «только для чтения» (заблокированное или отключённое) загружать нельзя — 403 locked.
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
file | file | файл; для нескольких — повторяйте поле 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();
{
"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"
}
]
}
Удалить файл
Удаляет файл без возможности восстановить. Номер удалённого файла больше не выдаётся. Как в приложении, удалить может только автор файла или создатель пространства (иначе 403 forbidden). Права ключа: «чтение и изменение».
Параметры пути
| Параметр | Тип | Описание |
|---|---|---|
space_id | string | ID пространства — из списка пространств или из адреса пространства в приложении |
id | number | номер файла |
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. - Изменять записи (загружать и удалять файлы) нужно ключом «чтение и изменение».
curl -X POST https://protasks.ru/api/v1/spaces/611148238/tasks/42/files \ -H "Authorization: Bearer ptk_<API_KEY>" \ -F "file=@Бриф.pdf"
Входящий вебхук
Вебхук — секретный адрес, который вставляется в amoCRM и другие сервисы. Когда сервис отправляет на него запрос, в ProTasks создаётся задача: в ваши личные или в пространство, где вы создатель. Это не метод API: ключ не нужен, доступ по адресу. Адрес создаётся в приложении, в разделе Интеграция и API → Уведомления — там же можно отключить вебхук, выпустить новый адрес и посмотреть журнал вызовов.
Вебхуки доступны на тех же тарифах, что и API (Pro и Business). Адрес — секрет: не публикуйте его в открытом коде. Если он утёк, выпустите новый («Новый адрес») — старый перестанет работать сразу.
Формат запроса
Принимается JSON (Content-Type: application/json) или обычная форма (application/x-www-form-urlencoded, в том числе вложенные ключи вида leads[add][0][name], как присылает amoCRM). Параметры в адресе (?title=…) тоже читаются. Размер — до 64 КБ.
Поля запроса
Если в настройках вебхука задан шаблон, название и описание берутся из него. Без шаблона — из полей ниже; остальные поля нужны, чтобы заполнить задачу.
| Параметр | Тип | Описание |
|---|---|---|
title | string | название задачи, до 200 символов (также name, subject); обязательно, если нет шаблона названия |
description | string | описание (также text, comment, message) |
deadline | string | срок: 2026-11-01, 2026-11-01 15:00, 01.11.2026 или unix-время в секундах (так присылает amoCRM) |
deadline_time | string | время срока HH:MM, если оно не в deadline |
priority_id | number | 10 низкий, 20 средний, 30 высокий (также priority словами: low/medium/high, низкий/средний/высокий) |
assignee_id | string | ID ответственного — только для вебхука пространства, пользователь должен быть участником; по умолчанию — из настроек вебхука |
tags | string | названия тегов через запятую — только уже существующие теги пространства |
external_id | string | ID события во внешнем сервисе: повторный запрос с тем же external_id в течение 24 часов задачу не создаёт |
url | string | ссылка на сделку/заявку в исходном сервисе — добавляется в описание задачи |
В описание задачи автоматически дописывается «создано вебхуком «название»». Повтор тех же данных (без 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();
{
"ok": true,
"id": 612,
"scope": "space",
"url": "https://protasks.ru/spaces/space/611148238/task/…",
"space_id": "611148238"
}
{
"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 активных подписок на ключ.
Создать подписку
Создаёт подписку. Ответ — 201 и подписка с secret (показывается только сейчас, сохраните его). Повторный запрос с теми же параметрами не создаёт дубль, а возвращает существующую подписку (200, без secret).
Права ключа: «чтение и изменение». Пространство должно быть вашим (вы создатель или участник), иначе — 404.
Тело запроса
| Параметр | Тип | Описание |
|---|---|---|
url | string | адрес, на который слать события, https, до 500 символов (требования) |
event | string | одно из: comment.created, task.created, task.updated, task.status_changed, task.deleted |
space_id | string | ID пространства — из списка пространств |
task | number | номер задачи пространства: слать только события этой задачи. Без параметра — по всему пространству |
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" }
}
Список подписок
Подписки владельца ключа, новые сверху, по 50 на страницу. secret не возвращается. По status (active или disabled), last_status, last_error и last_delivery_at видно, работает ли подписка: причина выключения указана в last_error.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
page | number | номер страницы, с 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 }
}
Удалить подписку
Удаляет подписку; события, ждавшие отправки, отменяются. Права ключа: «чтение и изменение». Чужая подписка — 404.
Параметры
| Параметр | Тип | Описание |
|---|---|---|
id | string | ID подписки из ответа при создании или из списка |
curl -X DELETE https://protasks.ru/api/v1/webhooks/5f1c0a9e7b3d4c2e8a6b1f09 \ -H "Authorization: Bearer ptk_<API_KEY>"
{
"ok": true,
"data": { "id": "5f1c0a9e7b3d4c2e8a6b1f09", "deleted": true }
}
Пробное событие
Сразу отправляет на адрес подписки событие ping (с подписью, как обычное) и возвращает, что ответил ваш сервер. Так можно проверить адрес и проверку подписи, не дожидаясь реального сообщения. Права ключа: «чтение и изменение».
Параметры
| Параметр | Тип | Описание |
|---|---|---|
id | string | ID подписки |
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 }
}