На главную

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

Открытое API Taska

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

v1 · 31 эндпоинт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Создание и изменение заявок на оплату
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" }
  ]
}

Оплаты (заявки)4

Заявки на оплату (финансовый контур). Ответы — в 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
}

Вебхуки (подписки)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

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