Продавцам

API и интеграции

Как передавать в 7A товары, цены и остатки: API 7A, YML-фид, Excel/CSV, кабинеты маркетплейсов и Veloseller. Источник выбирается в кабинете: Предложения → Импорт и обновления. Работает один способ одновременно.

API 7A

Ключ и авторизация

Ключ создаётся в кабинете (способ «API 7A») и показывается один раз. Передавайте его в каждом запросе. Ключ даёт доступ только к вашему магазину; отозвать его можно там же.

Authorization: Bearer 7a_live_<id>_<secret>

Лимит — 120 запросов в минуту на ключ, полный снимок — не чаще раза в 10 минут. Записывать данные можно, только когда в кабинете выбран способ «API 7A» (или «Ручной ввод (Veloseller)»), иначе ответ 409.

Повторы и ошибки

Для записывающих методов передавайте заголовок Idempotency-Key (до 200 символов): повтор с тем же ключом в течение 24 часов вернёт сохранённый ответ с заголовком Idempotency-Replayed: true.

Ошибки — в формате RFC 7807 (application/problem+json) с понятным описанием в поле detail.

Коды ответов
400bad_jsonТело запроса — не JSON или некорректный Idempotency-Key
401unauthorizedКлюч неверный, отозван или не передан (ответ всегда одинаковый)
403forbiddenУ ключа нет нужного права, или магазин заблокирован (запись данных приостановлена)
404not_foundОбъект не найден (например, чужой прогон)
409conflictВ кабинете выбран другой способ передачи данных, или снимок уже обрабатывается
413too_largeТело больше лимита: снимок — 50 МБ, PATCH — 10 МБ
415unsupported_mediaНеверный Content-Type
422validationНарушена схема запроса или Idempotency-Key повторён с другим телом
429rate_limitedПревышен лимит; в заголовке Retry-After — через сколько секунд повторить

Товар

Предложение в 7A — это ваш SKU. Остатки передаются по точкам (коды точек — в кабинете, раздел «Точки и склады»). Если у магазина одна точка, её можно не указывать. Остаток без количества — true или «есть»: покупатель увидит «в наличии», а не выдуманное число.

Поля товара
ПолеТипОписание
sku*stringАртикул продавца: латиница, цифры и «._+-», до 64 символов. Ключ товара
name*stringНазвание товара
price*number | stringЦена в рублях: 6990, «6 990,00»
oldPricenumber | stringЦена до скидки — пока не используется: принимается, но в 7A не показывается
currencystringВалюта: RUB (по умолчанию). Другие валюты не принимаются
stocknumber | string | boolean | nullОстаток, если у товара одна точка (вместе с point)
pointstringКод точки для stock; можно не указывать, если точка одна
stocksobject[]Остатки по точкам — заменяют все точки товара; [] — нигде нет
brandstringПроизводитель
modelstringМодель
barcodestringШтрихкод EAN/GTIN
categorystringКатегория
urlstringСсылка на товар на вашем сайте (http/https)
Элемент stocks[]
ПолеТипОписание
point*stringКод точки или склада (как в кабинете) либо его алиас
stock*number | string | boolean | nullОстаток: число; true или «есть» — в наличии без количества; 0, false или «нет» — нет в наличии
pricenumber | stringЦена в этой точке, если отличается от основной

PUT/api/v1/offers

Полный снимок ассортимента: JSON {"offers": [ … ]} или NDJSON (товар на строку), до 50 МБ. Товары, которых нет в снимке, удаляются. Обработка асинхронная: ответ 202 с номером прогона.

Защита от ошибок: если снимок пустой, удалил бы больше половины предложений или больше половины строк с ошибками — он не применяется, пока вы не подтвердите его в кабинете.

Запрос
curl -X PUT https://7a.ru/api/v1/offers \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/x-ndjson" \
  -H "Idempotency-Key: snapshot-2026-09-24" --data-binary @offers.ndjson

