На главную

Для разработчиков

Открытое API Taska

REST API платформы: контрагенты, сделки, задачи, бизнес-процессы, склад, финансы, производство, встречи и вебхуки. Подключите 1С, сайт или любую внешнюю систему — первый запрос через 5 минут.

v1 · 52 операцииREST + JSONТокен-аутентификацияИсходящие вебхуки

Быстрый старт

Пять шагов от нуля до первого запроса.

  1. 1

    Выпустите токен

    В платформе: Настройки → API-токены → «Создать». Scope (права токена) выбираются при создании. Токен показывается один раз — сохраните его.

  2. 2

    Выберите базовый URL

    Единая точка api.taska.uz — токен формата tsk_ сам маршрутизирует запрос в вашу организацию. Либо классический способ — домен вашей организации (см. «Аутентификация»).

  3. 3

    Сделайте первый запрос

    GET /ping проверяет токен и возвращает его scope — удобно для отладки подключения.

    Запрос
    curl https://api.taska.uz/api/public/v1/ping \
      -H "X-API-Token: tsk_<слаг>_<секрет>"
  4. 4

    Получите ответ

    ok: true — токен работает. В scopes — выданные права: если каких-то не хватает, перевыпустите токен с нужными.

    Ответ · JSON
    {
      "ok": true,
      "apiVersion": "v1",
      "scopes": ["crm:read", "inventory:read"]
    }
  5. 5

    Готово

    Дальше — справочник эндпоинтов ниже. При ошибках 401/403 смотрите раздел «Аутентификация», при прочих — «Ошибки и лимиты».

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

Каждый запрос несёт заголовок X-API-Token с персональным токеном (Personal Access Token). Cookie и CSRF-токены не используются и не нужны. Итоговые права = выбранные scope ∩ права роли владельца токена.

Базовый URL — два способа подключения

Единая точка (рекомендуется)

https://api.taska.uz/api/public/v1

Организация определяется по слагу из токена формата tsk_ — поддомен организации знать не нужно. Работает только с токенами нового формата.

Домен организации

https://<домен>.taska.uz/api/public/v1

Классический способ: тот же домен, на котором вы входите в систему. Работает с любым токеном — и tsk_, и старым tk_.

Формат токена

Новые токены имеют вид tsk_<слаг-организации>_<секрет>. Слаг — не секрет: он нужен только для маршрутизации на единой точке, сам токен проверяется по HMAC-хэшу в базе организации. Старые токены tk_… продолжают работать через домен организации.

http
X-API-Token: tsk_<слаг-организации>_<секрет>

# пример
X-API-Token: tsk_acme_4f9d21c07ab356e8c2d90b1f6a47e5d3901c8b2a7f6e5d4c

Scope — права токена

ScopeОписание
crm:readЧтение контрагентов, контактов, сделок
crm:writeСоздание и изменение контрагентов, контактов, сделок
inventory:readЧтение номенклатуры, складов, остатков, движений
inventory:writeЗапись номенклатуры и движений по складу
finance:readЧтение заявок на оплату, статей и дебиторки
finance:writeСоздание и изменение заявок на оплату
tasks:readЧтение задач и проектов
tasks:writeСоздание и изменение задач
bpm:readЧтение шаблонов и запущенных бизнес-процессов
bpm:executeЗапуск бизнес-процессов
hr:readЧтение справочника сотрудников (без кадровых данных)
production:readЧтение производственных заказов
calendar:readЧтение встреч (календарь)
calendar:writeСоздание встреч
admin:allПолный доступ, включая управление вебхуками

Для операций записи, помимо scope, у владельца токена должно быть соответствующее право роли — оно указано в карточке эндпоинта (например, crm.clients или org.inventory.edit). admin:all открывает все scope.

Ответы 401 и 403

Нет или неверный токен — 401:

401 Unauthorized
{
  "error": "unauthorized",
  "message": "Открытое API требует заголовок X-API-Token (Personal Access Token).",
  "request_id": "1f6c1f9e-3f2b-4a8b-9c01-2e5f7a8b9c0d",
  "details": { "error": "api_token_required" }
}

Токену не хватает scope — 403:

403 Forbidden
{
  "error": "forbidden",
  "message": "Токену нужен один из scope: crm:read.",
  "request_id": "7a2d9b1c-8e4f-4c6a-b0d2-3f5e7a9b1c2d",
  "details": { "error": "insufficient_scope" }
}

Справочник эндпоинтов

Все пути указаны относительно базового URL (…/api/public/v1). Ответы — application/json; charset=utf-8, даты — ISO 8601.

Общие правила

  • Пагинация списков: ?limit=&offset= (limit 1–200, по умолчанию 50), ответ { items, total, limit, offset }. Движения по складу — курсорная пагинация: сохраняйте next_cursor из ответа.
  • Идентификаторы — строки (UUID). Денежные суммы: числа в CRM-сущностях, строки с двумя знаками — в финансовом контуре.
  • PATCH поддерживает оптимистическую блокировку: заголовок If-Match: <version>. Если объект изменили параллельно — 409: перечитайте через GET и повторите.
  • Архивация вместо удаления: у большинства сущностей есть is_archived; списки по умолчанию скрывают архивные (include_archived=true — показать).

Служебные1

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

GET/ping
любой валидный токен

Проверка токена. Возвращает выданные scope — удобно для отладки подключения.

Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/ping \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "ok": true,
  "apiVersion": "v1",
  "scopes": ["crm:read", "inventory:read"],
  "tokenId": "3f2b1c9a-6d4e-4a8b-9c01-2e5f7a8b9c0d",
  "orgUserId": "8a7e6d5c-4b3a-2f1e-0d9c-8b7a6f5e4d3c"
}

Контрагенты4

Контрагенты (клиенты/компании). Ответы — в snake_case. Телефон и email валидируются на сервере (422 при неверном формате).

GET/clients
scope: crm:read

Список контрагентов с поиском и пагинацией.

ПараметрГде · типОписание
limitquery · int1–200, по умолчанию 50
offsetquery · intсмещение, по умолчанию 0
searchquery · stringпоиск по названию / телефону / email
include_archivedquery · boolвключать архивные (по умолчанию false)
Пример запроса и ответа
Запрос
curl "https://api.taska.uz/api/public/v1/clients?limit=50&offset=0&search=baraka" \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "c1a2b3d4-0000-4000-8000-000000000001",
      "version": 3,
      "name": "ООО «Барака Трейд»",
      "phone": "+998901234567",
      "email": "info@baraka.uz",
      "company_name": "Baraka Trade LLC",
      "inn": "301234567",
      "vat_number": null,
      "industry": "Оптовая торговля",
      "segment": "b2b",
      "city": "Ташкент",
      "source": "1c",
      "tags": ["опт"],
      "is_archived": false
    }
  ],
  "total": 134,
  "limit": 50,
  "offset": 0
}
GET/clients/{id}
scope: crm:read

Контрагент по идентификатору. 404 — если не найден.

