для разработчиков На сайт Rentu

Пагинация

Пагинация есть только там, где список может вырасти. Справочники отдаются целиком.

Где есть, а где нет#

МетодПагинацияПочему
Торговые точкиестьВ крупном ТЦ их сотни
Продажи по дняместьПериод может быть длиной в год
ЧекиестьДесятки тысяч за месяц
АномалииестьРастут вместе с периодом
Торговые центрынетИх у сотрудника единицы
Зоны подсчётанетИх десятки, и список ограничен ТЦ
Продажи по месяцамнетДаже год — это 12 строк
ПосещаемостьнетОграничена окном запроса
Настройки товарооборотанетЭто один объект

Отсутствие пагинации не упущение, а решение. Добавлять page туда, где список физически не может быть большим, значит усложнять клиента без выгоды.

Как устроена#

GET /api/external/v2/sc/{sc_id}/shops?page=2&per_page=200
ПараметрПо умолчаниюДиапазон
page1от 1
per_pageзависит от методасм. описание метода
json
{
  "success": true,
  "data": [ ... ],
  "meta": { "pagination": { "page": 2, "per_page": 200, "total": 431 } }
}

В total приходит общее количество записей по заданному фильтру, а не размер страницы. Число страниц считается как ceil(total / per_page).

Ключ называется total, а не total_items или count. Это одинаково во всех методах v2.

Обход целиком#

python
page, rows = 1, []
while True:
    body = get(url, params={**filters, "page": page, "per_page": 500}).json()
    rows += body["data"]
    meta = body["meta"]["pagination"]
    if page * meta["per_page"] >= meta["total"]:
        break
    page += 1

per_page стоит брать побольше: один запрос на 500 строк дешевле по лимиту, чем пять по сто. Максимумы у методов разные, они указаны в описании каждого.

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