Документация Laitap

Руководство по desktop-приложению: обзор продукта, скрипты, фаззинг JSON, мультиплексор запросов и REST API для автоматизации (раздел ниже).

О приложении

Laitap — desktop API-клиент для Windows, macOS и Linux. Отправляйте HTTP-запросы, собирайте коллекции, работайте в команде и публикуйте документацию API — в духе Postman, но со своими возможностями.

Основные возможности

  • Коллекции и папки — структура запросов, переменные на уровне коллекции и папок, наследование auth. Раздел «Переменные» →
  • Импорт Postman — загрузка коллекций v2.x в приложение.
  • Импорт трафика — HAR, Fiddler SAZ, Charles, PCAP → коллекция с ответами. Перейти к разделу Импорт трафика →
  • Cookie jar — автосохранение cookies, менеджер, отключение jar на отдельный запрос.
  • Команды и облако — общие workspace, синхронизация коллекций, совместное редактирование с presence.
  • Публичная документация — публикация коллекции на laitap.pro/docs/… с примерами curl/JS/Python/Go. Документация REST API →
  • Глобальный поискCtrl+Shift+F по URL, заголовкам, JSON, описаниям и OCR скриншотов в примерах.
  • Scripts — автоматизация до и после запроса. Перейти к разделу Scripts →
  • Фаззинг JSON — генерация «мусорных» и граничных вариантов тела запроса для проверки устойчивости API. Перейти к разделу Фаззинг JSON →
  • Мультиплексор (ковёр) — до 10 запросов параллельно или с задержкой; ответы на одном экране плитками, красные — ошибки и 5xx. Перейти к разделу Мультиплексор →
  • Снимок запроса (.snapshot) — один файл со всем контекстом бага: URL, тело, переменные, auth, scripts, последний ответ. Перейти к разделу Снимок →