ПараметрГде · типОписание
id *path · stringидентификатор контрагента (UUID)
Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/clients/c1a2b3d4-0000-4000-8000-000000000001 \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "id": "c1a2b3d4-0000-4000-8000-000000000001",
  "version": 3,
  "name": "ООО «Барака Трейд»",
  "phone": "+998901234567",
  "email": "info@baraka.uz",
  "company_name": "Baraka Trade LLC",
  "inn": "301234567",
  "city": "Ташкент",
  "tags": ["опт"],
  "is_archived": false
}
POST/clients
scope: crm:writeправо роли: crm.clients

Создать контрагента. Можно передать свой id (UUID) — удобно для синхронизации с 1С; иначе сгенерируется. Дубликат id → 409.

ПараметрГде · типОписание
name *body · stringназвание контрагента
idbody · stringсвой UUID (опционально)
phone / email / inn / company_name / city / source / tagsbody · остальные поля контрагента (опционально)
Пример запроса и ответа
Запрос
curl -X POST https://api.taska.uz/api/public/v1/clients \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "ООО «Барака Трейд»",
    "phone": "+998901234567",
    "email": "info@baraka.uz",
    "inn": "301234567",
    "source": "1c"
  }'
Ответ · JSON
{
  "id": "c1a2b3d4-0000-4000-8000-000000000001",
  "version": 1,
  "name": "ООО «Барака Трейд»",
  "phone": "+998901234567",
  "email": "info@baraka.uz",
  "inn": "301234567",
  "source": "1c",
  "tags": [],
  "is_archived": false
}
PATCH/clients/{id}
scope: crm:writeправо роли: crm.clientsIf-Match

Изменить контрагента: передавайте только меняемые поля. При конфликте версий — 409 (перечитайте объект и повторите).

Пример запроса и ответа
Запрос
curl -X PATCH https://api.taska.uz/api/public/v1/clients/c1a2b3d4-0000-4000-8000-000000000001 \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -H "If-Match: 3" \
  -d '{ "phone": "+998907654321" }'
Ответ · JSON
{
  "id": "c1a2b3d4-0000-4000-8000-000000000001",
  "version": 4,
  "name": "ООО «Барака Трейд»",
  "phone": "+998907654321",
  "is_archived": false
}

Контактные лица4

Контактные лица (люди), привязанные к контрагентам. Поле channels — нормализованные каналы связи человека (телефон/email/telegram/instagram).

GET/contacts
scope: crm:read

Список контактных лиц.

ПараметрГде · типОписание
limitquery · int1–200, по умолчанию 50
offsetquery · intсмещение, по умолчанию 0
client_idquery · stringфильтр по контрагенту
searchquery · stringпоиск по имени / телефону / email
include_archivedquery · boolвключать архивные
Пример запроса и ответа
Запрос
curl "https://api.taska.uz/api/public/v1/contacts?client_id=c1a2b3d4-0000-4000-8000-000000000001" \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "a0b1c2d3-0000-4000-8000-000000000011",
      "version": 2,
      "client_id": "c1a2b3d4-0000-4000-8000-000000000001",
      "name": "Алишер Каримов",
      "phone": "+998935551122",
      "email": "alisher@baraka.uz",
      "telegram": "alisher_k",
      "job_title": "Директор по закупкам",
      "tags": [],
      "channels": [
        { "kind": "phone", "value": "+998935551122", "isPrimary": true, "verified": false }
      ],
      "is_archived": false
    }
  ],
  "total": 12,
  "limit": 50,
  "offset": 0
}
GET/contacts/{id}
scope: crm:read

Контактное лицо по идентификатору.

Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/contacts/a0b1c2d3-0000-4000-8000-000000000011 \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "id": "a0b1c2d3-0000-4000-8000-000000000011",
  "version": 2,
  "client_id": "c1a2b3d4-0000-4000-8000-000000000001",
  "name": "Алишер Каримов",
  "phone": "+998935551122",
  "email": "alisher@baraka.uz",
  "job_title": "Директор по закупкам",
  "is_archived": false
}
POST/contacts
scope: crm:writeправо роли: crm.clients

Создать контактное лицо (обязательно name; client_id — привязка к контрагенту).

ПараметрГде · типОписание
name *body · stringимя человека
client_idbody · stringконтрагент
phone / email / telegram / instagram / job_titlebody · stringканалы и должность (опционально)
Пример запроса и ответа
Запрос
curl -X POST https://api.taska.uz/api/public/v1/contacts \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Алишер Каримов",
    "client_id": "c1a2b3d4-0000-4000-8000-000000000001",
    "phone": "+998935551122"
  }'
Ответ · JSON
{
  "id": "a0b1c2d3-0000-4000-8000-000000000011",
  "version": 1,
  "client_id": "c1a2b3d4-0000-4000-8000-000000000001",
  "name": "Алишер Каримов",
  "phone": "+998935551122",
  "is_archived": false
}
PATCH/contacts/{id}
scope: crm:writeправо роли: crm.clientsIf-Match

Изменить контактное лицо (только меняемые поля).

Пример запроса и ответа
Запрос
curl -X PATCH https://api.taska.uz/api/public/v1/contacts/a0b1c2d3-0000-4000-8000-000000000011 \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -H "If-Match: 2" \
  -d '{ "job_title": "Коммерческий директор" }'
Ответ · JSON
{
  "id": "a0b1c2d3-0000-4000-8000-000000000011",
  "version": 3,
  "name": "Алишер Каримов",
  "job_title": "Коммерческий директор",
  "is_archived": false
}

Сделки4

Сделки в воронках продаж. stage — название этапа (строка), stage_id — канонический UUID этапа. Перевод сделки в выигранную запускает внутренние процессы (комиссии, производство и т.д.).

GET/deals
scope: crm:read

Список сделок с фильтрами по контрагенту, воронке и этапу.

ПараметрГде · типОписание
limitquery · int1–200, по умолчанию 50
offsetquery · intсмещение, по умолчанию 0
client_idquery · stringфильтр по контрагенту
funnel_idquery · stringфильтр по воронке
stagequery · stringфильтр по этапу
searchquery · stringпоиск по названию сделки
include_archivedquery · boolвключать архивные
Пример запроса и ответа
Запрос
curl "https://api.taska.uz/api/public/v1/deals?client_id=c1a2b3d4-0000-4000-8000-000000000001" \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "d4e5f6a7-0000-4000-8000-000000000021",
      "version": 5,
      "title": "Поставка упаковки, июль",
      "client_id": "c1a2b3d4-0000-4000-8000-000000000001",
      "contact_id": "a0b1c2d3-0000-4000-8000-000000000011",
      "amount": 25000000.0,
      "currency": "UZS",
      "stage": "Переговоры",
      "stage_id": "f7a8b9c0-0000-4000-8000-000000000031",
      "funnel_id": "funnel-main",
      "source": "1c",
      "assignee_id": "8a7e6d5c-4b3a-2f1e-0d9c-8b7a6f5e4d3c",
      "tags": [],
      "is_archived": false,
      "created_at": "2026-07-01T09:15:00+00:00",
      "updated_at": "2026-07-03T14:02:00+00:00"
    }
  ],
  "total": 8,
  "limit": 50,
  "offset": 0
}
GET/deals/{id}
scope: crm:read

