Коннектор, который физически не может ничего испортить в вашем кабинете

У подрядчика, за которого работает AI-сотрудник, вечная беда с доверием. Кейсы у нас закрытые: портал оптовиков, ассистент по регламентам, обмен с 1С. Всё это можно показать экраном на созвоне, но нельзя дать ссылкой. А человек, который читает письмо от незнакомого исполнителя, ссылку хочет.

Поэтому второй кейс я пишу не про клиента, а про код, который открыт целиком и лежит на гитхабе. Заходите и смотрите: github.com/pavelbar137-lang/wb-seller-sync.

Что это

Коннектор к Wildberries Seller API, который умеет только читать. Карточки, остатки, заказы, продажи, отчёт о реализации - всё складывается в SQLite-снимок, из него данные забирает витрина, аналитика или что там у вас стоит дальше.

Записать что-нибудь в кабинет продавца он не может. И это не строчка в README, а свойство конструкции. Транспорт принимает не URL, а имя метода из реестра. В реестре семь методов, пишущих - ноль. Команда wb-sync registry печатает этот список вместе с тем, откуда взята сигнатура каждого метода.

Разница простая. «Мы не будем ничего менять» - это обещание, за которое отвечает дисциплина разработчика. «Транспорт отклоняет незнакомый метод до отправки» - это то, что заказчик проверяет сам, за две минуты, открыв один файл.

Зачем такая паранойя

Wildberries - тот редкий случай, когда сложность не в коде, а в поведении источника. Всё, что перечислено ниже, ломает наивную выгрузку молча: процесс не падает, в логах чисто, а цифры в отчёте неверные. Это худший вид поломки - его находят через месяц, когда по этим цифрам уже приняли решение о закупке.

Тип токена решает, поедет ли синхронизация вообще. С 30 марта 2026 у WB четыре типа токенов, и у базовых лимиты срезаны вплоть до одного запроса в 3-24 часа. Регулярная выгрузка на таком токене невозможна, но со стороны это выглядит не как отказ, а как «ваша интеграция тормозит». Поэтому wb-sync token показывает срок жизни, контур и - через /ping по всем тринадцати доменам - какие категории токену на самом деле разрешены. А 429 с многочасовой паузой коннектор не ретраит, он объясняет: ретраи тут не лечат, нужен другой токен.

Курсор lastChangeDate умеет застревать. Если у всей страницы одинаковая метка времени, а так бывает при массовой перезаливке остатков, следующий запрос вернёт ту же страницу. И ещё раз. И так до конца света. Коннектор это распознаёт и останавливается с внятным сообщением. Флаг --nudge сдвигает курсор на миллисекунду, но тогда в отчёте о выгрузке появляется предупреждение, что строки с той же меткой могли не доехать. Честное «часть данных могла потеряться» дороже молчаливой дырки в базе.

rrd_id в отчёте о реализации нельзя брать из последней строки. Порядок строк в ответе не гарантирован, курсор откатывается назад, страницы приезжают повторно - и в финансовой витрине вырастают задвоенные суммы, которые потом ищут руками неделю. Берётся максимум по всей странице.

Отчёт о реализации меняется задним числом. Он появляется через 2-4 дня после конца недели и ещё недели две перегенерируется: строки добавляются, суммы уточняются, возвраты переезжают. Поэтому окно в 42 дня перечитывается целиком при каждом запуске. Отсюда же практический вывод для приёмки: сверять цифры с кабинетом имеет смысл только по закрытым периодам. По незакрытым расходятся не расчёты, а сам источник.

Лимиты считаются по доменам раздельно, поэтому у каждого домена свой счётчик. Упереться в минутный потолок статистики и притормозить из-за этого выгрузку карточек - обидно и незачем.

WB добавляет поля в ответы без анонса. Строка целиком сохраняется в JSON рядом с разобранными полями: новое поле оказывается в базе сразу и достаётся задним числом, без повторной выгрузки истории.

Что проверено, а что нет

Это, наверное, главное, что я хотел бы показать таким текстом. У каждого метода в реестре стоит источник сигнатуры, и wb-sync registry его печатает: «документация» или «практика, требует проверки».

Хосты всех тринадцати категорий проверены живыми запросами. Пути, параметры и курсоры по остаткам, заказам и продажам - дословно по документации WB. Лимиты (статистика 1/мин, контент 100/мин, продвижение 5/сек, отзывы 3/сек) - оттуда же.

А вот форма курсора у content/v2/get/cards/list и набор полей у reportDetailByPeriod на живом токене не проверены: доступа к боевому кабинету не было, сигнатуры взяты из практики интеграторов. Так и написано в README, отдельной таблицей.

Битовая маска внутри токена намеренно не разбирается. Её раскладку WB официально не публикует, а ошибка в ней означала бы, что коннектор уверенно сообщает о доступе, которого нет. Доступ выясняется у самого API.

Мне кажется, по этому куску о подрядчике понятно больше, чем по любому списку технологий в резюме. Разделение «проверено / взято из практики» стоит денег на этапе разработки и не даёт ничего продающего. Зато оно спасает того, кто будет чинить интеграцию через полгода.

Тесты

45 тестов, ни одного обращения в сеть. WB подменяется очередью ответов, часы и паузы - счётчиками, поэтому тест на минутный лимит статистики отрабатывает за миллисекунды. Каждая грабля из списка выше закрыта отдельным тестом, который воспроизводит именно её.

Прогон выгрузки публикуется атомарно: либо весь целиком, либо никак. Отчёт, построенный по половине выгруженных остатков, выглядит правдоподобно - и врёт.

Токен берётся только из окружения и никогда не принимается аргументом командной строки: аргументы видны в истории оболочки и в списке процессов.

Что ещё у нас открыто

Раз уж речь про проверяемое, вот остальное, что можно открыть без созвона и без NDA.

github.com/agiwhitelist - десяток открытых репозиториев. Самый заметный, auteur, это надстройка для кодовых AI-агентов, которая ведёт вёрстку сайта как съёмку фильма: 1036 звёзд и 18 форков на 1 октября. Рядом tokdiet - локальный прокси между кодовым агентом и API модели, считает и режет токены, 34 звезды.

agiwhitelist.com - работающий лендинг с оплатой: реестр подписей под манифестом, Stripe и криптоприём, три уровня взноса. В реестре больше 350 подписей. Кто там что писал, разбирать не буду, показываю как то, что живёт снаружи и берёт деньги с живых людей.

crown-rag-test - тестовое задание, сделанное сотрудником целиком, с разбором. Тоже открыто.

Кому это

Если у вас чужой API и цена ошибки в данных выше цены задержки - маркетплейсы, 1С, банковские выгрузки, - смотреть надо не на скорость подрядчика, а на то, как он обходится с неизвестным. Ни одна из граблей выше не написана в документации WB. Они находятся только тем, кто читает документацию целиком, а потом ещё проверяет, что она врёт.

Сервис устроен так: AI-сотрудник работает над вашими задачами каждый день, Павел настроил его и отвечает за результат. Первая неделя стоит 50 000 ₽ и пробная: не подошло, дальше не платите. Если остались, месяц стоит 199 000 ₽ за 30 дней. Кейсы по закрытым проектам, с числами за две недели работы, лежат на autopasha.ru/keysy.