Теги и умные папки

  • Теги на запросах — вкладка Tags в редакторе запроса (#платёжка, #баг, #wip).
  • Умная папка — в контекстном меню коллекции или папки: «Умная папка». Режим по тегам (любой / все) или по правилам: код ответа, запуск за N дней, метод, URL, имя.
  • Правила по ответу работают после Send — сохраняются lastStatusCode и lastRunAt на запросе.

Zero Knowledge шифрование

Для каждого workspace (личного или командного) можно включить отдельное шифрование коллекций. Это режим Zero Knowledge: сервер хранит только зашифрованные данные и не может прочитать содержимое без вашего пароля.

  • Пароль vault создаётся и проверяется только на устройстве.
  • У каждого workspace свой пароль — личный и командные не связаны.
  • В команде шифрование включают владелец и администраторы; участники разблокируют хранилище локально.
  • «Заблокировать» убирает ключ из памяти для выбранного workspace и скрывает его коллекции до повторного ввода пароля.
Включить: Настройки → Приложение → Шифрование по workspace. Потеря пароля означает потерю доступа к зашифрованным данным — восстановить содержимое на сервере нельзя.

Где начать

Скачать приложение Веб-демо Changelog

Переменные

Переменные — пары «ключ → значение» для подстановки в URL, заголовки, тело запроса и поля авторизации через синтаксис {{имя}}. В Laitap переменные задаются на уровне коллекции и папок; вложенные папки наследуют и переопределяют значения родителя.

Где задать

  • Коллекция — вкладка Variables в редакторе коллекции (правый клик → Edit).
  • Папка — те же поля в редакторе папки; переменные папки перекрывают одноимённые ключи коллекции для запросов внутри неё.
  • Скрипты — изменение во время выполнения через pm.collectionVariables.set('key', 'value'). Раздел Scripts →

Поля переменной

Поле Тип Описание
key string Имя переменной. Используется в {{key}}. Пустые ключи игнорируются.
value string Значение для подстановки. Может содержать другие {{var}} — они разрешаются после pre-request скриптов.
enabled boolean true (по умолчанию) — переменная участвует в подстановке. false — отключена, как в Postman.
description string Произвольное описание для команды: назначение переменной, откуда брать значение, ограничения. Отображается в таблице Variables в приложении; в REST API и при публикации docs передаётся как метаданные.

Порядок разрешения

При отправке запроса итоговая карта переменных строится так:

  1. Переменные коллекции (включённые строки).
  2. Переменные каждой папки по пути от корня к запросу — последнее значение побеждает.
  3. Изменения из pre-request скриптов (через pm.collectionVariables).
Подстановка {{name}} выполняется после pre-request скриптов в URL, query-параметрах, заголовках, raw/GraphQL теле и строковых полях auth (Bearer, Basic, API Key и др.). Неразрешённые плейсхолдеры остаются как {{name}}.

API в скриптах

Объект pm.collectionVariables (алиасы: pm.variables, pm.environment, pm.globals):

Метод Описание
.get(key) Текущее значение переменной или пустая строка.
.set(key, value) Установить или обновить переменную для текущего запроса.
.has(key) true, если ключ есть в карте (включая установленные в скрипте).
.unset(key) Удалить переменную из карты текущего запроса.

REST API

В теле коллекции/папки поле variables — массив объектов с полями key, value, enabled, description. При публикации docs можно передать publishedVariables — безопасные значения для читателей документации. Схема REST API →

{
  "variables": [
    {
      "key": "baseUrl",
      "value": "https://api.example.com",
      "enabled": true,
      "description": "Базовый URL стенда (prod/stage)"
    },
    {
      "key": "apiKey",
      "value": "{{vault:apiKey}}",
      "enabled": true,
      "description": "Ключ API — подставляется из vault или скрипта"
    }
  ]
}

Scripts

Скрипты позволяют менять запрос перед отправкой и проверять ответ после. API похож на Postman pm: переменные коллекции, URL, метод, заголовки.

Где писать скрипты

  • Pre-request Script — на коллекции, папке или отдельном запросе (вкладка Scripts в редакторе запроса или в настройках сущности коллекции).
  • Post-response Script (Tests) — только JavaScript, на запросе, папке или коллекции.

Порядок выполнения

Pre-request (перед отправкой HTTP):

  1. Скрипт коллекции
  2. Скрипты папок сверху вниз по пути к запросу
  3. Скрипт запроса

Post-response (после ответа): в обратном порядке — сначала запрос, затем папки снизу вверх, затем коллекция.

Языки Pre-request

Язык Среда Когда выбрать
JavaScript Встроенный sandbox По умолчанию; совместимость с Postman, crypto-js, uuid
Python Pyodide (WASM) в renderer Удобные строки и логика без Node.js; объект pm как в Postman
Go Нативный runner Строгая типизация, команды на Go; API через pm.Pm
Язык выбирается отдельно для каждой сущности (коллекция / папка / запрос) в выпадающем списке на вкладке Scripts. Post-response всегда JavaScript.

Объект pm — что доступно

  • pm.collectionVariables / pm.variables — get, set, has, unset
  • pm.request.url, pm.request.method
  • pm.request.headers — add, upsert, remove, get
  • Post-response: pm.response, pm.test(), pm.expect()

Переменные {{name}} в URL и теле подставляются после pre-request скриптов, с учётом изменений из скрипта.

Примеры Pre-request


                

Пример Post-response (только JS)

pm.test('Status is 200', function () {
  pm.response.to.have.status(200);
});

const json = pm.response.json();
pm.collectionVariables.set('lastId', json.id);

Советы

  • Используйте реальные URL в тестах, например https://httpbin.org/get — домены вроде api.example.com часто не резолвятся в DNS.
  • Пустой скрипт не меняет запрос — можно оставить язык Python/Go и дописать код позже.
  • Ошибки скрипта показываются до отправки HTTP; при успехе запрос уходит с обновлённым URL, заголовками и переменными.

REST API для автоматизации

Фаззинг JSON

Фаззинг JSON — встроенный генератор вариантов тела запроса для ручного тестирования API. Вы задаёте «эталонный» JSON, приложение по правилам меняет отдельные поля на граничные и «плохие» значения. Без нейросетей: только комбинаторика и заранее заданные мутации.

Кому полезно: QA и разработчикам, которые проверяют, как API реагирует на пустые строки, огромные числа, null, бинарный мусор в тексте, пустые массивы и прочий невалидный с точки зрения бизнес-логики ввод.

Где находится в приложении

  1. Откройте запрос в коллекции или создайте новый.
  2. Перейдите на вкладку Body.
  3. Для REST: режим raw и тип JSON — панель «Фаззинг JSON» появится над редактором тела.
  4. Для GraphQL: панель находится над полем Variables (переменные тоже должны быть валидным JSON).

Как работать: пошагово

  1. Вставьте или напишите валидный JSON — тот, который обычно отправляете на сервер (happy path).
  2. Укажите количество вариантов (по умолчанию 10, максимум 50).
  3. Нажмите «Сгенерировать N вариантов». Список появится под панелью: для каждого варианта видны путь к полю ($.user.age), описание мутации и превью JSON.
  4. Нажмите «Применить» у нужного варианта — тело запроса заменится на сгенерированное.
  5. Нажмите Send и зафиксируйте код ответа, тело, время, ошибки валидации.
  6. Повторите для других вариантов из списка (или сгенерируйте список заново после правки эталонного JSON).

Типичный сценарий тестировщика: один запрос в коллекции → 10 вариантов → 10 отправок с записью результатов в таблицу или в post-response скрипт.

Как устроена генерация

  • Приложение разбирает JSON как дерево и находит все изменяемые узлы: числа, строки, массивы, объекты, null, булевы значения — включая вложенные поля и элементы массивов.
  • Для каждого узла применяется фиксированный набор правил по типу (см. таблицу ниже).
  • Каждый вариант — это копия исходного JSON с изменением одного узла. Остальные поля остаются как в эталоне.
  • Из всех возможных мутаций выбирается до N вариантов с приоритетом разнообразия по полям: сначала по одному варианту на разные пути ($.name, $.count, …), чтобы не получить десять мутаций одного и того же ключа.
  • Дубликаты с одинаковым телом отбрасываются.
Фаззинг не подставляет случайные байты и не ломает синтаксис JSON — вы всегда отправляете синтаксически корректный JSON с «плохими» значениями внутри. Для проверки битого JSON используйте ручное редактирование тела.

Правила мутаций по типам

Тип поля Что генерируется (примеры) Зачем тестировать
Число
100
-100, 0, 999999, 1.5, null, -1, 9007199254740991 (MAX_SAFE_INTEGER) Отрицательные, ноль, переполнение, дроби, смена типа на null
Строка
"hello"
"", строка из 10 000 символов "a", "\u0000\u0001", кириллица и умлауты, null, только пробелы и переводы строк Пустой ввод, длина, бинарный мусор, Unicode, null вместо строки
Массив
[1, 2]
[], null, только первый элемент [1], дубликат последнего, добавление 999, укороченный/расширенный набор элементов Пустой список, один элемент, лишние элементы, null вместо массива
Объект {}, null, исходный объект + поле __fuzz Пустое тело, неожиданные поля, смена типа
Boolean Инверсия (truefalse), null Неверный флаг, null вместо bool
null 0, "", false, [], {} Сервер ожидал null, а пришёл другой тип

Пример 1: простой POST

Эталонное тело:

{
  "name": "hello",
  "count": 100,
  "tags": [1, 2],
  "active": true
}

После генерации 10 вариантов вы можете увидеть, среди прочего:

  • $.count100 → 0 или 100 → 999999
  • $.name"hello" → "" или длинная строка из a
  • $.tags[2 items] → [] или → null
  • $.activetrue → false

Применяете вариант → Send → проверяете: сервер вернул 400 с понятной ошибкой или упал с 500 (баг).

Пример 2: вложенный объект

{
  "user": {
    "email": "test@example.com",
    "age": 25
  },
  "items": [
    { "sku": "A1", "qty": 2 }
  ]
}

Генератор находит пути вроде $.user.email, $.user.age, $.items[0].sku, $.items[0].qty, а также сам массив $.items и объект $.user. Мутации распределяются по разным путям, чтобы за один прогон покрыть несколько полей.

Пример 3: GraphQL variables

На вкладке Body в режиме GraphQL эталон variables:

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "limit": 10
}