Сделка по идентификатору.

Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/deals/d4e5f6a7-0000-4000-8000-000000000021 \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "id": "d4e5f6a7-0000-4000-8000-000000000021",
  "version": 5,
  "title": "Поставка упаковки, июль",
  "client_id": "c1a2b3d4-0000-4000-8000-000000000001",
  "amount": 25000000.0,
  "currency": "UZS",
  "stage": "Переговоры",
  "stage_id": "f7a8b9c0-0000-4000-8000-000000000031",
  "funnel_id": "funnel-main",
  "is_archived": false
}
POST/deals
scope: crm:writeправо роли: crm.deals.edit

Создать сделку.

ПараметрГде · типОписание
title *body · stringназвание сделки
client_id / contact_idbody · stringпривязка к контрагенту / контакту
amountbody · numberсумма (≥ 0)
currencybody · stringвалюта, по умолчанию UZS
funnel_id / stagebody · stringворонка и этап
Пример запроса и ответа
Запрос
curl -X POST https://api.taska.uz/api/public/v1/deals \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Поставка упаковки, июль",
    "client_id": "c1a2b3d4-0000-4000-8000-000000000001",
    "amount": 25000000,
    "currency": "UZS"
  }'
Ответ · JSON
{
  "id": "d4e5f6a7-0000-4000-8000-000000000021",
  "version": 1,
  "title": "Поставка упаковки, июль",
  "client_id": "c1a2b3d4-0000-4000-8000-000000000001",
  "amount": 25000000.0,
  "currency": "UZS",
  "stage": "new",
  "is_archived": false
}
PATCH/deals/{id}
scope: crm:writeправо роли: crm.deals.editIf-Match

Изменить сделку (этап, сумму и т.д.). Только меняемые поля.

Пример запроса и ответа
Запрос
curl -X PATCH https://api.taska.uz/api/public/v1/deals/d4e5f6a7-0000-4000-8000-000000000021 \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -H "If-Match: 5" \
  -d '{ "amount": 27500000 }'
Ответ · JSON
{
  "id": "d4e5f6a7-0000-4000-8000-000000000021",
  "version": 6,
  "title": "Поставка упаковки, июль",
  "amount": 27500000.0,
  "currency": "UZS",
  "is_archived": false
}

Номенклатура4

Номенклатура (товары, материалы, услуги, готовая продукция). item_type: product | service | material | finished_good. Услуги не складируются — движения по ним вернут 422.

GET/products
scope: inventory:read

Список позиций номенклатуры.

ПараметрГде · типОписание
limitquery · int1–200, по умолчанию 50
offsetquery · intсмещение, по умолчанию 0
searchquery · stringпоиск по названию / SKU / штрихкоду
include_archivedquery · boolвключать архивные
Пример запроса и ответа
Запрос
curl "https://api.taska.uz/api/public/v1/products?search=короб" \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "i1a2b3c4-0000-4000-8000-000000000041",
      "sku": "BOX-40",
      "name": "Короб картонный 400×300×300",
      "unit": "шт",
      "item_type": "product",
      "category_id": "cat-packaging",
      "cost_per_unit": 6500.0,
      "price": 9000.0,
      "barcode": "4780000000017",
      "manufacturer": null,
      "minStockLevel": 200.0,
      "maxStockLevel": null,
      "isArchived": false,
      "version": 2
    }
  ],
  "total": 57,
  "limit": 50,
  "offset": 0
}
GET/products/{id}
scope: inventory:read

Позиция номенклатуры по идентификатору.

Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/products/i1a2b3c4-0000-4000-8000-000000000041 \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "id": "i1a2b3c4-0000-4000-8000-000000000041",
  "sku": "BOX-40",
  "name": "Короб картонный 400×300×300",
  "unit": "шт",
  "item_type": "product",
  "cost_per_unit": 6500.0,
  "price": 9000.0,
  "isArchived": false,
  "version": 2
}
POST/products
scope: inventory:writeправо роли: org.inventory.edit

Создать позицию номенклатуры.

ПараметрГде · типОписание
name *body · stringназвание позиции
skubody · stringартикул
unitbody · stringединица измерения (шт, кг, м…)
item_typebody · stringproduct | service | material | finished_good
barcode / category_id / cost_per_unitbody · штрихкод, категория, себестоимость (опционально)
Пример запроса и ответа
Запрос
curl -X POST https://api.taska.uz/api/public/v1/products \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -d '{
    "sku": "BOX-40",
    "name": "Короб картонный 400×300×300",
    "unit": "шт",
    "cost_per_unit": 6500
  }'
Ответ · JSON
{
  "id": "i1a2b3c4-0000-4000-8000-000000000041",
  "sku": "BOX-40",
  "name": "Короб картонный 400×300×300",
  "unit": "шт",
  "item_type": "product",
  "cost_per_unit": 6500.0,
  "isArchived": false,
  "version": 1
}
PATCH/products/{id}
scope: inventory:writeправо роли: org.inventory.editIf-Match

Изменить позицию номенклатуры.

Пример запроса и ответа
Запрос
curl -X PATCH https://api.taska.uz/api/public/v1/products/i1a2b3c4-0000-4000-8000-000000000041 \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -H "If-Match: 2" \
  -d '{ "cost_per_unit": 7000 }'
Ответ · JSON
{
  "id": "i1a2b3c4-0000-4000-8000-000000000041",
  "sku": "BOX-40",
  "name": "Короб картонный 400×300×300",
  "cost_per_unit": 7000.0,
  "isArchived": false,
  "version": 3
}

Склады и остатки3

Склады — справочник (чтение). Остатки: onHand — физически на складе, reserved — зарезервировано, available = onHand − reserved. Остатки меняются ТОЛЬКО через движения (см. следующую группу).

GET/warehouses
scope: inventory:read

Список складов.

ПараметрГде · типОписание
limitquery · int1–200, по умолчанию 50
offsetquery · intсмещение, по умолчанию 0
include_archivedquery · boolвключать архивные
Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/warehouses \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "w1a2b3c4-0000-4000-8000-000000000051",
      "name": "Основной склад",
      "code": "MAIN",
      "city": "Ташкент",
      "address_line": "ул. Бунёдкор, 12",
      "isDefault": true,
      "isArchived": false
    }
  ],
  "total": 3,
  "limit": 50,
  "offset": 0
}
GET/warehouses/{id}
scope: inventory:read

Склад по идентификатору.

Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/warehouses/w1a2b3c4-0000-4000-8000-000000000051 \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "id": "w1a2b3c4-0000-4000-8000-000000000051",
  "name": "Основной склад",
  "code": "MAIN",
  "isDefault": true,
  "isArchived": false
}
GET/stock
scope: inventory:read

Остатки номенклатуры по складам. Сопоставление: itemId → /products, warehouseId → /warehouses.

