13
Стать партнером
13
{{ formatMonthYear(startMonth) }}
{{ d }}
{{ day.day }}
{{ formatMonthYear(endMonth) }}
{{ d }}
{{ day.day }}
Обновлено
20.03.2026
Содержание статьи

Примеры нотификаций

На этой странице собраны примеры всех типов нотификаций, которые отправляет Lamoda B2B Platform Partner API. Используйте эти примеры для тестирования и отладки интеграции.

Изменение статуса заказа (statusChanged)

Отправляется при изменении статуса заказа целиком.

Заказ подтверждён (Confirmed)

{
  "type": "statusChanged",
  "trackingId": "117391950",
  "sequenceNumber": 2,
  "data": {
    "id": "CZ117391950",
    "status": "Confirmed",
    "paymentMethod": "COD",
    "fullSum": "12000.00",
    "deliveryPrice": "250.00",
    "createdAt": "2025-01-20",
    "updatedAt": "2025-01-20 10:30:15",
    "dates": {
      "confirmed": "2025-01-20 10:30:00"
    },
    "confirmationFailedReason": null,
    "currency": "rub",
    "items": [
      {
        "id": 7598,
        "status": "Confirmed",
        "finalERPStatus": null,
        "sku": "SELLERSKU104",
        "size": "42",
        "description": "Кроссовки Nike Air Max",
        "paidPrice": 12000.00,
        "totalDiscount": "0.00",
        "datamatrix": null,
        "statusChangeReason": null
      }
    ],
    "shippingAddress": {
      "zipcode": "115114",
      "region": "Москва",
      "city": "Москва",
      "street": "Летниковская",
      "houseNum": "д.2 с1",
      "apartment": "909",
      "cityId": "7700000000000",
      "streetId": "77000000000170700",
      "buildingId": "770000000001707000001",
      "pickupPointId": null
    },
    "deliveryMethod": {
      "deliveryPrice": "250.00",
      "deliveryDate": "2025-01-22",
      "deliveryIntervalFrom": "15:00",
      "deliveryIntervalTo": "18:00",
      "deliveryIntervalId": 514877540,
      "hasIntervals": true,
      "shippingMethodName": "Курьерская доставка Lamoda Express",
      "shippingMethodCode": "lamoda",
      "serviceLevelTypeCode": "economy_b2b",
      "serviceLevelTypeName": "Без примерки",
      "cutOff": "2025-01-28 03:00:00",
      "shippingMethodTypeCode": "delivery_service"
    },
    "customer": {
      "firstName": "Иван",
      "lastName": "Петров",
      "middleName": "Сергеевич",
      "phone": "+79161234567",
      "email": "ivan.petrov@example.com"
    }
  }
}

Заказ доставлен (Delivered)

{
  "type": "statusChanged",
  "trackingId": "117391950",
  "sequenceNumber": 5,
  "data": {
    "id": "CZ117391950",
    "status": "Delivered",
    "paymentMethod": "COD",
    "fullSum": "12000.00",
    "deliveryPrice": "250.00",
    "createdAt": "2025-01-20",
    "updatedAt": "2025-01-22 17:48:00",
    "dates": {
      "confirmed": "2025-01-20 10:30:00",
      "shipped": "2025-01-21 08:15:00",
      "delivered": "2025-01-22 17:48:00"
    },
    "items": [
      {
        "id": 7598,
        "status": "Delivered",
        "finalERPStatus": "sold",
        "sku": "SELLERSKU104",
        "size": "42",
        "paidPrice": 12000.00,
        "datamatrix": "010460406000600021K4FNP6WPM93DH"
      }
    ]
  }
}

Изменение статуса товара (itemStatusChanged)

Отправляется при изменении статуса отдельного товара в заказе.

Частичный выкуп — один товар доставлен, второй не выкуплен

{
  "type": "itemStatusChanged",
  "trackingId": "117391951",
  "sequenceNumber": 6,
  "data": {
    "id": "CZ117391951",
    "status": "Delivered",
    "paymentMethod": "COD",
    "fullSum": "25000.00",
    "createdAt": "2025-01-20",
    "updatedAt": "2025-01-22 18:15:00",
    "dates": {
      "delivered": "2025-01-22 18:15:00"
    },
    "items": [
      {
        "id": 7599,
        "status": "Delivered",
        "finalERPStatus": "sold",
        "sku": "SELLERSKU201",
        "size": "M",
        "description": "Куртка зимняя",
        "paidPrice": 15000.00,
        "statusChangeReason": null
      },
      {
        "id": 7600,
        "status": "Not bought",
        "finalERPStatus": "rejected",
        "sku": "SELLERSKU202",
        "size": "L",
        "description": "Свитер шерстяной",
        "paidPrice": 10000.00,
        "statusChangeReason": "Размер не подошёл"
      }
    ]
  }
}

Возврат товара (Claimed → Claimed ok)