Фаззинг меняет, например, $.id на пустую строку или строку с нулевыми байтами, а $.limit — на 0 или 999999. После «Применить» отправьте запрос с тем же query — меняются только variables.

Чек-лист для тестировщика

  • Сервер возвращает 4xx с внятным сообщением, а не 500?
  • Валидация срабатывает на пустых строках и null?
  • Большие числа и длинные строки не кладут сервис (таймаут, OOM)?
  • Пустой массив / один элемент — ожидаемое поведение по спецификации?
  • Лишнее поле __fuzz игнорируется или отклоняется?
  • Кириллица и спецсимволы в строках обрабатываются корректно (кодировка)?

Ограничения

  • Нужен синтаксически валидный JSON до генерации (комментарии в стиле Postman поддерживаются при разборе).
  • Не более 50 вариантов за один клик.
  • Один вариант меняет одно поле/узел за раз (не полный combinatorial explosion всех полей сразу).
  • Режимы body form-data, x-www-form-urlencoded и binary не поддерживаются — только raw JSON и GraphQL variables.
  • Автоматическая отправка всех вариантов подряд пока не реализована: каждый вариант применяется и отправляется вручную (или через свой скрипт).

Связь с другими возможностями

  • Post-response Script — можно писать pm.test на код ответа после каждого фазз-варианта. Раздел Scripts →
  • Симуляция сети (вкладка Network) — комбинируйте с фаззингом, чтобы проверять retry при плохом теле и обрыве соединения.
  • Примеры (Examples) — сохраняйте удачные/падающие варианты как examples в коллекции для регрессии.

Скачать Laitap Веб-демо

Мультиплексор запросов (ковёр)

Мультиплексор запускает набор из 5–10 запросов одновременно (или с паузой между стартами) и показывает все ответы на одном экране в виде плиток — «ковёр». Удобно после деплоя: проверить health-check, auth, основные CRUD-эндпоинты за один клик.

Отличие от Postman Runner: в Postman параллельный прогон коллекции доступен только в платных планах; здесь параллельный запуск встроен и бесплатен.

Как открыть

  1. В боковой панели коллекций откройте контекстное меню (ПКМ) на коллекции или папке.
  2. Выберите «Мультиплексор (ковёр)».
  3. В модальном окне появятся запросы из выбранной области (до 10 штук).

Настройка и запуск

  1. Снимите галочки с запросов, которые не нужны в этом прогоне.
  2. У каждого включённого запроса поле × N — сколько раз отправить его за прогон (до 20). Например, × 8 на одном POST — восемь одинаковых запросов параллельно, чтобы проверить гонки и идемпотентность на бэкенде.
  3. Счётчик «Запусков» — сумма всех × N (максимум 50 HTTP за один ковёр).
  4. Выберите режим: Параллельно — все стартуют сразу; С задержкой — между стартами пауза (мс), удобно для rate-limit.
  5. Нажмите «Запустить ковёр». Во время выполнения доступна кнопка «Остановить».

Чтение плиток

  • Зелёная — HTTP 2xx.
  • Жёлтая — редиректы и 4xx (запрос дошёл, но ответ «не OK»).
  • Красная — сеть/DNS/TLS, отмена, 5xx и прочие сбои.
  • На плитке: метод, имя запроса, код ответа, время, превью тела.
  • При повторе одного запроса на плитке виден номер #1, #2

Что учитывается при отправке

  • Переменные коллекции и папок, auth, Pre-request Script на запросе и предках.
  • Настройки запроса (таймаут, редиректы, SSL) и вкладка Network (симуляция сети).
  • Каждый запрос идёт с отдельным clientRequestId — параллельные запросы не блокируют друг друга.

Типичные сценарии

  • Smoke-тест после деплоя: 8 health/auth/API эндпоинтов параллельно.
  • Проверка папки «Payments» с задержкой 200 мс между стартами.
  • Быстрый обзор: какие из сохранённых запросов сейчас отвечают 200.
  • Нагрузочный мини-тест: один эндпоинт × 10 параллельно — как сервер отвечает на дубли.