ПараметрГде · типОписание
warehouse_idquery · stringфильтр по складу
item_idquery · stringфильтр по позиции
limitquery · int1–200, по умолчанию 50
offsetquery · intсмещение, по умолчанию 0
Пример запроса и ответа
Запрос
curl "https://api.taska.uz/api/public/v1/stock?warehouse_id=w1a2b3c4-0000-4000-8000-000000000051" \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "sb-000000000061",
      "warehouseId": "w1a2b3c4-0000-4000-8000-000000000051",
      "itemId": "i1a2b3c4-0000-4000-8000-000000000041",
      "onHand": 480.0,
      "reserved": 120.0,
      "available": 360.0,
      "lastMovementAt": "2026-07-03T11:20:00",
      "version": 14
    }
  ],
  "total": 57,
  "limit": 50,
  "offset": 0
}

Движения по складу3

Движения — источник изменения остатков; запись атомарно меняет баланс (блокировки на уровне БД). Основной механизм синхронизации склада из 1С. Пагинация списка — курсорная: сохраняйте next_cursor и запрашивайте только новые движения.

GET/movements
scope: inventory:read

Список движений (новые сверху). Курсорная пагинация — идеально для инкрементальной выгрузки.

ПараметрГде · типОписание
warehouse_idquery · stringфильтр по складу (источник или получатель)
item_idquery · stringфильтр по позиции
kindquery · stringin | out | transfer | adjustment (+ produce | consume)
cursorquery · stringкурсор следующей страницы (next_cursor из ответа)
limitquery · int1–200, по умолчанию 50
Пример запроса и ответа
Запрос
curl "https://api.taska.uz/api/public/v1/movements?kind=in&limit=50" \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "m1a2b3c4-0000-4000-8000-000000000071",
      "kind": "in",
      "date": "2026-07-03T11:20:00",
      "from_warehouse_id": null,
      "to_warehouse_id": "w1a2b3c4-0000-4000-8000-000000000051",
      "reason": "Приход по накладной №123 из 1С",
      "created_by_user_id": "8a7e6d5c-4b3a-2f1e-0d9c-8b7a6f5e4d3c",
      "lines": [
        {
          "id": "ml-000000000081",
          "item_id": "i1a2b3c4-0000-4000-8000-000000000041",
          "qty": "100.000",
          "cost_per_unit": "6500.00",
          "cost_currency": "UZS",
          "batch_id": null,
          "serial_numbers": null,
          "notes": null
        }
      ]
    }
  ],
  "total": 212,
  "limit": 50,
  "next_cursor": "gAAAAABl..."
}
GET/movements/{id}
scope: inventory:read

Движение по идентификатору (со строками).

Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/movements/m1a2b3c4-0000-4000-8000-000000000071 \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "id": "m1a2b3c4-0000-4000-8000-000000000071",
  "kind": "in",
  "date": "2026-07-03T11:20:00",
  "to_warehouse_id": "w1a2b3c4-0000-4000-8000-000000000051",
  "reason": "Приход по накладной №123 из 1С",
  "lines": [
    { "item_id": "i1a2b3c4-0000-4000-8000-000000000041", "qty": "100.000", "cost_per_unit": "6500.00" }
  ]
}
POST/movements
scope: inventory:writeправо роли: org.inventory.edit

Провести движение: приход (in), расход (out), перемещение (transfer, нужен to_warehouse_id), корректировка (adjustment — qty может быть отрицательным). Остатки обновляются сразу и атомарно.

ПараметрГде · типОписание
kind *body · stringin | out | transfer | adjustment
warehouse_id *body · stringсклад (для transfer — источник)
to_warehouse_idbody · stringсклад-получатель (только transfer)
lines *body · array[{ item_id, qty, cost_per_unit? }] — минимум одна строка
notesbody · stringкомментарий (попадает в reason)
reference_type / reference_idbody · stringсвязь с документом внешней системы

reference_type / reference_id — связь с документом внешней системы (например, номером накладной 1С). Для transfer перечислите оба склада; warehouse_id — источник.

Пример запроса и ответа
Запрос
curl -X POST https://api.taska.uz/api/public/v1/movements \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -d '{
    "warehouse_id": "w1a2b3c4-0000-4000-8000-000000000051",
    "kind": "in",
    "notes": "Приход по накладной №123 из 1С",
    "reference_type": "1c_document",
    "reference_id": "НК-000123",
    "lines": [
      { "item_id": "i1a2b3c4-0000-4000-8000-000000000041", "qty": 100, "cost_per_unit": 6500 }
    ]
  }'
Ответ · JSON
{
  "id": "m1a2b3c4-0000-4000-8000-000000000071",
  "kind": "in",
  "date": "2026-07-03T11:20:00",
  "to_warehouse_id": "w1a2b3c4-0000-4000-8000-000000000051",
  "reason": "Приход по накладной №123 из 1С",
  "lines": [
    { "item_id": "i1a2b3c4-0000-4000-8000-000000000041", "qty": "100.000", "cost_per_unit": "6500.00" }
  ]
}

Финансы9

Финансовый контур: заявки на оплату, справочник статей и дебиторка. Заявки доступны по двум эквивалентным путям — историческому /finance-requests и каноническому /finance/requests (одна реализация). Ответы — в camelCase; amount — строка с двумя знаками. Заявитель проставляется автоматически — владелец токена. Внутренние правила согласования сохраняются.

GET/finance-requests
scope: finance:read

Список заявок на оплату.

ПараметрГде · типОписание
limitquery · int1–200, по умолчанию 50
offsetquery · intсмещение, по умолчанию 0
statusquery · stringdraft | pending | approved | rejected | paid
searchquery · stringпоиск по названию
include_archivedquery · boolвключать архивные
Пример запроса и ответа
Запрос
curl "https://api.taska.uz/api/public/v1/finance-requests?status=pending" \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "fr-000000000091",
      "version": 2,
      "title": "Оплата поставщику упаковки",
      "amount": "25000000.00",
      "currency": "UZS",
      "category": "Закупка материалов",
      "counterparty": "ООО «Барака Трейд»",
      "counterpartyInn": "301234567",
      "status": "pending",
      "paymentDate": "2026-07-10",
      "invoiceNumber": "INV-2026-0715",
      "vatAmount": "2500000.00",
      "amountWithVat": "27500000.00",
      "requestedBy": "8a7e6d5c-4b3a-2f1e-0d9c-8b7a6f5e4d3c",
      "createdAt": "2026-07-04T08:30:00+00:00",
      "isArchived": false
    }
  ],
  "total": 6,
  "limit": 50,
  "offset": 0
}
GET/finance-requests/{id}
scope: finance:read

Заявка на оплату по идентификатору.

Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/finance-requests/fr-000000000091 \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "id": "fr-000000000091",
  "version": 2,
  "title": "Оплата поставщику упаковки",
  "amount": "25000000.00",
  "currency": "UZS",
  "status": "pending",
  "paymentDate": "2026-07-10",
  "isArchived": false
}
POST/finance-requests
scope: finance:write

Создать заявку на оплату. Заявитель — владелец токена (подмена невозможна).

ПараметрГде · типОписание
title *body · stringназвание заявки
amount *body · number | stringсумма
currencybody · stringвалюта, по умолчанию UZS
counterparty / category / paymentDate / descriptionbody · реквизиты заявки (опционально)
Пример запроса и ответа
Запрос
curl -X POST https://api.taska.uz/api/public/v1/finance-requests \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Оплата поставщику упаковки",
    "amount": 25000000,
    "currency": "UZS",
    "counterparty": "ООО «Барака Трейд»"
  }'
