# ПЭК API личного кабинета: Рассчитать стоимость и сроки перевозки груза

Сценарий из mcp-everything. Актуально на 2026-10-24.

Показать клиенту цену и срок доставки ПЭК между городами — от склада до склада или с забором и доставкой до двери.

1. Создай ключ API в личном кабинете («Регистрационные данные» → «Ключи API»). Авторизация — Basic: логин кабинета и ключ. Все методы — POST с JSON на https://kabinet.pecom.ru/api/v1/<группа>/<метод>/.
2. Получи список продуктов и тарифов: POST /typesOfDelivery/all/ — их ID передаются в types.
3. Найди склады: POST /branches/findzonebyaddress/ вернёт филиал, обслуживающий адрес, и mainWarehouseId — склад основного отделения. Полный справочник — POST /branches/all/ (ID склада в branches[].divisions[].warehouses[].id).
4. Посчитай: POST /calculator/calculateprice/ с types, senderWarehouseId и receiverWarehouseId (или блоками pickup и delivery с адресом, если нужны забор и доставка), plannedDateTime и cargos. Все логические флаги из списка обязательны — передавай false явно.
5. Вес — в килограммах, габариты — в метрах, не больше двух знаков после запятой; каждое грузоместо — отдельным элементом cargos. В ответе стоимость по видам перевозки в transfers (type 3 — авто, 1 — авиа).
6. Логические ошибки приходят с HTTP 200 и объектом error в теле — проверяй его, а не только статус.

```bash
curl -X POST https://kabinet.pecom.ru/api/v1/calculator/calculateprice/ \
  --user '<логин>:<ключ API>' \
  -H 'Content-Type: application/json;charset=utf-8' -H 'Accept: application/json' \
  -d '{
        "types": [<ID продукта>],
        "senderWarehouseId": "<склад отправителя>",
        "receiverWarehouseId": "<склад получателя>",
        "plannedDateTime": "2026-10-28T10:00:00",
        "isInsurance": true,
        "isInsurancePrice": 50000,
        "isPickUp": false,
        "isDelivery": false,
        "isOpenCarSender": false,
        "isOpenCarReceiver": false,
        "isHyperMarket": false,
        "cargos": [
          {"weight": 35.5, "length": 0.6, "width": 0.4, "height": 0.4},
          {"weight": 12, "length": 0.4, "width": 0.3, "height": 0.3}
        ]
      }'
```

## Базовые URL

- Боевой: `https://kabinet.pecom.ru/api/v1/`
- URL метода: `https://kabinet.pecom.ru/api/v1/<группа>/<метод>/`

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

Тип: Basic Auth

HTTP Basic-аутентификация: логин — имя пользователя личного кабинета ПЭК, пароль — любой активный ключ доступа API. Ключ создаётся на странице «Регистрационные данные» в разделе «Ключи API»; для разных приложений рекомендуются разные ключи. Анонимный доступ не поддерживается.

Обязательные заголовки: `Content-Type: application/json;charset=utf-8`, `Accept: application/json`. Для сжатия ответов — `Accept-Encoding: gzip`. HTTPS с обязательной проверкой сертификата сервера.

```
curl.exe ^
--verbose ^
--cacert cacert-kabinet_pecom_ru.pem ^
--basic ^
--user user:FA21831AB83DB72D3261FA80BA309DBF6B2D7ADC ^
--request POST -d @curl-input.txt ^
--header "Content-Type: application/json; charset=utf-8" ^
--compressed ^
--output curl-output.txt ^
https://kabinet.pecom.ru/api/v1/cargos/status/
```

## Методы сценария

### POST /calculator/calculateprice/ — Расчёт стоимости и сроков перевозки