Скачать Laitap Веб-демо

Снимок запроса (.snapshot)

Снимок — полный слепок состояния запроса в одном файле .snapshot. Нашли баг → сохранили снимок → отправили разработчику → он открыл и видит ту же среду, что была у вас.

Отличие от Postman: там экспорт коллекции, окружения и переменных — отдельно. В Laitap всё в одном файле, включая последний ответ и отличия от сохранённой версии в коллекции.

Где в приложении

В строке URL запроса кнопка Snapshot (рядом с Examples и Send). Основной клик — сохранить; меню ▾ — «Сохранить» или «Открыть снимок…».

Что попадает в файл

  • Метод, URL, params, headers, body, auth, scripts, settings, Network simulation
  • Переменные коллекции и папок (resolved + сырые строки)
  • Наследованный auth с коллекции/папки
  • Последний полученный ответ (если был Send)
  • changeLog — отличия черновика от версии в коллекции (если запрос привязан)

Открытие снимка

  1. Snapshot ▾ → «Открыть снимок…»
  2. Запрос откроется в новой вкладке; переменные из снимка подставятся в подсветку {{var}}
  3. Если в снимке был ответ — он появится в панели Response

Скачать Laitap

Импорт трафика (HAR, Fiddler, Charles, Wireshark)

Запишите реальный трафик на Production через браузер, Fiddler, Charles или Wireshark — импортируйте лог в Laitap и получите коллекцию: каждый HTTP-запрос с сохранённым ответом (как Postman Example). Можно сразу повторять локально.

Горячая клавиша: Ctrl+Shift+O или кнопка с иконкой сигнала в боковой панели коллекций.

Поддерживаемые форматы

  • .har — Chrome DevTools, Firefox, Charles (Export HAR), Fiddler Everywhere
  • .saz — Fiddler Classic (File → Save → All Sessions)
  • .chls / .chlsj — Charles Session (или экспорт HAR из Charles)
  • .pcap — Wireshark, только HTTP без TLS (HTTPS нужен HAR из прокси)

Как импортировать

  1. File → Import Traffic Log… или кнопка в сайдбаре.
  2. Выберите файл лога.
  3. Коллекция создаётся с папками по хостам; у каждого запроса — example с телом ответа.
  4. До 500 запросов за импорт; CONNECT и служебный трафик пропускаются.

Ограничения

  • Зашифрованный HTTPS из PCAP без ключей не восстанавливается — используйте HAR из прокси.
  • pcapng: экспортируйте HTTP как HAR или сохраните classic pcap.

Скачать Laitap

REST API

Программный доступ к облачным коллекциям из CI/CD, скриптов или Postman. В самом приложении Laitap облако и команды работают через обычный вход (JWT) — и на free-тарифе, с лимитами. REST API ниже — отдельный канал для автоматизации: нужна подписка PRO и API-ключ ltp_....

Pro

Сейчас бесплатно по заявке — support@laitap.pro. Укажите email аккаунта Laitap. Ключ вводится в Настройки → Laitap PRO.

Написать
Базовый URL https://api.laitap.pro/api
Токен

Создаётся в приложении Laitap → Настройки → API-ключи

Формат

JSON, UTF-8, Content-Type: application/json

Документация для нейросетей

Скачайте полную инструкцию для ИИ-ассистентов (ChatGPT, Claude, Cursor и др.): эндпоинты, схемы данных, сценарии и правила. Передайте файл в контекст — модель сможет генерировать запросы к API без ручного копирования страницы.

Скачать JSON Скачать Markdown

Заголовок авторизации

Для скриптов и автоматизации используйте API-ключ формата ltp_... — создаётся в Laitap → Настройки → API-ключи (нужна активная подписка PRO). Сессионный JWT входа в приложение для REST API не предназначен: он обслуживает desktop-клиент и браузерную сессию.

Authorization: Bearer ltp_ваш_ключ_из_приложения

Личное облако

Только ваши коллекции (teamId = null). В приложении личное облако доступно всем зарегистрированным пользователям (free — до 10 коллекций, PRO — до 100). Через REST API ниже — только с API-ключом PRO. Подробнее — Коллекции (личное).

МетодПутьОписание
GET/collectionsСписок коллекций
GET/collections?full=1Все коллекции с полным содержимым
GET/collections/{id}Одна коллекция
POST/collectionsСоздать коллекцию
POST/collections/importИмпорт JSON
PUT/collections/{id}Обновить коллекцию
DELETE/collections/{id}Удалить (soft delete)
GET/collections/{id}/shareСтатус публикации docs
POST/collections/{id}/shareОпубликовать / снять docs

Командные workspace

Команды, приглашения и командные коллекции доступны в приложении любому участнику после входа (JWT). Лимиты зависят от тарифа владельца команды: free — 1 созданная команда и до 7 участников; PRO — до 10 созданных команд и до 100 участников в каждой. REST API команд (/api/teams/...) — через API-ключ ltp_... с активной подпиской PRO у владельца ключа. Подробнее — Коллекции (команда).

МетодПутьОписание
GET/teamsСписок ваших команд
POST/teamsСоздать команду
GET/teams/{teamId}Команда и участники
GET/teams/{teamId}/membersУчастники
POST/teams/{teamId}/invitesПригласить
GET/teams/{teamId}/collectionsКоллекции команды
PUT/teams/{teamId}/collections/{id}Обновить коллекцию
GET/teams/invites/pendingВходящие приглашения

Структура данных коллекции