{
  "type": "itemStatusChanged",
  "trackingId": "117391950",
  "sequenceNumber": 8,
  "data": {
    "id": "CZ117391950",
    "status": "Delivered",
    "updatedAt": "2025-01-30 14:20:00",
    "items": [
      {
        "id": 7598,
        "status": "Claimed ok",
        "finalERPStatus": "claimed_ok",
        "sku": "SELLERSKU104",
        "size": "42",
        "paidPrice": 12000.00,
        "statusChangeReason": "Товар не подошёл по размеру",
        "datamatrix": "010460406000600021K4FNP6WPM93DH"
      }
    ]
  }
}

Изменение статуса поставки FBO (fulfilmentShipmentStatusChanged)

Отправляется при изменении статуса входящей FBO-поставки на склад Lamoda. Доступна только для модели FBO (см. таблицу доступности).

Поставка подтверждена (Confirmed)

{
  "type": "fulfilmentShipmentStatusChanged",
  "createdAt": "2025-01-15T11:00:00+03:00",
  "data": {
    "id": 12345,
    "shipmentId": "SHIP-2025-001234",
    "status": "confirmed",
    "itemQuantity": 100,
    "priceSum": 250000.00,
    "receipt": 0,
    "accepted": 0,
    "surplus": 0,
    "missing": 0,
    "damaged": 0,
    "items": [
      {
        "sku": "SELLER-SKU-001",
        "ean": "4600000000001",
        "quantity": 50,
        "price": 2500.00,
        "datamatrixes": ["010460406000600021K4FNP6WPM93DH", "010460406000600021K4FNP6WPM93DI"]
      },
      {
        "sku": "SELLER-SKU-002",
        "ean": "4600000000002",
        "quantity": 50,
        "price": 2500.00,
        "datamatrixes": []
      }
    ]
  }
}

Поставка принята по количеству (Received)

{
  "type": "fulfilmentShipmentStatusChanged",
  "createdAt": "2025-01-18T16:30:00+03:00",
  "data": {
    "id": 12345,
    "shipmentId": "SHIP-2025-001234",
    "status": "received",
    "itemQuantity": 100,
    "priceSum": 250000.00,
    "receipt": 97,
    "accepted": 0,
    "surplus": 2,
    "missing": 5,
    "damaged": 0,
    "unknownSurplus": 0,
    "items": [
      {
        "sku": "SELLER-SKU-001",
        "ean": "4600000000001",
        "quantity": 50,
        "receipt": 48,
        "accepted": 0,
        "surplus": 0,
        "missing": 2,
        "damaged": 0
      },
      {
        "sku": "SELLER-SKU-002",
        "ean": "4600000000002",
        "quantity": 50,
        "receipt": 49,
        "accepted": 0,
        "surplus": 2,
        "missing": 3,
        "damaged": 0
      }
    ]
  }
}

Поставка закрыта по качеству (Closed)

{
  "type": "fulfilmentShipmentStatusChanged",
  "createdAt": "2025-01-20T10:00:00+03:00",
  "data": {
    "id": 12345,
    "shipmentId": "SHIP-2025-001234",
    "status": "closed",
    "itemQuantity": 100,
    "priceSum": 250000.00,
    "receipt": 97,
    "accepted": 95,
    "surplus": 2,
    "missing": 5,
    "damaged": 2,
    "unknownSurplus": 0,
    "items": [
      {
        "sku": "SELLER-SKU-001",
        "ean": "4600000000001",
        "quantity": 50,
        "receipt": 48,
        "accepted": 47,
        "surplus": 0,
        "missing": 2,
        "damaged": 1
      },
      {
        "sku": "SELLER-SKU-002",
        "ean": "4600000000002",
        "quantity": 50,
        "receipt": 49,
        "accepted": 48,
        "surplus": 2,
        "missing": 3,
        "damaged": 1
      }
    ]
  }
}

Структура полей нотификации

Общие поля (statusChanged, itemStatusChanged)

Поле Тип Описание
type string Тип нотификации (statusChanged или itemStatusChanged)
trackingId string Номер заказа (без префикса). Подтверждено: NotificationMessage::getTrackingId()
sequenceNumber integer Порядковый номер изменения (для идемпотентности)
data object Полные данные заказа со всеми товарами

Поля верхнего уровня (fulfilmentShipmentStatusChanged)

Поле Тип Описание
type string Всегда fulfilmentShipmentStatusChanged
createdAt datetime Время создания нотификации (ISO 8601)
data object Данные поставки (ID, статус, позиции, приёмка)

Поля товара в заказе (statusChanged, itemStatusChanged)

Поле Тип Описание
id integer ID товара в заказе
status string Текущий статус товара
finalERPStatus string Финальный ERP-статус (sold, rejected, claimed_ok и т.д.)
sku string Артикул товара
paidPrice number Оплаченная цена
datamatrix string Код маркировки (UIT)
statusChangeReason string Причина изменения статуса

Поля позиции в FBO-поставке (fulfilmentShipmentStatusChanged)