# offers.ndjson
{"sku":"RB750GR3","name":"MikroTik hEX (RB750Gr3)","price":6990,"stocks":[{"point":"MSK-1","stock":12},{"point":"SPB-1","stock":true}]}
{"sku":"ARCHER-C6","name":"TP-Link Archer C6","price":"2 490","stock":0,"point":"MSK-1"}
Ответ 202
{"runId": 4812, "status": "queued", "statusUrl": "/api/v1/imports/4812"}

PATCH/api/v1/offers

До 1000 изменений синхронно — меняются только перечисленные SKU. Полный stocks[] заменяет точки товара; одиночные stock + point меняют остаток только в этой точке. Товар с ошибкой (не распознано наличие, неизвестная точка, нет названия или цены) отклоняется целиком и возвращается в errors[] — уже опубликованное предложение при этом не меняется. В одном запросе — не больше 10 000 пар «товар × точка» (с учётом stocks[]), иначе ответ 422.

Удаление товара в PATCH
ПолеТипОписание
sku*stringАртикул
deleted*trueУдалить предложение
Запрос
curl -X PATCH https://7a.ru/api/v1/offers -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"offers":[{"sku":"RB750GR3","name":"MikroTik hEX (RB750Gr3)","price":6890,"stock":3,"point":"MSK-1"},
                 {"sku":"OLD-1","deleted":true},
                 {"sku":"S+RJ10/Б/У","name":"Модуль SFP+ RJ45 10G","price":3990,"stock":1,"point":"MSK-1"}]}'
Ответ 200
{"runId": 4813, "received": 3, "added": 0, "updated": 1, "removed": 1,
 "errors": [{"index": 2, "sku": "S+RJ10/Б/У", "kind": "bad_sku", "detail": "Недопустимые символы: «/», «Б», «У»"}]}

GET/api/v1/offers?cursor=&limit=100

Ваши предложения постранично (до 500 за запрос) с остатками по точкам и статусом. Следующая страница — по значению nextCursor.

GET/api/v1/imports/{runId}

Статус прогона (queued, running, success, failed, held), счётчики и первые 100 ошибок строк.

Ответ 200
{"id": 4812, "status": "success", "received": 2, "added": 2, "updated": 0, "removed": 0, "errors": 0, "errorRows": []}

GET, PUT/api/v1/points

Список точек и складов; PUT создаёт или обновляет точки по коду (до 500 за запрос). Точки, которых нет в запросе, не удаляются.

Точка
ПолеТипОписание
code*stringКод точки — по нему точка обновляется и сопоставляется с остатками
name*stringНазвание: «Магазин на Ленина»
city*stringГород: slug (msk, spb) или название
addressstringАдрес (обязателен для новой точки)
hoursstringЧасы работы
phonestringТелефон точки: +7 900 000-00-00; пустая строка — убрать
kind"store" | "warehouse" | "pickup"store — магазин, warehouse — склад, pickup — пункт выдачи
status"active" | "paused"paused — остатки точки не показываются
Запрос
curl -X PUT https://7a.ru/api/v1/points -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"points":[{"code":"MSK-1","name":"Магазин на Тверской","city":"msk","address":"Тверская, 1","hours":"10–21"}]}'

POST/api/v1/heartbeat

Данные не менялись, но актуальны: отмечает время обновления без передачи товаров. Ответ 204.

GET/api/v1/me

Магазин, ключ и выбранный способ передачи данных — удобно для проверки подключения.

YML / XML-фид

Формат Яндекс Маркета (YML), UTF-8 или windows-1251, можно сжатый gzip. 7A забирает фид каждые 12 часов с заголовками If-None-Match и If-Modified-Since. Фид должен открываться по http(s) на порту 80, 443, 8080 или 8443; если он закрыт паролем (HTTP Basic), укажите логин и пароль в ссылке: https://логин:пароль@ваш-сайт.ru/feed.yml (в кабинете пароль потом не показывается). Объявления сущностей в DOCTYPE не принимаются.

  • offer@id — SKU
  • name или typePrefix + vendor + model — название
  • price, currencyId RUR/RUB — цена
  • count или @available — наличие
  • outlets/outlet@id + @instock — остатки по точкам
  • vendor, vendorCode/model, barcode, url, categoryId