Коллекция — это дерево: корень → папки → запросы. Поддерживаются два формата тела при создании и обновлении.

Формат A — поле data (Postman v2.1)

Универсальный формат для импорта и экспорта.

Схема объекта data

infoobjectoptional

Метаданные коллекции.

namestringoptional

Название внутри JSON.

descriptionstringoptional

Описание.

itemarrayoptional

Корневой массив папок и запросов.

Папкаobject

name (string), item (array) — вложенные элементы. Без поля request.

Запросobject

name (string), request (object) — method, url, header, body.

Пример
{
  "info": {
    "name": "Payments API",
    "description": "Коллекция платёжного сервиса"
  },
  "item": []
}

Формат B — нативный Laitap (children)

Передаётся в теле POST/PUT без обёртки data (альтернатива формату A).

Схема тела

namestringrequired

1200 символов.

descriptionstringoptional

До 50000 символов.

authobjectoptional

type, credentials — auth коллекции.

variablesarrayoptional

Переменные коллекции или папки. Каждый элемент — объект с полями ниже.

keystringrequired

Имя переменной для {{key}}. Непустая строка после trim.

valuestringoptional

Значение. По умолчанию пустая строка. До 50000 символов.

enabledbooleanoptional

true по умолчанию. false — переменная не участвует в подстановке.

descriptionstringoptional

Описание для команды: назначение, источник значения, ограничения. До 50000 символов.

scriptsobjectoptional

prerequest, test — строки скриптов.

childrenarrayoptional

Дерево узлов.

foldertype: "folder"

id, name, children[], опционально auth, variables, scripts.

requesttype: "request"

id, name, request — полный объект HTTP-запроса.

smartFoldertype: "smartFolder"

Умная папка: smartMode, tagConfig или rules.

requestsarrayoptional

Legacy: плоский список запросов без папок (устаревающий формат).

Пример
{
  "name": "Payments API",
  "description": "Коллекция платёжного сервиса",
  "auth": { "type": "noauth", "credentials": {} },
  "variables": [],
  "scripts": { "prerequest": "", "test": "" },
  "children": []
}

Типы узлов дерева

ТипPostman (item)Native (children)
Папка { "name": "Auth", "item": [...] } { "type": "folder", "name": "Auth", "children": [...] }
Запрос { "name": "Login", "request": { ... } } { "type": "request", "name": "Login", "request": { ... } }
Умная папка Только native: type: "smartFolder" — фильтр по тегам/правилам

Объект HTTP-запроса (request)

iduuidoptional

Идентификатор запроса. Генерируется клиентом, если не передан.

namestringrequired

Отображаемое имя, 1200 символов.

methodenumrequired

GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS.

urlstringrequired

URL с переменными {{name}}.

paramsarrayoptional

Query-параметры: key, value, enabled.

headersarrayoptional

Заголовки запроса.

authobjectoptional

type: inherit, bearer, basic, apikey… credentials: ключи по типу.

bodyobjectoptional

Тело запроса.

modeenum

none, raw, formdata, urlencoded, graphql.

rawstring

Текст тела для mode raw.

tagsstring[]optional

Теги для умных папок и фильтрации.

descriptionstringoptional

Описание для публичной документации.

Пример
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Get user",
  "method": "GET",
  "url": "https://api.example.com/users/{{userId}}",
  "params": [
    { "id": "1", "key": "page", "value": "1", "enabled": true }
  ],
  "headers": [
    { "id": "2", "key": "Accept", "value": "application/json", "enabled": true }
  ],
  "auth": { "type": "bearer", "credentials": { "token": "{{token}}" } },
  "body": {
    "mode": "raw",
    "raw": "",
    "rawLanguage": "json",
    "formData": [],
    "urlEncoded": [],
    "graphqlQuery": "",
    "graphqlVariables": "{}"
  },
  "scripts": { "prerequest": "", "test": "" },
  "tags": ["users", "read"],
  "description": "Получить пользователя по ID"
}

Методы: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS. Переменные коллекции подставляются через {{name}}.

Коллекции — личное облако

Только личные коллекции (teamId = null). Командные — в разделе Коллекции (команда). Для REST API нужен API-ключ ltp_... (создаётся при подписке PRO). В приложении то же облако доступно по JWT; free — 10 коллекций, PRO — 100.

Все запросы требуют заголовок Authorization: Bearer ltp_... и Content-Type: application/json для тел с JSON.

GET /api/collections

Список коллекций (краткий)

Метаданные без поля data. Подходит для списков и поиска.

Параметры запроса

pagequeryintegeroptional

Номер страницы. По умолчанию 1, минимум 1.

limitqueryintegeroptional

Записей на странице. По умолчанию 20, диапазон 1100.

searchquerystringoptional

Фильтр по названию коллекции (подстрока, до 255 символов).

Ответ 200
{
  "items": [
    {
      "id": "uuid",
      "owner_id": "uuid",
      "name": "Payments API",
      "description": null,
      "created_at": "2026-06-18T10:00:00.000Z",
      "updated_at": "2026-06-18T12:00:00.000Z"
    }
  ],
  "page": 1,
  "limit": 20,
  "total": 1
}
GET /api/collections?full=1

Список коллекций (полный)

Для синхронизации desktop-клиента — все коллекции с содержимым.

Параметры запроса

fullquerystringrequired

Должен быть 1. Без других query-параметров пагинации.

