Коннектор, который физически не может ничего испортить в вашем кабинете
У подрядчика, за которого работает 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.