Пример
<offer id="RB750GR3" available="true">
  <name>Маршрутизатор MikroTik hEX (RB750Gr3)</name>
  <vendor>MikroTik</vendor><vendorCode>RB750Gr3</vendorCode>
  <price>6990</price><currencyId>RUR</currencyId>
  <outlets><outlet id="MSK-1" instock="12"/><outlet id="SPB-1" instock="0"/></outlets>
</offer>

Excel / CSV

XLSX, XLS или CSV до 20 МБ, до 100 000 строк. Колонки сопоставляются в кабинете после загрузки; шапку над таблицей 7A пропустит. CSV — с разделителем «;», «,» или табуляцией, в UTF-8 или windows-1251. Цены можно писать как «6 990,00 ₽», наличие — числом или словами «есть», «нет», «>10».

Файл не обновляется сам: загружайте актуальный прайс не реже раза в неделю — иначе данные станут неактуальными и магазин получит статус «Заморожен». На шестой день 7A пришлёт напоминание.

Ozon, Wildberries, Яндекс Маркет, МойСклад

Укажите в кабинете ключ API маркетплейса с правами только на чтение — 7A раз в 12 часов заберёт товары, цены и остатки ваших собственных складов (FBS/DBS). Остатки на складах маркетплейса (FBO) не передаются: в 7A — только то, что вы выдаёте сами. Ключи хранятся зашифрованными.

Склад маркетплейса привязывается к вашей точке алиасом вида ozon:123, wb:507 или ym:55001 в разделе «Точки и склады»; непривязанные склады после импорта появятся в ошибках со ссылкой «Привязать к точке».

МойСклад подключается так же — токеном API (JSON API 1.2) пользователя с правом просмотра товаров и остатков. 7A забирает товары и модификации, цену продажи и свободный остаток (без резерва) по складам; склад привязывается алиасом ms:<Ид склада>.

1С: обмен с сайтом (CommerceML)

В кабинете выберите способ «API 7A» и создайте ключ. В 1С (УТ, УНФ, КА, Розница) настройте «Обмен с сайтом»: адрес https://<адрес 7A>/api/1c/exchange, пользователь — любой, пароль — ключ API 7A. 7A принимает стандартный протокол обмена (checkauth → init → file → import) и файлы import.xml и offers.xml (CommerceML 2.x; цены и остатки отдельными файлами тоже подходят).

  • SKU — артикул, если он из латиницы и цифр, иначе Ид товара из 1С; у характеристики — SKU товара и часть Ид характеристики.
  • Цена — тип цены «Розничная» (или единственный); остатки — по складам, склад привязывается алиасом 1c:<Ид склада>.
  • Полная выгрузка заменяет ассортимент целиком (не чаще раза в 10 минут); выгрузка «только изменения» обновляет перечисленные товары.
  • Заказы 7A не принимает: обмен заказами в узле 1С можно отключить.

Veloseller

Для небольшого ассортимента товары можно вести в Veloseller: в кабинете 7A выберите «Ручной ввод (сервис Veloseller)» и нажмите «Перейти в Veloseller» — сервисы свяжутся автоматически. Если подключение в один клик недоступно, создайте ключ API 7A и вставьте его в Veloseller: Интеграции → 7A.

Для разработчиков Veloseller: POST /api/v1/connect/veloseller с телом {"code": "…"} и подписью X-7A-Signature = hex(HMAC-SHA256(секрет, X-7A-Timestamp + «.» + тело)); код одноразовый и действует 10 минут.

Ошибки строк

Строки с ошибками не попадают в поиск, остальные применяются. Если у SKU нет ни одной верной строки, предложение получает статус «Ошибка» до следующего обновления. Все ошибки последнего импорта видны в кабинете и в ответе /api/v1/imports/{runId}.

  • no_priceНе указана цена
  • unknown_pointНеизвестная точка/склад
  • no_nameНе указано название
  • no_stockНе указано наличие
  • bad_skuНекорректный SKU (недопустимые символы)
  • duplicate_skuПовторяющийся SKU
  • bad_rowСтрока не распознана

Требования к данным — в публичной оферте для продавцов: цена и наличие должны соответствовать реальному предложению, условие цены (например, промокод) раскрывается рядом с ценой.