Ответ 200
{
  "collections": [
    { "id": "uuid", "name": "My API", "children": [] }
  ],
  "limits": { "maxCollections": 100, "count": 3 }
}
GET /api/collections/{id}

Получить коллекцию

Параметры пути

idpathuuidrequired

UUID коллекции. Чужая или удалённая → 404.

Ответ 200
{
  "collection": {
    "id": "uuid",
    "owner_id": "uuid",
    "name": "Payments API",
    "description": "Описание",
    "created_at": "...",
    "updated_at": "...",
    "data": {
      "info": { "name": "Payments API", "description": "..." },
      "item": []
    }
  }
}
POST /api/collections

Создать коллекцию

Поддерживаются два формата тела — см. раздел «Структура данных».

Тело запроса — формат data (Postman)

namebodystringrequired

Название коллекции. 1255 символов.

descriptionbodystringoptional

Описание, до 1000 символов.

databodyobjectoptional

Дерево коллекции Postman v2.1. Если не передано — создаётся пустое item: [].

infoobjectoptional

name, description — метаданные.

itemarrayoptional

Массив папок и запросов. Папка: объект с item[]. Запрос: объект с request.

Пример тела
{
  "name": "New Collection",
  "description": "Опционально",
  "data": {
    "info": { "name": "New Collection", "description": "" },
    "item": []
  }
}
Ответ 201
{
  "collection": {
    "id": "uuid",
    "name": "New Collection",
    "data": { "info": { ... }, "item": [] }
  }
}
PUT /api/collections/{id}

Обновить коллекцию

Параметры пути

idpathuuidrequired

UUID коллекции.

Тело запроса

namebodystringoptional

Новое название, 1255 символов.

descriptionbodystringoptional

Новое описание, до 1000 символов.

databodyobjectoptional

Полное дерево папок и запросов. Для изменения структуры передайте весь data целиком.

Обновляются только переданные поля. Альтернатива — native-формат с children (см. «Структура данных»).

Пример тела
{
  "name": "Renamed",
  "data": { "info": { "name": "Renamed" }, "item": [ ... ] }
}
Ответ 200
{
  "collection": { "id": "uuid", "name": "Renamed", "data": { ... } }
}
POST /api/collections/import

Импорт JSON-коллекции

Тело запроса

namebodystringrequired

Название новой коллекции, 1255 символов.

descriptionbodystringoptional

Описание, до 1000 символов.

databodyobjectrequired

JSON экспорта Postman или Laitap. До 5 МБ, вложенность до 20 уровней.

Пример тела
{
  "name": "Imported",
  "description": "From Postman export",
  "data": { "info": { "name": "..." }, "item": [ ... ] }
}
DELETE /api/collections/{id}

Удалить коллекцию

Параметры пути

idpathuuidrequired

UUID коллекции. Soft delete — помечается удалённой.

Ответ 200
{ "ok": true }
Лимиты: поле data — до 5 МБ, вложенность 20 уровней. Лимит коллекций в облаке зависит от тарифа (см. ответ limits при full=1).

Коллекции — командный workspace

Коллекции, привязанные к команде (teamId != null). В приложении участники работают с ними после входа (JWT). Через /api/collections/{id} их нельзя прочитать или изменить — нужны оба id: команды и коллекции.

REST API: Authorization: Bearer ltp_... — ключ вашего аккаунта с активной подпиской PRO. Права внутри команды зависят от роли (см. таблицу ниже).

PRO только для REST API: API-ключ создаётся при подписке PRO. Участник команды без PRO по-прежнему может работать с командой в приложении; для скриптов и CI ему нужен свой PRO и ключ.

Роли и права

Роль берётся из членства в команде (owner, admin, member).

Действиеmemberadminowner
GET список / versions
POST — создать коллекцию
PUT — редактировать
DELETE — удалить
Публикация docs (/collections/{id}/share)
Включить шифрование vault команды

Нет членства в команде → 403. Коллекция не принадлежит указанному teamId404.

Формат тела

Нативный формат Laitap (name, children, …) — см. Структура данных. Postman-обёртка data здесь не используется. Для ZK-коллекций — объект с encrypted: true и encryptedPayload.

GET /api/teams

Список команд

Команды, в которых вы состоите. teamId нужен для запросов к коллекциям.

Ответ 200
{
  "teams": [
    {
      "id": "team-uuid",
      "name": "Backend",
      "ownerId": "user-uuid",
      "createdAt": "2026-06-01T10:00:00.000Z",
      "currentUserRole": "member",
      "members": [
        { "userId": "…", "email": "…", "role": "owner", "joinedAt": "…" }
      ]
    }
  ]
}
GET /api/teams/{teamId}/collections

Все коллекции команды

Параметры пути

teamIdpathuuidrequired

UUID команды. Не участник → 403.

Ответ 200
{
  "collections": [
    {
      "encrypted": false,
      "id": "col-uuid",
      "name": "Payments API",
      "children": []
    }
  ],
  "limits": { "maxCollections": 100, "count": 2 }
}

Зашифрованная коллекция: encrypted: true, поле encryptedPayload вместо содержимого.

GET /api/teams/{teamId}/collections/versions

Версии коллекций (синхронизация)

Лёгкий ответ для проверки изменений без полной загрузки. Участник команды — любая роль.

Параметры пути

teamIdpathuuidrequired

UUID команды.

Ответ 200
{
  "versions": [
    { "id": "col-uuid", "updatedAt": "2026-06-18T12:00:00.000Z" }
  ]
}
POST /api/teams/{teamId}/collections

