Версионирование по пути
Все контроллеры живут под /api/v1. Ломающее изменение требует поддержки предыдущей версии в течение переходного периода, старые пути остаются алиасами на два релиза.
Публичный REST заменяет отвергнутый общий движок задач. От того, насколько дёшево к нему подключиться, зависит, появится ли сквозной список работы через все продукты.
Все контроллеры живут под /api/v1. Ломающее изменение требует поддержки предыдущей версии в течение переходного периода, старые пути остаются алиасами на два релиза.
Операции записи принимают ключ идемпотентности. Повторный вызов при обрыве сети обновляет запись, а не создаёт вторую. Это самая частая ошибка в интеграциях такого рода.
Аутентификация через A3.ID, проверки доступа совпадают с интерфейсными. Внешнему участнику экономические поля не отдаются, а не скрываются на клиенте.
Интеграционный трафик пиковый по природе, клиентский равномерный. Один лимит на обоих либо задушил бы интеграции, либо не защитил от злоупотреблений.
/api/v1/tasksСписок задач с пагинацией, фильтрами и сортировкой/api/v1/tasksСоздание задачи, смена статуса, назначение, массовые операции/api/v1/assignmentsВнешнее назначение с ключом идемпотентности/api/v1/assignments/{key}Обновление и закрытие по внешнему ключу/api/v1/projectsПроекты, участники, вехи и бюджет/api/v1/time-entriesСписание времени, чтение и утверждение/api/v1/views/overdueГотовые срезы: мои задачи, просроченные, по проекту/api/v1/exportВыгрузка данных организации под правами вызывающегоПродукт-источник передаёт свою сущность и ссылку на неё. Повторный вызов с тем же externalKey обновит задачу, а не создаст вторую.
POST /api/v1/assignments
{
"externalKey": "legal-case-8421",
"sourceProduct": "lawyer",
"sourceEntityType": "LegalCase",
"sourceEntityId": "8421",
"deepLink": "https://app.lawyer.a3.solutions/cases/8421",
"title": "Подготовить исковое заявление",
"assigneeId": "u-2f9c",
"dueDate": "2026-10-02"
}Подписка на события, чтобы продукт-источник не опрашивал A3.Projects по расписанию.
task.createdЗадача создана в интерфейсе или через APItask.status_changedЗадача сменила состояние, включая возврат на доработкуtask.closedЗадача завершена или отменена с указанием причиныtime_entry.loggedСписано время, в том числе через встраиваемый виджетproject.status_changedПроект приостановлен, завершён или отменёнbudget.threshold_reachedДостигнут порог бюджета, срабатывает один раз на порогТокен создаётся под конкретную интеграцию и ограничен явным перечнем областей, не шире прав владельца. В базе хранится только хеш, срок жизни не превышает 180 дней.
Тот же публичный API служит точкой доступа для агента экосистемы через MCP. Агент работает от имени пользователя и с теми же проверками доступа.
Отказ по правам возвращается ошибкой инструмента, а не пустым списком. Иначе агент сказал бы «у вас нет задач» там, где их просто не видно.
Схема, примеры запросов и коды ошибок опубликованы. Песочница появится после первой эталонной интеграции: без реального потребителя она обслуживала бы воображаемый сценарий.