Пагинация
Курсорная пагинация списков Slicer API — параметры limit и cursor, поле nextCursor и примеры обхода всех страниц.
На этой странице
Длинные списки — проекты и операции кошелька — API отдаёт страницами. Пагинация курсорная: каждая страница сообщает, где начинается следующая, и вы просто передаёте это значение в новый запрос.
Параметры и ответ
| Параметр | Значение |
|---|---|
limit | размер страницы, от 1 до 100; по умолчанию 20 |
cursor | значение nextCursor из предыдущей страницы; без него — первая страница |
{
"ok": true,
"data": {
"items": [
{ "id": 318, "title": "Монтаж за 3 минуты", "status": "succeeded" },
{ "id": 311, "title": "Обзор новой коллекции", "status": "succeeded" }
],
"nextCursor": "Mg"
}
}nextCursor: null — страниц больше нет. Курсор — непрозрачная строка: не разбирайте и не составляйте её сами.
Повреждённый курсор — 400 bad_cursor.
Списки со страницами:
GET /v1/projects— проекты, новые сверху; фильтрыstatus(all,ready,active,failed,draft— черновики проектов без ИИ-режиссёра) иq— поиск по названию;GET /v1/wallet/transactions— операции кошелька, новые сверху.
Остальные списки (версии, история проекта, публикации, вебхуки, доставки) короткие и приходят целиком массивом.
Обойти все страницы
CURSOR=""
while :; do
PAGE=$(curl -s "https://api.slicer.media/v1/projects?limit=100&status=ready${CURSOR:+&cursor=$CURSOR}" \
-H "Authorization: Bearer $SLICER_TOKEN")
echo "$PAGE" | jq -r '.data.items[] | "\(.id)\t\(.title)"'
CURSOR=$(echo "$PAGE" | jq -r '.data.nextCursor // empty')
[ -z "$CURSOR" ] && break
doneasync function* allProjects(params = {}) {
let cursor = null;
do {
const query = new URLSearchParams({ limit: '100', ...params, ...(cursor ? { cursor } : {}) });
const response = await fetch(`https://api.slicer.media/v1/projects?${query}`, {
headers: { Authorization: `Bearer ${process.env.SLICER_TOKEN}` },
});
const json = await response.json();
if (!json.ok) throw new Error(`${json.error.code}: ${json.error.message}`);
yield* json.data.items;
cursor = json.data.nextCursor;
} while (cursor);
}
for await (const project of allProjects({ status: 'ready' })) {
console.log(project.id, project.title);
}import os
import requests
def all_projects(**params):
session = requests.Session()
session.headers["Authorization"] = f"Bearer {os.environ['SLICER_TOKEN']}"
cursor = None
while True:
query = {"limit": 100, **params, **({"cursor": cursor} if cursor else {})}
body = session.get("https://api.slicer.media/v1/projects", params=query, timeout=60).json()
if not body["ok"]:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
yield from body["data"]["items"]
cursor = body["data"]["nextCursor"]
if not cursor:
break
for project in all_projects(status="ready"):
print(project["id"], project["title"])