Ответ · JSON
{
  "id": "fr-000000000091",
  "version": 1,
  "title": "Оплата поставщику упаковки",
  "amount": "25000000.00",
  "currency": "UZS",
  "status": "pending",
  "isArchived": false
}
PATCH/finance-requests/{id}
scope: finance:writeIf-Match

Изменить заявку. Внутренние гейты согласования (запрет self-approve и т.д.) сохраняются.

Пример запроса и ответа
Запрос
curl -X PATCH https://api.taska.uz/api/public/v1/finance-requests/fr-000000000091 \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -H "If-Match: 2" \
  -d '{ "paymentDate": "2026-07-12" }'
Ответ · JSON
{
  "id": "fr-000000000091",
  "version": 3,
  "title": "Оплата поставщику упаковки",
  "paymentDate": "2026-07-12",
  "status": "pending",
  "isArchived": false
}
GET/finance/requests
scope: finance:read

Список заявок на оплату — канонический алиас GET /finance-requests (та же реализация, те же параметры и поля ответа).

ПараметрГде · типОписание
limitquery · int1–200, по умолчанию 50
offsetquery · intсмещение, по умолчанию 0
statusquery · stringdraft | pending | approved | rejected | paid
searchquery · stringпоиск по названию
include_archivedquery · boolвключать архивные
Пример запроса и ответа
Запрос
curl "https://api.taska.uz/api/public/v1/finance/requests?status=pending" \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [ { "id": "fr-000000000091", "title": "Оплата поставщику упаковки", "amount": "25000000.00", "currency": "UZS", "status": "pending" } ],
  "total": 6,
  "limit": 50,
  "offset": 0
}
GET/finance/requests/{id}
scope: finance:read

Заявка на оплату по идентификатору — алиас GET /finance-requests/{id}.

Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/finance/requests/fr-000000000091 \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "id": "fr-000000000091",
  "version": 2,
  "title": "Оплата поставщику упаковки",
  "amount": "25000000.00",
  "currency": "UZS",
  "status": "pending",
  "isArchived": false
}
POST/finance/requests
scope: finance:write

Создать заявку на оплату — алиас POST /finance-requests. Штатная внутренняя цепочка: курс валюты, инициализация согласования, уведомление согласующим. Заявитель — владелец токена; статус "approved" из тела без права finance.approve понижается до "pending".

ПараметрГде · типОписание
title *body · stringназвание заявки
amountbody · number | stringсумма
currencybody · stringвалюта, по умолчанию UZS
category_idbody · stringстатья расходов — id из GET /finance/categories
commentbody · stringкомментарий
Пример запроса и ответа
Запрос
curl -X POST https://api.taska.uz/api/public/v1/finance/requests \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Оплата хостинга",
    "amount": 1200000,
    "currency": "UZS",
    "comment": "Продление на год"
  }'
Ответ · JSON
{
  "id": "fr-000000000092",
  "version": 1,
  "title": "Оплата хостинга",
  "amount": "1200000.00",
  "currency": "UZS",
  "status": "pending",
  "isArchived": false
}
GET/finance/categories
scope: finance:read

Справочник статей расходов / фондов. id статьи подставляется в category_id заявки на оплату.

ПараметрГде · типОписание
limitquery · int1–200, по умолчанию 50
offsetquery · intсмещение, по умолчанию 0
include_archivedquery · boolвключать архивные
Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/finance/categories \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "fc-000000000011",
      "name": "Закупка материалов",
      "type": "fixed",
      "value": "0",
      "color": "#2C7E20",
      "order": 1,
      "parent_category_id": null,
      "isArchived": false
    }
  ],
  "total": 12,
  "limit": 50,
  "offset": 0
}
GET/receivables
scope: finance:read

Дебиторская задолженность (только чтение). status вычисляется из сумм и срока: open | partial | paid | overdue.

ПараметрГде · типОписание
limitquery · int1–200, по умолчанию 50
offsetquery · intсмещение, по умолчанию 0
client_idquery · stringфильтр по контрагенту
deal_idquery · stringфильтр по сделке
Пример запроса и ответа
Запрос
curl "https://api.taska.uz/api/public/v1/receivables?client_id=c-000000000001" \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "ar-000000000031",
      "clientId": "c-000000000001",
      "dealId": "d-000000000042",
      "amount": 18000000,
      "paidAmount": 6000000,
      "currency": "UZS",
      "dueDate": "2026-07-20",
      "status": "partial",
      "paidDate": null,
      "description": "Оплата по договору №14",
      "createdAt": "2026-06-25T09:00:00+00:00"
    }
  ],
  "total": 4,
  "limit": 50,
  "offset": 0
}

Задачи и проекты5

Задачи трекера и справочник проектов. Поля задачи — в snake_case (как у внутреннего API). Видимость зеркалит платформу: без права tasks.view_all владелец токена видит только свои, назначенные ему и наблюдаемые задачи. Создание/изменение дополнительно требуют право tasks.edit у владельца токена.

GET/tasks
scope: tasks:read

Список задач (не-архивные). updated_since — инкрементальная выгрузка: только задачи, изменённые или созданные не раньше метки.

ПараметрГде · типОписание
limitquery · int1–200, по умолчанию 50
offsetquery · intсмещение, по умолчанию 0
statusquery · stringточное имя статуса, как в справочнике статусов
assignee_idquery · stringфильтр по ответственному (id пользователя)
project_idquery · stringфильтр по проекту (id из GET /projects)
updated_sincequery · stringISO 8601 — для инкрементального обмена
Пример запроса и ответа
Запрос
curl "https://api.taska.uz/api/public/v1/tasks?status=В работе&updated_since=2026-07-01T00:00:00Z" \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "3f2b1a90-1111-4c56-9d0e-aaaaaaaaaaaa",
      "version": 4,
      "title": "Подготовить спецификацию для клиента",
      "description": "Согласовать состав поставки",
      "status": "В работе",
      "priority": "Высокий",
      "assignee_id": "8a7e6d5c-4b3a-2f1e-0d9c-8b7a6f5e4d3c",
      "assignee_ids": ["8a7e6d5c-4b3a-2f1e-0d9c-8b7a6f5e4d3c"],
      "project_id": "p-000000000003",
      "start_date": "2026-07-01",
      "end_date": "2026-07-10",
      "end_time": "18:00",
      "deal_id": null,
      "tags": ["клиент"],
      "created_by_user_id": "1c2d3e4f-0000-4a5b-8c9d-bbbbbbbbbbbb",
      "created_at": "2026-07-01T05:12:00+00:00",
      "updated_at": "2026-07-03T11:40:00+00:00"
    }
  ],
  "total": 18,
  "limit": 50,
  "offset": 0
}
GET/tasks/{id}
scope: tasks:read