Создать коллекцию

Минимальная роль: member.

Параметры пути

teamIdpathuuidrequired

UUID команды.

Тело запроса

namebodystringrequired

1200 символов.

descriptionbodystringoptional

До 50000 символов.

childrenbodyarrayoptional

Дерево папок и запросов (native).

auth, variables, scriptsbodyobject / arrayoptional

Метаданные коллекции.

encryptedbodybooleanoptional

true — ZK-режим. Первое включение шифрования в команде — только admin/owner.

encryptedPayloadstringrequired

Зашифрованный blob с клиента.

encryptionVersionintegerrequired

Сейчас 1.

Пример
{
  "name": "Shop API",
  "description": "Общая коллекция команды",
  "children": []
}
Ответ 201
{
  "collection": {
    "encrypted": false,
    "id": "col-uuid",
    "name": "Shop API",
    "children": []
  }
}
PUT /api/teams/{teamId}/collections/{collectionId}

Обновить коллекцию

Минимальная роль: member. Полное тело — сервер заменяет содержимое.

Параметры пути

teamIdpathuuidrequired

UUID команды.

collectionIdpathuuidrequired

UUID коллекции. Должна принадлежать этой команде.

Тело запроса

Та же схема, что при POST (name, children, … или encrypted).

Пример
{
  "name": "Shop API",
  "children": [
    {
      "id": "folder-uuid",
      "type": "folder",
      "name": "Catalog",
      "children": []
    }
  ]
}
Ответ 200
{
  "collection": {
    "encrypted": false,
    "id": "col-uuid",
    "name": "Shop API",
    "children": [ … ]
  }
}
DELETE /api/teams/{teamId}/collections/{collectionId}

Удалить коллекцию

Минимальная роль: admin (member получит 403).

Параметры пути

teamIdpathuuidrequired

UUID команды.

collectionIdpathuuidrequired

UUID коллекции.

Ответ 200
{ "ok": true }
Безопасность: знание только collectionId без членства в команде не даёт доступа. UUID чужой личной коллекции через командный API тоже не сработает — коллекция должна иметь teamId, совпадающий с путём запроса.

Папки и запросы

Папки и запросы не имеют отдельных REST-эндпоинтов — они часть дерева коллекции. Алгоритм один: получить коллекцию → изменить дерево → отправить PUT с полным содержимым. Меняется только URL в зависимости от workspace.

WorkspacePUTФормат телаКто может
Личное облако PUT /api/collections/{id} data (Postman) или children (native) Владелец, PRO
Команда PUT /api/teams/{teamId}/collections/{collectionId} Только native (name, children, …) Участник с ролью member+

Личное облако

PUT /api/collections/{id}

Обновить дерево (личная коллекция)

Параметры пути

idpathuuidrequired

UUID вашей личной коллекции.

Тело запроса

Передайте полное дерево — сервер заменяет содержимое целиком. Формат A или B (см. Структура данных).

databodyobjectoptional*

Postman v2.1. *Обязателен, если не передан native-формат (children / requests).

infoobjectoptional

name, description.

itemarrayoptional

Корневой массив папок и запросов.

childrenbodyarrayoptional*

Native-дерево. Альтернатива data.

Шаг 1 — создать коллекцию с папкой

{
  "name": "Shop API",
  "data": {
    "info": { "name": "Shop API", "description": "" },
    "item": [
      {
        "name": "Catalog",
        "description": "Товары и категории",
        "item": []
      },
      {
        "name": "Orders",
        "item": []
      }
    ]
  }
}

Объект с полем item (без request) — это папка.

Шаг 2 — добавить запрос в папку

{
  "data": {
    "info": { "name": "Shop API", "description": "" },
    "item": [
      {
        "name": "Catalog",
        "item": [
          {
            "name": "List products",
            "request": {
              "method": "GET",
              "header": [
                { "key": "Accept", "value": "application/json", "disabled": false }
              ],
              "url": "https://api.shop.example/v1/products",
              "body": { "mode": "raw", "raw": "" }
            }
          }
        ]
      }
    ]
  }
}

Командная коллекция

В команде используется тот же принцип, но другой URL и только native-формат (children). Postman-обёртка data здесь не принимается. Подробнее об эндпоинте — Коллекции (команда).

PUT /api/teams/{teamId}/collections/{collectionId}

Обновить дерево (коллекция команды)

Параметры пути

teamIdpathuuidrequired

UUID команды.

collectionIdpathuuidrequired

UUID коллекции в этой команде.

Тело запроса

Полное дерево в поле children. Роль member или выше. Авторизация — API-ключ ltp_... (PRO).

namebodystringrequired

Название коллекции.

childrenbodyarrayrequired

Дерево папок и запросов (native). См. схему узлов ниже.

description, auth, variables, scriptsbodyoptional

Метаданные коллекции.

encryptedPayloadbodystringoptional

Для ZK-коллекций: зашифрованный blob вместо открытого children.

Типичный сценарий в команде

  1. GET /api/teams/{teamId}/collections — загрузить все коллекции команды.
  2. Найти нужную по id, изменить массив children (добавить папку или запрос).
  3. PUT /api/teams/{teamId}/collections/{collectionId} — отправить обновлённое тело целиком.