Поле Тип Описание
sku string Артикул товара партнёра
ean string Штрихкод EAN
quantity integer Заявленное количество
receipt integer Фактически принято (количественная приёмка)
accepted integer Принято по качеству
surplus integer Излишки
missing integer Недостача
damaged integer Повреждённые единицы
price number Цена за единицу (присутствует при статусе Confirmed)
datamatrixes array of string Коды маркировки (массив UIT, присутствует при статусе Confirmed)

Использование sequenceNumber

Идемпотентность: Поле sequenceNumber увеличивается с каждым изменением статуса. Используйте его для:
  • Проверки порядка обработки нотификаций
  • Игнорирования устаревших нотификаций (если получили sequenceNumber=5, а потом пришла 3 — игнорируем)
  • Отладки и расследования инцидентов
def handle_notification(notification):
    order_id = notification['data']['id']
    seq = notification.get('sequenceNumber')
    
    if seq is None:
        # fulfilmentShipmentStatusChanged может не содержать sequenceNumber
        process_notification(notification)
        return
    
    # Получаем последний обработанный sequenceNumber
    last_seq = get_last_sequence(order_id)
    
    if seq <= last_seq:
        # Уже обработали или более свежую версию
        log.info(f"Skipping old notification: {seq} <= {last_seq}")
        return
    
    # Обрабатываем
    process_notification(notification)
    save_sequence(order_id, seq)

Обработка нотификаций

Важно: Нотификации statusChanged и itemStatusChanged всегда содержат полную информацию о заказе со всеми товарами. Даже если изменился статус одного товара, вы получите данные всех товаров в заказе.

Рекомендуемый алгоритм обработки

  1. Получить нотификацию
  2. Проверить sequenceNumber (не устарела ли) — для заказных нотификаций
  3. Извлечь type и направить в соответствующий обработчик
  4. Обновить локальные данные
  5. Вернуть HTTP 200 OK
# Пример обработчика на Python (Flask)
@app.route('/webhook', methods=['POST'])
def handle_webhook():
    notification = request.json
    notification_type = notification.get('type')
    
    handlers = {
        'statusChanged': handle_order_status,
        'itemStatusChanged': handle_item_status,
        'fulfilmentShipmentStatusChanged': handle_shipment_status
    }
    
    handler = handlers.get(notification_type)
    if handler:
        handler(notification)
    else:
        # Игнорируйте неизвестные типы —
        # в будущем могут появиться новые
        log.warning(f"Unknown notification type: {notification_type}")
    
    return 'OK', 200

Статусы доставки нотификаций

Каждая нотификация проходит через внутренние статусы доставки. Эти статусы отображаются в ответе метода управления подписками:

Статус подписки Внутренний статус Описание
active sent Последняя нотификация успешно доставлена
failing failed Доставка не удалась (проверьте endpoint)
has deferred messages deferred Подписка была отключена — нотификации накапливаются и будут отправлены при включении
no messages new Нотификация создана, ожидает отправки (или нотификаций ещё не было)
disabled Подписка отключена партнёром

Возможные ошибки доставки

При неудачной доставке нотификации система фиксирует одну из следующих ошибок:

Код ошибки Описание Что делать
http connection timeout Timeout при подключении к endpoint партнёра Проверьте доступность и скорость отклика endpoint
http connection failed Не удалось установить соединение Проверьте DNS, HTTPS-сертификат и firewall
http request failed Endpoint вернул ошибочный HTTP-код (4xx/5xx) Проверьте логику обработки на вашей стороне
notifications disabled Подписка была отключена в момент генерации Включите подписку — deferred-нотификации переотправятся
internal error Внутренняя ошибка платформы Lamoda Используйте переотправку или обратитесь в поддержку

Статус верификации документа

Элемент Статус Комментарий
Примеры statusChanged Структура соответствует коду
Примеры itemStatusChanged Структура соответствует коду
Примеры FBO (fulfilmentShipmentStatusChanged) Структура ОК; расхождения формата с 10_2 (createdAt vs date)
Примеры FBS (удалены) Удалено Код подтверждает: fulfilmentShipmentStatusChanged — только FBO. FBS = отдельное событие shipmentOutReceivedRest
Таблица общих полей Исправлено Разделена на заказные и поставочные нотификации
Таблица полей FBO-позиций Добавлено Отдельная таблица для items в FBO-нотификации (структура отличается от заказных items)
Статусы доставки Message Добавлено 4 статуса + маппинг подтверждены: Message entity + NotificationSubscriptionResponseFactory
Ошибки доставки Добавлено 5 типов ошибок из констант Message entity
Регистр статусов FBO Расхождение: lowercase в примерах vs capitalized в 10_2 и state machine. Нужен сериализатор
Формат createdAt vs date Расхождение с 10_2. Нужен код сериализатора для разрешения

См. также

Помогла эта информация?

Да Нет
0/1000 Отправить
Адреса доставки в API
Переотправка нотификаций в API
Спросить у Lamoda Seller Assistant в Telegram