Задача по идентификатору. Чужая задача (вне видимости токена) возвращает 404 — существование не раскрывается.

Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/tasks/3f2b1a90-1111-4c56-9d0e-aaaaaaaaaaaa \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "id": "3f2b1a90-1111-4c56-9d0e-aaaaaaaaaaaa",
  "version": 4,
  "title": "Подготовить спецификацию для клиента",
  "status": "В работе",
  "priority": "Высокий",
  "assignee_id": "8a7e6d5c-4b3a-2f1e-0d9c-8b7a6f5e4d3c",
  "end_date": "2026-07-10",
  "end_time": "18:00"
}
POST/tasks
scope: tasks:writeправо роли: tasks.edit

Создать задачу. Штатная внутренняя цепочка: валидация дедлайна (дата в прошлом → 422), событие task.assigned, Telegram/in-app уведомление исполнителю, журнал. Создатель — владелец токена (подмена невозможна).

ПараметрГде · типОписание
title *body · stringназвание задачи
descriptionbody · stringописание
statusbody · stringстатус; по умолчанию начальный статус справочника
prioritybody · stringприоритет
assignee_idbody · stringответственный (id пользователя)
assignee_idsbody · arrayсоисполнители
project_idbody · stringпроект
start_date / end_datebody · stringYYYY-MM-DD; дедлайн в прошлом → 422
end_timebody · stringвремя дедлайна HH:MM
deal_idbody · stringпривязка к сделке
tagsbody · arrayтеги
watcher_idsbody · arrayнаблюдатели (id пользователей)
Пример запроса и ответа
Запрос
curl -X POST https://api.taska.uz/api/public/v1/tasks \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Выставить счёт по заказу 1С-00042",
    "assignee_id": "8a7e6d5c-4b3a-2f1e-0d9c-8b7a6f5e4d3c",
    "end_date": "2026-07-15",
    "end_time": "17:00"
  }'
Ответ · JSON
{
  "id": "5e6f7a80-2222-4d67-8e1f-cccccccccccc",
  "version": 1,
  "title": "Выставить счёт по заказу 1С-00042",
  "status": "К выполнению",
  "assignee_id": "8a7e6d5c-4b3a-2f1e-0d9c-8b7a6f5e4d3c",
  "end_date": "2026-07-15",
  "end_time": "17:00",
  "created_at": "2026-07-06T06:00:00+00:00"
}
PATCH/tasks/{id}
scope: tasks:writeправо роли: tasks.editIf-Match

Изменить задачу (только переданные поля): status, title, assignee_id, end_date и др. Валидация статусного перехода и дедлайна — как во внутреннем API. Изменение priority дополнительно требует право tasks.set_priority. Ответ несёт заголовок ETag с новой версией.

Пример запроса и ответа
Запрос
curl -X PATCH https://api.taska.uz/api/public/v1/tasks/5e6f7a80-2222-4d67-8e1f-cccccccccccc \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -H "If-Match: 1" \
  -d '{ "status": "Выполнено" }'
Ответ · JSON
{
  "id": "5e6f7a80-2222-4d67-8e1f-cccccccccccc",
  "version": 2,
  "title": "Выставить счёт по заказу 1С-00042",
  "status": "Выполнено"
}
GET/projects
scope: tasks:read

Справочник проектов (не-архивные). id подставляется в фильтр GET /tasks?project_id=…

ПараметрГде · типОписание
limitquery · int1–200, по умолчанию 50
offsetquery · intсмещение, по умолчанию 0
Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/projects \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    { "id": "p-000000000003", "name": "Внедрение CRM", "icon": "🚀", "color": "#2C7E20" }
  ],
  "total": 5,
  "limit": 50,
  "offset": 0
}

Бизнес-процессы4

Движок бизнес-процессов: чтение шаблонов и запущенных процессов, запуск нового процесса из внешней системы. Видимость зеркалит платформу: не-администратор БП видит только процессы, которые инициировал или в которых участвует (исполнитель этапа).

GET/process-templates
scope: bpm:read

Активные (опубликованные) шаблоны процессов. id шаблона используется в POST /processes.

ПараметрГде · типОписание
limitquery · int1–200, по умолчанию 50
offsetquery · intсмещение, по умолчанию 0
Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/process-templates \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "pt-000000000007",
      "title": "Согласование договора",
      "trigger_entity": "deal",
      "category": "Продажи",
      "description": "Юрист → финдир → подпись"
    }
  ],
  "total": 3,
  "limit": 50,
  "offset": 0
}
GET/processes
scope: bpm:read

Запущенные процессы (инстансы) с активными этапами и прогрессом 0–100.

ПараметрГде · типОписание
limitquery · int1–200, по умолчанию 50
offsetquery · intсмещение, по умолчанию 0
statusquery · stringrunning | completed | cancelled | failed
template_idquery · stringфильтр по шаблону
entity_typequery · stringтип привязанной сущности (deal/client/task)
entity_idquery · stringid привязанной сущности
Пример запроса и ответа
Запрос
curl "https://api.taska.uz/api/public/v1/processes?status=running" \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "pi-000000000021",
      "template_id": "pt-000000000007",
      "template_title": "Согласование договора",
      "status": "running",
      "entity_type": "deal",
      "entity_id": "d-000000000042",
      "initiated_by_id": "8a7e6d5c-4b3a-2f1e-0d9c-8b7a6f5e4d3c",
      "current_stage_ids": ["st-000000000102"],
      "progress": 40,
      "started_at": "2026-07-05T10:00:00+00:00",
      "completed_at": null
    }
  ],
  "total": 2,
  "limit": 50,
  "offset": 0
}
GET/processes/{id}
scope: bpm:read

Один процесс с полным списком этапов stage_instances (статус, исполнитель, решение, отметки времени). Вне видимости токена → 404.

Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/processes/pi-000000000021 \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "id": "pi-000000000021",
  "template_title": "Согласование договора",
  "status": "running",
  "current_stage_ids": ["st-000000000102"],
  "stage_instances": [
    { "id": "st-000000000101", "stage_title": "Проверка юристом", "stage_type": "approval", "status": "completed", "decision": "approved" },
    { "id": "st-000000000102", "stage_title": "Виза финдиректора", "stage_type": "approval", "status": "active", "assignee_id": "1c2d3e4f-0000-4a5b-8c9d-bbbbbbbbbbbb" }
  ]
}
POST/processes
scope: bpm:execute

Запустить процесс из опубликованного шаблона. Инициатор — владелец токена; активируется стартовый этап, пишется журнал. Шаблон не найден → 404, не опубликован → 409, нет стартового этапа → 422. Поддерживает Idempotency-Key.

ПараметрГде · типОписание
template_id *body · stringid шаблона из GET /process-templates
entity_typebody · stringпривязка: deal | client | task
entity_idbody · stringid привязанной сущности
variablesbody · objectстартовые переменные процесса (принимается и ключ initial_variables)
Пример запроса и ответа
Запрос
curl -X POST https://api.taska.uz/api/public/v1/processes \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -d '{
    "template_id": "pt-000000000007",
    "entity_type": "deal",
    "entity_id": "d-000000000042",
    "variables": { "contract_no": "Д-2026/114" }
  }'