Пример — добавить папку и запрос
{
  "name": "Shop API",
  "description": "Общая коллекция команды",
  "children": [
    {
      "id": "folder-uuid-1",
      "type": "folder",
      "name": "Catalog",
      "children": [
        {
          "id": "req-uuid-1",
          "type": "request",
          "name": "List products",
          "request": {
            "id": "req-uuid-1",
            "name": "List products",
            "method": "GET",
            "url": "https://api.shop.example/v1/products",
            "params": [],
            "headers": [
              { "id": "1", "key": "Accept", "value": "application/json", "enabled": true }
            ],
            "auth": { "type": "inherit", "credentials": {} },
            "body": { "mode": "none", "raw": "", "rawLanguage": "json", "formData": [], "urlEncoded": [], "graphqlQuery": "", "graphqlVariables": "{}" },
            "scripts": { "prerequest": "", "test": "" }
          }
        }
      ]
    }
  ]
}

Объект с type: "folder" и children[] — папка. С type: "request" и полем request — HTTP-запрос.

Схема узлов дерева

Общая для обоих workspace (Postman — через data.item, команда — через children).

Узел «папка»

namestringrequired

Имя папки.

item / childrenarrayoptional

Вложенные папки и запросы. Без поля request — это папка.

type"folder"optional

Обязателен в native-формате (команда и личное облако через children).

descriptionstringoptional

Описание папки (Postman).

auth, variables, scriptsobject / arrayoptional

Наследование auth и переменных для вложенных запросов (native).

Узел «запрос»

namestringrequired

Имя запроса в дереве.

requestobjectrequired

HTTP-запрос. Postman: method, url, header[], body. Native: полная схема в Структура данных.

Вложенные папки

До 20 уровней вложенности JSON. Личное облако (Postman):

{
  "data": {
    "item": [
      {
        "name": "Users",
        "item": [
          {
            "name": "Admin",
            "item": [
              {
                "name": "Ban user",
                "request": {
                  "method": "POST",
                  "url": "https://api.example/v2/admin/users/{{id}}/ban",
                  "header": [],
                  "body": { "mode": "raw", "raw": "{}" }
                }
              }
            ]
          }
        ]
      }
    ]
  }
}

Команда — тот же PUT, но native children и URL с teamId:

{
  "name": "API v2",
  "children": [
    {
      "id": "folder-1",
      "type": "folder",
      "name": "Users",
      "children": [
        {
          "id": "folder-2",
          "type": "folder",
          "name": "Admin",
          "children": [
            {
              "id": "req-1",
              "type": "request",
              "name": "Ban user",
              "request": { "method": "POST", "url": "https://api.example/v2/admin/users/{{id}}/ban", … }
            }
          ]
        }
      ]
    }
  ]
}

Переменные и auth на уровне папки

Native-формат (личное облако через children или команда):

{
  "type": "folder",
  "name": "Authenticated",
  "auth": { "type": "bearer", "credentials": { "token": "{{accessToken}}" } },
  "variables": [
    { "id": "1", "key": "baseUrl", "value": "https://api.example.com", "enabled": true }
  ],
  "children": [ … ]
}
Совет: для массовых изменений экспортируйте коллекцию из Laitap, отредактируйте JSON и отправьте полный PUT — личное облако: /api/collections/{id}, команда: /api/teams/{teamId}/collections/{collectionId}.

Публикация документации

Опубликуйте коллекцию как интерактивную документацию на laitap.pro/docs/{slug}.

GET /api/collections/{id}/share

Статус публикации

Параметры пути

idpathuuidrequired

UUID коллекции.

Ответ 200
{
  "share": {
    "collectionId": "uuid",
    "published": true,
    "visibility": "public",
    "slug": "payments-api-a1b2",
    "url": "https://laitap.pro/docs/payments-api-a1b2",
    "hasPassword": false,
    "publishedAt": "2026-06-18T10:00:00.000Z",
    "updatedAt": "2026-06-18T12:00:00.000Z"
  }
}

Если не опубликовано: published: false, visibility: "off".

POST /api/collections/{id}/share

Опубликовать или изменить настройки

Параметры пути

idpathuuidrequired

UUID коллекции.

Тело запроса

visibilitybodyenumrequired

public — доступ по ссылке всем.

password — нужен пароль (передайте password).

team — только участники команды (коллекция команды).

off — снять с публикации.

passwordbodystringoptional

Обязателен при первой публикации с visibility: "password". 4128 символов.

regenerateSlugbodybooleanoptional

true — новый slug URL (старая ссылка перестанет работать).

snapshotbodyobjectoptional

Для ZK-коллекций: снимок с клиента (сервер не расшифровывает blob).

publishedVariablesbodyarrayoptional

Переопределение значений переменных в docs.

keystringrequired

Имя переменной.

valuestringoptional

Значение для документации, до 50000 символов.

descriptionstringoptional

Описание переменной в опубликованной документации (если отличается от значения в коллекции).

Пример — public
{
  "visibility": "public"
}
Пример — с паролем
{
  "visibility": "password",
  "password": "my-secret-docs",
  "regenerateSlug": false,
  "publishedVariables": [
    { "key": "baseUrl", "value": "https://api.example.com" }
  ]
}

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

КодКогда
200Успешный GET / PUT
201Коллекция создана
400Некорректный JSON или параметры
401Нет или неверный API-ключ; ключ отозван или истекла подписка PRO
403Лимит коллекций или нет прав
404Коллекция не найдена
429Rate limit
500Ошибка сервера

Формат ошибки: { "error": "Описание" }

Rate limiting

  • 500 запросов/мин на IP
  • 100 GET /collections / мин на пользователя
  • 30 POST/PUT/DELETE / мин на пользователя