Перейти к основному содержимому

Золотое Яблоко — Seller API (реверс)

Восстановлено реверсом кабинета seller.goldapple.ru, подтверждено живыми запросами 2026-07-09. 14 рабочих эндпоинтов.

# 1) логин → куки access_token / refresh_token
curl -c cookies.txt -X POST https://seller.goldapple.ru/connect/token \
-H 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode client_id=client_web \
--data-urlencode grant_type=password \
--data-urlencode username=ЛОГИН \
--data-urlencode password=ПАРОЛЬ

# 2) вызов API с этой кукой
curl -b cookies.txt 'https://seller.goldapple.ru/api/v1/user/info'

Креды команды — в /opt/ga-collector/config.env (chmod 600) на s3. Bearer-заголовок даёт 400 Not found counterparty_id — используется ТОЛЬКО cookie.

GET-эндпоинты /api/v1/

EndpointПараметрыОтдаёт
user/infoпрофиль
counterparty/short-infoконтрагент
merchant/finance-infoлимит / финансы
analytics/sales/total-aggregatesstartDate,endDate,dateMode=orderсуммы заказов/доставок
analytics/sales/graphsstartDate,endDate,dateMode=orderграфики продаж
analytics/sales/top-salescurrentDate,pointCount=7,topCount=1..5топ товаров
analytics/stocks/total-aggregatesstartDate,endDateостатки
analytics/stocks/buyout-aggregatesstartDate,endDateвыкупы
analytics/stocks/graphsstartDate,endDateграфики остатков
analytics/geo/top-deliverycitiesdate,topCountтоп городов доставки
analytics/geo/total-aggregatesstartDate,endDateгео-агрегаты

POST-эндпоинты /api/v1/ (Content-Type: application/json)

EndpointТело запросаОтдаёт
promotion/list{}data.promotions — акции
product/products{"query":"","filters":[],"request":{"pagination":{"page":1,"limit":1000}}}data.products — весь каталог (~599)
price/products{"query":"","request":{"pagination":{"page":1,"limit":1000}}}data.products с ценами (~592)

Грабли (проверено живьём)

  • analytics/sales/top-sales: topCount только 1..5 (больше → 400 TopCount must be between 1 and 5).
  • product/products и price/products игнорируют limit и отдают весь каталог одним ответом — пагинация НЕ нужна (иначе цикл тянет дубли).
  • product/products: filters обязателен и это массив [] (не объект). query — строка. Пагинация в отдельном поле request.
  • price/products: поля filters НЕТ — добавишь → 400.
  • GET-версии product/products / price/products / report/* отдают HTML-заглушку SPA (не API) — это только POST.
  • analytics/price/table — висит / timeout, в наборе не используем.

Даты

ISO-8601 UTC, окно обычно 7 дней: startDate = YYYY-MM-DDT00:00:00.000Z, endDate = YYYY-MM-DDT23:59:59.999Z.

Сбор данных

Коллектор /opt/ga-collector/ga_collect.py на s3 (cron 0 */2 * * *) логинится через московский прокси и пишет сырые ответы в gwptd_intake.ga_raw (ELT-буфер: endpoint, params, http_status, ok, collected_at, payload(JSON), error).