Ответ · JSON
{
  "id": "pi-000000000022",
  "template_id": "pt-000000000007",
  "status": "running",
  "current_stage_ids": ["st-000000000110"],
  "started_at": "2026-07-06T06:10:00+00:00"
}

Сотрудники1

Справочник сотрудников — только безопасные поля (whitelist-проекция). Кадровые данные — оклад, дата рождения, документы — через открытое API недоступны никогда.

GET/employees
scope: hr:read

Список сотрудников (не-архивные).

ПараметрГде · типОписание
limitquery · int1–200, по умолчанию 50
offsetquery · intсмещение, по умолчанию 0
department_idquery · stringфильтр по подразделению
statusquery · stringфильтр по статусу (active/…)
searchquery · stringпоиск по ФИО
Пример запроса и ответа
Запрос
curl "https://api.taska.uz/api/public/v1/employees?search=Алиев" \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "emp-000000000012",
      "user_id": "8a7e6d5c-4b3a-2f1e-0d9c-8b7a6f5e4d3c",
      "full_name": "Алиев Шерзод",
      "position": "Менеджер по продажам",
      "department_id": "dep-000000000002",
      "status": "active"
    }
  ],
  "total": 1,
  "limit": 50,
  "offset": 0
}

Производство2

Производственные заказы — только чтение (camelCase, как во внутреннем API). Запись сознательно не даётся: заказ рождается из сделки или конвейера платформы с BOM/маршрутом — внешняя запись мимо этих инвариантов опасна.

GET/production/orders
scope: production:read

Список производственных заказов (не-архивные).

ПараметрГде · типОписание
limitquery · int1–200, по умолчанию 50
offsetquery · intсмещение, по умолчанию 0
statusquery · stringopen | in_progress | completed | …
pipeline_idquery · stringфильтр по конвейеру
deal_idquery · stringфильтр по сделке
Пример запроса и ответа
Запрос
curl "https://api.taska.uz/api/public/v1/production/orders?status=in_progress" \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "po-000000000009",
      "title": "Заказ №9 — стеллажи",
      "status": "in_progress",
      "pipelineId": "pp-000000000001",
      "currentStageId": "stage-cut",
      "dealId": "d-000000000042",
      "items": [ { "name": "Стеллаж 2000×600", "qty": 10 } ],
      "qtyToProduce": 10,
      "qtyProduced": 4,
      "customerName": "ООО «Барака Трейд»",
      "plannedDeliveryDate": "2026-07-18",
      "monitorStatus": "ok"
    }
  ],
  "total": 3,
  "limit": 50,
  "offset": 0
}
GET/production/orders/{id}
scope: production:read

Один заказ — те же поля, что в списке, плюс currentStage {id, title} — текущий этап маршрута (null, если этап/конвейер не назначены).

Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/production/orders/po-000000000009 \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "id": "po-000000000009",
  "title": "Заказ №9 — стеллажи",
  "status": "in_progress",
  "qtyToProduce": 10,
  "qtyProduced": 4,
  "currentStage": { "id": "stage-cut", "title": "Раскрой" }
}

Встречи (календарь)2

Календарь встреч. Повторяющиеся встречи разворачиваются по RRULE — каждое вхождение отдельным элементом. Видимость: владелец токена видит встречи, где он владелец или участник; администратор — все.

GET/meetings
scope: calendar:read

Встречи за период. Окно from/to обязательно; максимум 500 элементов.

ПараметрГде · типОписание
from *query · stringначало окна, ISO 8601
to *query · stringконец окна, ISO 8601
limitquery · int1–500, по умолчанию 500
Пример запроса и ответа
Запрос
curl "https://api.taska.uz/api/public/v1/meetings?from=2026-07-06T00:00:00Z&to=2026-07-13T00:00:00Z" \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "m-000000000055",
      "title": "Планёрка отдела продаж",
      "start_at": "2026-07-07T04:00:00+00:00",
      "end_at": "2026-07-07T04:30:00+00:00",
      "duration_minutes": 30,
      "location": "Переговорная 1",
      "video_url": null,
      "participantIds": ["8a7e6d5c-4b3a-2f1e-0d9c-8b7a6f5e4d3c"],
      "recurrence_rule": "FREQ=WEEKLY;BYDAY=TU",
      "owner_user_id": "1c2d3e4f-0000-4a5b-8c9d-bbbbbbbbbbbb"
    }
  ],
  "total": 6,
  "limit": 500,
  "offset": 0
}
POST/meetings
scope: calendar:writeправо роли: content.meetings.manage

Создать встречу. Штатная внутренняя цепочка: участники для напоминаний, событие meeting.created, in-app + Telegram уведомления участникам и в общий чат. Владелец встречи — владелец токена; start_at в прошлом → 422.

ПараметрГде · типОписание
title *body · stringназвание встречи
start_at *body · stringначало, ISO 8601
end_atbody · stringконец; если не задан — start_at + 60 минут
participant_idsbody · arrayучастники (id пользователей); создатель добавляется автоматически
location / video_url / summarybody · stringместо, ссылка на видеозвонок, повестка
recurrence_rulebody · stringRRULE повторения (RFC 5545)
reminder_minutesbody · intнапоминание за N минут
Пример запроса и ответа
Запрос
curl -X POST https://api.taska.uz/api/public/v1/meetings \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Демо для клиента",
    "start_at": "2026-07-09T10:00:00+05:00",
    "participant_ids": ["8a7e6d5c-4b3a-2f1e-0d9c-8b7a6f5e4d3c"]
  }'
Ответ · JSON
{
  "id": "m-000000000056",
  "title": "Демо для клиента",
  "start_at": "2026-07-09T05:00:00+00:00",
  "end_at": "2026-07-09T06:00:00+00:00",
  "participantIds": ["8a7e6d5c-4b3a-2f1e-0d9c-8b7a6f5e4d3c", "1c2d3e4f-0000-4a5b-8c9d-bbbbbbbbbbbb"]
}

Заказы (КП)2

Заказы / коммерческие предложения — только чтение. deal_id пуст у standalone-заказов (созданных без сделки). items[] — позиции заказа.

GET/commercial-orders
scope: crm:read

Список заказов/КП (не-архивные).

ПараметрГде · типОписание
limitquery · int1–200, по умолчанию 50
offsetquery · intсмещение, по умолчанию 0
deal_idquery · stringфильтр по сделке
client_idquery · stringфильтр по контрагенту (standalone-заказы)
statusquery · stringdraft | sent | confirmed | approved | transferred | fulfilled
Пример запроса и ответа
Запрос
curl "https://api.taska.uz/api/public/v1/commercial-orders?status=approved" \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "co-000000000017",
      "deal_id": "d-000000000042",
      "client_id": "c-000000000001",
      "title": "КП №17 — стеллажи",
      "status": "approved",
      "currency": "UZS",
      "items": [ { "name": "Стеллаж 2000×600", "qty": 10, "price": 1800000 } ],
      "production_order_id": "po-000000000009",
      "approved_at": "2026-07-05T12:00:00+00:00",
      "created_at": "2026-07-04T09:00:00+00:00"
    }
  ],
  "total": 2,
  "limit": 50,
  "offset": 0
}
GET/commercial-orders/{id}
scope: crm:read

