Портал разработчика
Справочник legacy REST API

Открытое API Taska

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

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

Developer Platform V20

Создавайте продукты на Taska Core

Подписанные пакеты, capabilities, OAuth apps, SDK, CLI, боты проектов и управляемые релизы.

Открыть платформу

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

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

  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" }
}

Taska Developer Platform

Собирайте продукты на общем ядре Taska. Product manifests выбирают модули, вертикальные настройки и разрешённые действия, а Capabilities API даёт машиночитаемый контракт для интеграций.

Продуктовые пакеты

Flowa

beta

beauty · finance · integrations · inventory · notifications · platform · service_ops · workdesk

OneSwim

beta

integrations · inventory · notifications · platform · service_ops · sports

Ventro

beta

docs · finance · integrations · investor_portal · notifications · platform · workdesk

Возможности платформы

Access1
access
AI assistant40
ai
Approvals1
approvals
Automations1
automations
Beauty appointments3
beauty
Billing and quotas1
billing
Business processes1
bpm
Calendar and meetings3
calendar
Communications1
communications
Number sequences1
counter
CRM and sales6
crm
Documents1
documents
Electronic document exchange3
edo
Domain events1
event_bus
Files1
files
Identity and challenges2
identity
Inventory1
inventory
Learning and courses3
learning
Ledger1
ledger
Logistics and dispatch4
logistics
Mail1
mail
Metrics1
metrics
Notifications1
notifications
Payments and refunds3
payments
Schedules and bookings4
service_ops
Sports competitions and results12
sports
Tasks and collaboration4
tasks

Каждое действие указывает режим, необходимые модули и права, уровень риска, подтверждение и Idempotency-Key.

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

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

Все пути указаны относительно базового 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 — показать).

Служебные2

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

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

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

Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/ping \
  -H "Authorization: Bearer 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"
}
GET/capabilities
любой валидный токен

Машиночитаемый каталог продуктов, операторов, действий и заготовок решений.

Каталог описывает требования к действиям. Мутации выполняются через доменные endpoints.

Пример запроса и ответа
Запрос
curl https://api.taska.uz/api/public/v1/capabilities \
  -H "Authorization: Bearer tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "schemaVersion": 2,
  "products": [{ "slug": "ventro", "status": "draft" }],
  "capabilities": [{
    "key": "documents",
    "version": 1,
    "kind": "business",
    "dependsOn": ["access", "event_bus", "files"],
    "providers": [],
    "exposure": "internal",
    "actions": [{ "scope": "documents:instance.create", "mode": "write" }]
  }],
  "solutionBlueprints": [{
    "key": "task_workspace",
    "maturity": "ready",
    "operators": ["tasks", "calendar", "documents"]
  }]
}

Контрагенты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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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": "RUB",
      "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 "Authorization: Bearer tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "id": "d4e5f6a7-0000-4000-8000-000000000021",
  "version": 5,
  "title": "Поставка упаковки, июль",
  "client_id": "c1a2b3d4-0000-4000-8000-000000000001",
  "amount": 25000000.0,
  "currency": "RUB",
  "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валюта, по умолчанию RUB
funnel_id / stagebody · stringворонка и этап
Пример запроса и ответа
Запрос
curl -X POST https://api.taska.uz/api/public/v1/deals \
  -H "Authorization: Bearer tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Поставка упаковки, июль",
    "client_id": "c1a2b3d4-0000-4000-8000-000000000001",
    "amount": 25000000,
    "currency": "RUB"
  }'
Ответ · JSON
{
  "id": "d4e5f6a7-0000-4000-8000-000000000021",
  "version": 1,
  "title": "Поставка упаковки, июль",
  "client_id": "c1a2b3d4-0000-4000-8000-000000000001",
  "amount": 25000000.0,
  "currency": "RUB",
  "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 "Authorization: Bearer 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": "RUB",
  "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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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": "RUB",
          "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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "fr-000000000091",
      "version": 2,
      "title": "Оплата поставщику упаковки",
      "amount": "25000000.00",
      "currency": "RUB",
      "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 "Authorization: Bearer tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "id": "fr-000000000091",
  "version": 2,
  "title": "Оплата поставщику упаковки",
  "amount": "25000000.00",
  "currency": "RUB",
  "status": "pending",
  "paymentDate": "2026-07-10",
  "isArchived": false
}
POST/finance-requests
scope: finance:write

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

ПараметрГде · типОписание
title *body · stringназвание заявки
amount *body · number | stringсумма
currencybody · stringвалюта, по умолчанию RUB
counterparty / category / paymentDate / descriptionbody · реквизиты заявки (опционально)
Пример запроса и ответа
Запрос
curl -X POST https://api.taska.uz/api/public/v1/finance-requests \
  -H "Authorization: Bearer tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Оплата поставщику упаковки",
    "amount": 25000000,
    "currency": "RUB",
    "counterparty": "ООО «Барака Трейд»"
  }'
Ответ · JSON
{
  "id": "fr-000000000091",
  "version": 1,
  "title": "Оплата поставщику упаковки",
  "amount": "25000000.00",
  "currency": "RUB",
  "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 "Authorization: Bearer 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 "Authorization: Bearer tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [ { "id": "fr-000000000091", "title": "Оплата поставщику упаковки", "amount": "25000000.00", "currency": "RUB", "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 "Authorization: Bearer tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "id": "fr-000000000091",
  "version": 2,
  "title": "Оплата поставщику упаковки",
  "amount": "25000000.00",
  "currency": "RUB",
  "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валюта, по умолчанию RUB
category_idbody · stringстатья расходов — id из GET /finance/categories
commentbody · stringкомментарий
Пример запроса и ответа
Запрос
curl -X POST https://api.taska.uz/api/public/v1/finance/requests \
  -H "Authorization: Bearer tsk_acme_4f9d21c07ab356e8..." \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Оплата хостинга",
    "amount": 1200000,
    "currency": "RUB",
    "comment": "Продление на год"
  }'
Ответ · JSON
{
  "id": "fr-000000000092",
  "version": 1,
  "title": "Оплата хостинга",
  "amount": "1200000.00",
  "currency": "RUB",
  "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 "Authorization: Bearer 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 "Authorization: Bearer tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "ar-000000000031",
      "clientId": "c-000000000001",
      "dealId": "d-000000000042",
      "amount": 18000000,
      "paidAmount": 6000000,
      "currency": "RUB",
      "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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer tsk_acme_4f9d21c07ab356e8..."
Ответ · JSON
{
  "items": [
    {
      "id": "co-000000000017",
      "deal_id": "d-000000000042",
      "client_id": "c-000000000001",
      "title": "КП №17 — стеллажи",
      "status": "approved",
      "currency": "RUB",
      "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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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 "Authorization: Bearer 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

Готовы трансформировать свой бизнес?

Подберём модули Taska под ваши процессы и покажем подходящий сценарий запуска.