Versioning by path
Every controller lives under /api/v1. A breaking change requires the previous version to stay supported through a transition period, and old paths remain aliases for two releases.
The public REST contract replaced the shared task engine that was rejected. How cheaply integrators can connect to it decides whether one list of work across all products ever appears.
Every controller lives under /api/v1. A breaking change requires the previous version to stay supported through a transition period, and old paths remain aliases for two releases.
Write operations accept an idempotency key. A repeated call after a network drop updates the record instead of creating a second one. This is the most common mistake in integrations of this kind.
Authentication through A3.ID, access checks identical to the interface. Economic fields are not returned to an external participant rather than hidden on the client.
Integration traffic is bursty by nature and customer traffic is even. One limit across both would either strangle integrations or fail to stop abuse.
/api/v1/tasksTask list with pagination, filters and sorting/api/v1/tasksCreate a task, change status, assign, run bulk operations/api/v1/assignmentsAn external assignment with an idempotency key/api/v1/assignments/{key}Update and close by external key/api/v1/projectsProjects, members, milestones and budget/api/v1/time-entriesLog time, read entries, approve them/api/v1/views/overdueReady views: my tasks, overdue, by project/api/v1/exportOrganisation data export under the caller permissionsThe source product passes its entity and a link to it. A repeated call with the same externalKey updates the task instead of creating a second one.
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"
}A subscription to events so that the source product never has to poll A3.Projects on a schedule.
task.createdA task was created in the interface or through the APItask.status_changedA task changed state, including a send back for reworktask.closedA task was completed or cancelled with a stated reasontime_entry.loggedTime was logged, including through the embedded widgetproject.status_changedA project was paused, completed or cancelledbudget.threshold_reachedA budget threshold was reached, firing once per thresholdA token is created for one integration and limited to an explicit list of scopes no wider than the permissions of its owner. Only a hash is stored, and the lifetime never exceeds 180 days.
The same public API serves as the entry point for the ecosystem agent over MCP. The agent acts on behalf of the user and under the same access checks.
A permission refusal comes back as a tool error rather than an empty list. Otherwise the agent would say you have no tasks where the tasks are simply not visible.
The schema, request examples and error codes are published. A sandbox follows the first reference integration: without a first consumer it would serve an imaginary scenario.