Один заказ/КП — тот же набор полей, что в списке.

Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/commercial-orders/co-000000000017 \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "id": "co-000000000017",
  "deal_id": "d-000000000042",
  "title": "КП №17 — стеллажи",
  "status": "approved",
  "items": [ { "name": "Стеллаж 2000×600", "qty": 10, "price": 1800000 } ]
}

Вебхуки (подписки)4

Исходящие вебхуки: Taska сама отправляет POST на ваш URL при событиях (создана сделка, оплата проведена и т.д.). Управление подпиской требует scope admin:all. Формат доставки и проверка подписи — в разделе «Вебхуки» ниже.

GET/webhooks/event-catalog
scope: admin:all

Каталог событий, на которые можно подписаться.

Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/webhooks/event-catalog \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "events": [
    "client.created", "client.updated",
    "deal.created", "deal.updated", "deal.won", "deal.lost",
    "finance_request.created", "finance_request.approved", "finance_request.paid",
    "*"
  ]
}
GET/webhooks
scope: admin:all

Список зарегистрированных вебхуков со статистикой доставки.

Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/webhooks \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "wh-000000000101",
      "name": "1С интеграция",
      "url": "https://erp.example.uz/taska/webhook",
      "events": ["deal.won", "finance_request.paid"],
      "isActive": true,
      "failureCount": 0,
      "lastSuccessAt": "2026-07-04T10:00:00+00:00",
      "lastFailureAt": null
    }
  ]
}
POST/webhooks
scope: admin:all

Зарегистрировать вебхук. secret возвращается ОДИН РАЗ — сохраните его для проверки HMAC-подписи. events — список из каталога или ["*"] для всех событий.

ПараметрГде · типОписание
name *body · stringназвание подписки
url *body · stringHTTPS-URL вашего обработчика
events *body · arrayсобытия из каталога или ["*"]
Пример запроса и ответа
Запрос
curl -X POST https://api.taska.uz/api/public/v1/webhooks \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "1С интеграция",
    "url": "https://erp.example.uz/taska/webhook",
    "events": ["deal.won", "finance_request.paid"]
  }'
Ответ · JSON
{
  "id": "wh-000000000101",
  "name": "1С интеграция",
  "url": "https://erp.example.uz/taska/webhook",
  "events": ["deal.won", "finance_request.paid"],
  "isActive": true,
  "secret": "whsec_Zm9vYmFyYmF6cXV4...",
  "note": "Секрет показывается один раз — сохраните его для проверки HMAC-подписи X-Webhook-Signature."
}
DELETE/webhooks/{id}
scope: admin:all

Отключить вебхук.

Пример запроса и ответа
Запрос
curl -X DELETE https://api.taska.uz/api/public/v1/webhooks/wh-000000000101 \
  -H "X-API-Token: tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{ "ok": true }

Вебхуки: доставка, подпись, ретраи

Вместо постоянного опроса Taska сама отправляет POST на ваш URL при событиях: создана сделка, проведена оплата и т.д. Подписка — через группу «Вебхуки» справочника (scope admin:all).

Формат доставки

На каждый настроенный URL приходит POST с JSON-телом: event — тип события, data — данные (entityType, entityId и контекст события), ts — время события.

POST → ваш URL
{
  "event": "deal.won",
  "data": {
    "entityType": "deal",
    "entityId": "d4e5f6a7-0000-4000-8000-000000000021"
  },
  "ts": "2026-07-04T10:00:00+00:00"
}

Подпись X-Webhook-Signature

Каждая доставка подписана: заголовок X-Webhook-Signature — HMAC-SHA256 (hex) от сырого тела запроса с вашим secret (выдаётся один раз при создании вебхука). Проверяйте подпись до обработки.

python
import hashlib, hmac

def verify(secret: str, raw_body: bytes, signature: str) -> bool:
    expected = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, signature)

# signature — значение заголовка X-Webhook-Signature

Ретраи

Отвечайте 2xx как можно быстрее (обработку выполняйте асинхронно). При сбое Taska повторит доставку до 5 раз с растущим интервалом: 1 мин → 5 мин → 30 мин → 2 ч → 8 ч.

Вебхуки — best-effort push в реальном времени. Для гарантированной синхронизации дополняйте их периодическим опросом (GET /movements?cursor=…, GET /deals) — он «догонит» события, если ваш сервер был недоступен.

Ошибки и лимиты

Все ошибки приходят в едином JSON-конверте:

error envelope
{
  "error": "conflict",
  "message": "Объект изменён параллельно — перечитайте и повторите.",
  "request_id": "9c1d2e3f-4a5b-6c7d-8e9f-0a1b2c3d4e5f",
  "details": { "error": "stale_version" }
}

error — машинный код класса ошибки; message — человекочитаемое описание; details — контекст (код доменной ошибки, поля валидации); request_id — идентификатор запроса, приложите его к обращению в поддержку.

Коды ответов

200 / 201Успех (201 — объект создан)
401Нет или неверный токен (api_token_required)
403Не хватает scope или права роли (insufficient_scope / forbidden)
404Объект не найден (not_found)
409Конфликт: дубликат id или устаревшая версия при If-Match (stale_version)
422Ошибка валидации входных данных (validation_error)
429Превышен лимит запросов — повторите после Retry-After

Лимиты

Ориентир — до 300 запросов в минуту на токен; при 429 приходят заголовки Retry-After и X-RateLimit-*. POST-запросы поддерживают заголовок Idempotency-Key: повтор с тем же ключом и телом вернёт кэшированный ответ вместо дубля операции.

Интеграция с 1С

Открытое API спроектировано под типовой обмен с 1С: справочники, остатки, документы движения и события в реальном времени.

  • Справочники: выгружайте контрагентов и номенклатуру (GET /clients, GET /products). При загрузке из 1С передавайте свои id (UUID) — повторная синхронизация не создаст дублей (дубликат id → 409).
  • Склад: проводите приходы и расходы через POST /movements с reference_type/reference_id (номер документа 1С) — остатки обновляются атомарно, /stock всегда актуален.
  • Инкрементальный обмен: GET /movements с курсором — 1С хранит последний next_cursor и забирает только новые движения.
  • Реальное время: подпишите HTTP-сервис 1С на вебхуки (deal.won, finance_request.paid) и проверяйте подпись X-Webhook-Signature перед обработкой.
1С (BSL)
Соединение = Новый HTTPСоединение("api.taska.uz", 443,,,,, Новый ЗащищённоеСоединениеOpenSSL);
Запрос = Новый HTTPЗапрос("/api/public/v1/ping");
Запрос.Заголовки.Вставить("X-API-Token", "tsk_<слаг>_<секрет>");
Ответ = Соединение.Получить(Запрос);
// Ответ.ПолучитьТелоКакСтроку() → {"ok":true,"apiVersion":"v1","scopes":[...]}

Нужна помощь с подключением 1С или нестандартный сценарий обмена — оставьте заявку, поможем спроектировать интеграцию.

Посмотреть демо модулей Taska

Оставьте контакты для персональной презентации или откройте онлайн-демо прямо сейчас.