Если заказан забор или доставка, расчёт идёт по координатам или адресу из блоков `pickup`/`delivery`; иначе нужны ID складов `senderWarehouseId`/`receiverWarehouseId`. В ответе стоимость по видам перевозки в массиве `transfers` (`type` 3 — авто, 1 — авиа).

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `currencyCode` | body | string | нет | Код валюты, по умолчанию 643 (рубль) |
| `types` | body | array | да | ID продуктов/тарифов ПЭК (список — /typesOfDelivery/all/) |
| `senderWarehouseId` | body | string | нет | Склад отправителя (если нет забора) |
| `receiverWarehouseId` | body | string | нет | Склад получателя (если нет доставки) |
| `plannedDateTime` | body | string | да | Плановая дата и время передачи груза |
| `isInsurance` | body | boolean | да | Страхование |
| `isInsurancePrice` | body | number | да | Стоимость груза для страхования, руб |
| `isPickUp` | body | boolean | да | Нужен забор |
| `isDelivery` | body | boolean | да | Нужна доставка |
| `isOpenCarSender` | body | boolean | да | Растентовка отправителя |
| `isOpenCarReceiver` | body | boolean | да | Растентовка получателя |
| `isHyperMarket` | body | boolean | да | Признак гипермаркета |
| `needReturnDocuments` | body | boolean | нет | Возврат документов с подписью получателя |
| `needArrangeTransportationDocuments` | body | boolean | нет | Передача сопроводительных документов с грузом |
| `pickup.address` | body | string | нет | Адрес забора: страна, регион, район, город, улица, дом через запятую |
| `pickup.coordinates` | body | object | нет | Координаты latitude, longitude |
| `delivery.address` | body | string | нет | Адрес доставки |
| `pickupServices` | body | object | нет | ПРР при заборе: isLoading, floor, carryingDistance, isElevator |
| `deliveryServices` | body | object | нет | ПРР при доставке |
| `counterpart` | body | object | нет | Контрагент для спецусловий: inn, kpp, whoMakesCalculation |
| `cargos` | body | array | да | Грузоместа |
| `cargos[].weight` | body | number | да | Вес, кг |
| `cargos[].length` | body | number | нет | Длина, м (не нужна при maxSize) |
| `cargos[].width` | body | number | нет | Ширина, м |
| `cargos[].height` | body | number | нет | Высота, м |
| `cargos[].volume` | body | number | нет | Объём, м³ |
| `cargos[].maxSize` | body | number | нет | Максимальный габарит, м |
| `cargos[].isHP` | body | boolean | нет | Защитная транспортировочная упаковка |

### POST /branches/all/ — Филиалы и склады

Список филиалов, отделений и складов ПЭК; ID склада — `branches[].divisions[].warehouses[].id`.

### POST /branches/findzonebyaddress/ — Филиал по адресу

Филиал, обслуживающий адрес; в ответе `mainWarehouseId` — склад основного отделения.

### POST /typesOfDelivery/all/ — Продукты и тарифы

Список продуктов/тарифов ПЭК для расчёта.

## Нюансы

- Все поля JSON-объекта в запросе обязательны, если не указано обратное.
- Логические ошибки (нет параметров, неверный формат) приходят с HTTP 200 и объектом `error` в теле — проверяйте его наличие, а не только статус.
- В `cargos` передавайте каждое грузоместо отдельным элементом; если известны только общие параметры — столько элементов, сколько мест, со средними весом и объёмом.
- Числа в габаритах округляются до сотых в большую сторону — передавайте не больше двух знаков после запятой.
- Вес — в килограммах, габариты — в метрах.
- Признак `isHP` применяется ко всему грузу, если стоит хотя бы у одного места.
- Часть полей `/cargos/status/` заполняется только при оформленном доступе к информации участников перевозки.

## Другие сценарии

- [Отследить груз](https://mcp-everything.ru/integrations/pek/scenarios/otsledit-gruz.md)

---

Если этого недостаточно — официальная документация: https://kabinet.pecom.ru/api/v1
Вся интеграция одним документом: https://mcp-everything.ru/integrations/pek.md
