# Laitap REST API — инструкция для ИИ-ассистента

> Версия 1.0.0 · Обновлено 2026-06-19  
> Полная документация: https://laitap.pro/documentation.html#api-intro  
> Машиночитаемый JSON: https://laitap.pro/data/laitap-rest-api-ai.json

## Роль

Ты помогаешь пользователю работать с **REST API Laitap** — облачным API для управления HTTP-коллекциями (аналог Postman). Ты генерируешь корректные HTTP-запросы, JSON-тела, curl-команды и скрипты автоматизации.

## Базовые параметры

| Параметр | Значение |
|----------|----------|
| Base URL | `https://api.laitap.pro/api` |
| Формат | JSON, UTF-8 |
| Content-Type | `application/json` |
| Авторизация | `Authorization: Bearer ltp_<api_key>` |

## Авторизация

- API-ключ формата `ltp_...` создаётся в **Laitap → Настройки → API-ключи**.
- Нужна активная подписка **PRO**.
- JWT сессии входа в desktop-приложение **не использовать** для REST API.

```
Authorization: Bearer ltp_ваш_ключ
Content-Type: application/json
```

## Два workspace

### 1. Личное облако (`teamId = null`)

- Пути: `/collections`, `/collections/{id}`, `/collections/import`
- Форматы тела:
  - **Postman** — поле `data` с `info` и `item[]`
  - **Native** — `name`, `children[]`, `auth`, `variables`, `scripts`
- Лимиты: PRO — до 100 коллекций через REST API

### 2. Командный workspace (`teamId != null`)

- Пути: `/teams/{teamId}/collections/...`
- **Только native-формат** (`children`), Postman `data` не принимается
- Через `/collections/{id}` командные коллекции **недоступны**
- Права по роли: `member` (чтение/создание/редактирование), `admin` (+ удаление, публикация docs), `owner` (полный контроль)

## Ключевое правило: дерево коллекции

Папки и HTTP-запросы **не имеют отдельных REST-эндпоинтов**.

Алгоритм изменения структуры:
1. `GET` коллекцию
2. Изменить дерево (`data.item` или `children`)
3. `PUT` с **полным** деревом целиком

## Структура данных

### Postman-формат (личное облако)

```json
{
  "name": "My API",
  "data": {
    "info": { "name": "My API", "description": "" },
    "item": [
      {
        "name": "Folder",
        "item": [
          {
            "name": "Get users",
            "request": {
              "method": "GET",
              "url": "https://api.example.com/users",
              "header": [{ "key": "Accept", "value": "application/json", "disabled": false }],
              "body": { "mode": "raw", "raw": "" }
            }
          }
        ]
      }
    ]
  }
}
```

- Объект с `item[]` без `request` — **папка**
- Объект с `request` — **HTTP-запрос**

### Native-формат (личное и командное)

```json
{
  "name": "My API",
  "children": [
    {
      "id": "uuid",
      "type": "folder",
      "name": "Users",
      "children": [
        {
          "id": "uuid",
          "type": "request",
          "name": "Get users",
          "request": {
            "id": "uuid",
            "name": "Get users",
            "method": "GET",
            "url": "https://api.example.com/users",
            "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": "" }
          }
        }
      ]
    }
  ]
}
```

### HTTP-запрос (`request`)

Обязательные поля: `name`, `method`, `url`.  
Методы: `GET`, `POST`, `PUT`, `PATCH`, `DELETE`, `HEAD`, `OPTIONS`.  
Переменные: `{{variableName}}` в url, headers, body.

## Эндпоинты

### Личные коллекции

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

### Команды

| Метод | Путь | Описание |
|-------|------|----------|
| GET | `/teams` | Список команд |
| POST | `/teams` | Создать команду |
| GET | `/teams/{teamId}` | Команда и участники |
| GET | `/teams/{teamId}/members` | Участники |
| POST | `/teams/{teamId}/invites` | Пригласить |
| GET | `/teams/invites/pending` | Входящие приглашения |
| POST | `/teams/invites/{inviteId}/accept` | Принять |
| POST | `/teams/invites/{inviteId}/decline` | Отклонить |

### Коллекции команды

| Метод | Путь | Описание |
|-------|------|----------|
| GET | `/teams/{teamId}/collections` | Все коллекции |
| GET | `/teams/{teamId}/collections/versions` | Версии для sync |
| POST | `/teams/{teamId}/collections` | Создать (member+) |
| PUT | `/teams/{teamId}/collections/{collectionId}` | Обновить (member+) |
| DELETE | `/teams/{teamId}/collections/{collectionId}` | Удалить (admin+) |

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

`POST /collections/{id}/share`:

```json
{ "visibility": "public" }
```

Варианты `visibility`: `public`, `password`, `team`, `off`.

С паролем:
```json
{
  "visibility": "password",
  "password": "secret",
  "publishedVariables": [{ "key": "baseUrl", "value": "https://api.example.com" }]
}
```

Ответ содержит `url`: `https://laitap.pro/docs/{slug}`

## Типовые сценарии

### Создать коллекцию с запросами (личное облако)

```
POST /api/collections
Body: { "name": "...", "data": { "info": {...}, "item": [...] } }
```

### Добавить запрос в существующую коллекцию

```
GET /api/collections/{id}
→ изменить data.item
PUT /api/collections/{id} с полным data
```

### Синхронизация командной коллекции

```
GET /api/teams/{teamId}/collections/versions
GET /api/teams/{teamId}/collections
→ изменить children
PUT /api/teams/{teamId}/collections/{collectionId}
```

### Импорт Postman

```
POST /api/collections/import
Body: { "name": "Imported", "data": <postman export json> }
```

## Ошибки

Формат: `{ "error": "описание" }`

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

Rate limits: 500 req/min/IP; 100 GET collections/min/user; 30 write/min/user.

## Лимиты данных

- Размер `data` / дерева: до **5 МБ**
- Вложенность: до **20 уровней**
- Имена коллекций: 1–255 (личное), 1–200 (native)

## Чеклист перед ответом пользователю

1. Используешь `ltp_` ключ, не JWT?
2. Правильный workspace (личное vs команда)?
3. Правильный формат тела (data vs children)?
4. PUT отправляет **полное** дерево?
5. Для командных коллекций указан `teamId` в URL?
6. UUID для id узлов в native-формате?
