# СДЭК API v2: Рассчитать стоимость и сроки доставки

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

Показать покупателю цену и срок доставки СДЭК в корзине или калькуляторе на сайте.

1. Получи токен: POST /v2/oauth/token с grant_type=client_credentials, client_id (Account) и client_secret (Secure password) из личного кабинета СДЭК. Токен живёт expires_in секунд — сохрани его и переиспользуй, а не запрашивай на каждый расчёт.
2. Рассчитай все доступные тарифы: POST /v2/calculator/tarifflist с from_location, to_location и packages. Вес передавай в граммах, габариты — в сантиметрах.
3. В ответе для каждого тарифа есть код, название, стоимость delivery_sum и срок period_min–period_max в днях. Покажи покупателю подходящие тарифы и сохрани tariff_code — он понадобится при создании заказа.
4. Для отладки используй тестовый адрес https://api.edu.cdek.ru и тестовую учётную запись из документации, на боевом — https://api.cdek.ru.

```bash
# Токен (кешируй на expires_in секунд)
TOKEN=$(curl -s -X POST "https://api.cdek.ru/v2/oauth/token?grant_type=client_credentials&client_id=<Account>&client_secret=<Secure password>" | jq -r .access_token)

# Все тарифы: Москва → Санкт-Петербург, посылка 1,5 кг
curl -X POST https://api.cdek.ru/v2/calculator/tarifflist \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{
        "from_location": {"code": 44},
        "to_location": {"code": 137},
        "packages": [{"weight": 1500, "length": 20, "width": 15, "height": 10}]
      }'
```

## Базовые URL

- Боевой: `https://api.cdek.ru`
- Тестовый: `https://api.edu.cdek.ru`

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

Тип: OAuth 2.0

OAuth 2.0 (client credentials). Токен получают запросом `POST /v2/oauth/token` с `grant_type=client_credentials`, `client_id` (Account) и `client_secret` (Secure password) из личного кабинета СДЭК (раздел интеграции) и передают в заголовке `Authorization: Bearer <token>` (JWT). Для интеграции нужен договор со СДЭК.

Тестовая учётная запись для `api.edu.cdek.ru` (из документации):

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

### POST /v2/oauth/token — Получение токена авторизации

В ответе: `access_token`, `token_type`, `expires_in`, `scope`, `jti`.

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `grant_type` | query | string | да | client_credentials |
| `client_id` | query | string | да | Идентификатор клиента |
| `client_secret` | query | string | да | Секретный ключ клиента |

### POST /v2/calculator/tarifflist — Расчёт по доступным тарифам

Стоимость и сроки доставки по всем доступным тарифам. Расчёт по конкретному тарифу — `POST /v2/calculator/tariff`, с доп. услугами — `POST /v2/calculator/tariffAndService`.

| Параметр | Где | Тип | Обяз. | Описание |
|---|---|---|---|---|
| `date` | body | string | нет | Плановая дата передачи заказа; по умолчанию текущая |
| `type` | body | integer | нет | 1 — интернет-магазин (по умолчанию), 2 — доставка |
| `currency` | body | integer | нет | Код валюты расчёта |
| `lang` | body | string | нет | rus, eng, zho |
| `shipment_point` | body | string | нет | ПВЗ, куда клиент привезёт посылку |
| `delivery_point` | body | string | нет | ПВЗ доставки |
| `from_location` | body | object | да | Откуда: code, postal_code, country_code, city, address, координаты |
| `to_location` | body | object | да | Куда: те же поля |
| `packages` | body | array | да | Места |
| `packages[].weight` | body | integer | да | Вес в граммах |
| `packages[].length` | body | integer | нет | Длина, см |
| `packages[].width` | body | integer | нет | Ширина, см |
| `packages[].height` | body | integer | нет | Высота, см |

## Нюансы

- Создание сущностей асинхронное: статус запроса `ACCEPTED` означает только первичную валидацию, итог — `SUCCESSFUL` или `INVALID`. Обычно 200–500 мс, при пиковой нагрузке до 30–60 секунд; опрашивайте с паузой 2–3 секунды.
- В `POST /v2/orders` нельзя одновременно передавать `shipment_point` и `from_location`, а также `delivery_point` и `to_location`.
- Вес в граммах, габариты в сантиметрах.
- Изменять заказ можно только в статусах `CREATED` и `ACCEPTED`.
- Вебхуки: таймаут подключения 15 секунд, при ошибках — до 12 повторов за 75 минут, потом доставка прекращается.
- Данные о сущностях, созданных через API, хранятся 1 год.
- Сообщения — в UTF-8; обязательные поля не могут быть пустыми.

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

- [Показать пункты выдачи в городе покупателя](https://mcp-everything.ru/integrations/cdek/scenarios/pokazat-punkty-vydachi-v-gorode.md)
- [Создать заказ и дождаться его регистрации](https://mcp-everything.ru/integrations/cdek/scenarios/sozdat-zakaz-i-dozhdatsya-ego.md)
- [Напечатать квитанцию и вызвать курьера](https://mcp-everything.ru/integrations/cdek/scenarios/napechatat-kvitantsiyu-i-vyzvat-kurera.md)
- [Получать статусы заказов вебхуком](https://mcp-everything.ru/integrations/cdek/scenarios/poluchat-statusy-zakazov-vebhukom.md)

---

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