Каждый список API Notiondesk использует одну и ту же постраничную навигацию с помощью курсора, и каждый запрос может зафиксировать версию API, для которой была написана ваша интеграция, с помощью заголовка nd-version. В этой статье объясняется, как работает постраничная навигация API Notiondesk, как читать каждую страницу списка, как работает версионирование API и правила именования полей и параметров.
Как работает пагинация API Notiondesk
Все маршруты, указанные в списке, отвечают на один и тот же запрос:
{
"object": "list",
"data": [],
"has_more": false,
"next_cursor": null
}| Поле | Значение |
|---|---|
object | Всегда __СОХРАНЕНО_47__ |
data | Товары на этой странице |
has_more | __СОХРАНЕНО_44__ когда следует другая страница |
next_cursor | Значение, которое нужно передать как cursor для перехода на следующую страницу, или как null для перехода на последнюю страницу. |
Управляйте страницей с помощью двух параметров запроса:
| Параметр | Тип | По умолчанию | Примечания |
|---|---|---|---|
page_size | целое число | от 1 до 100 | 20 |
cursor | нить | никто | next_cursor с предыдущей страницы, возвращен без изменений |
В списках отсутствуют номера страниц и общее количество.
Прочитайте каждую страницу списка.
Повторяйте запрос, устанавливая значение cursor равным значению next_cursor из предыдущего ответа, пока значение has_more не станет равным false.
Первая страница:
На следующей странице NEXT_CURSOR заменено на закодированное в URL-формате next_cursor с первой страницы:
Тот же цикл в JavaScript:
А на языке Python:
Правила курсора
curl "https://api.notiondesk.so/sites/c74781f6-1aea-4e17-ab23-bbb8b4d174b6/articles?page_size=100" \
-H "Authorization: Bearer $NOTIONDESK_API_KEY" \
-H "nd-version: 2026-10-16"curl "https://api.notiondesk.so/sites/c74781f6-1aea-4e17-ab23-bbb8b4d174b6/articles?page_size=100&cursor=NEXT_CURSOR" \
-H "Authorization: Bearer $NOTIONDESK_API_KEY" \
-H "nd-version: 2026-10-16"async function listAll(path) {
const items = [];
let cursor = null;
do {
const url = new URL(`https://api.notiondesk.so${path}`);
url.searchParams.set("page_size", "100");
if (cursor) {
url.searchParams.set("cursor", cursor);
}
const response = await fetch(url, {
headers: {
Authorization: `Bearer ${process.env.NOTIONDESK_API_KEY}`,
"nd-version": "2026-10-16",
},
});
const page = await response.json();
items.push(...page.data);
cursor = page.has_more ? page.next_cursor : null;
} while (cursor);
return items;
}
const articles = await listAll("/sites/c74781f6-1aea-4e17-ab23-bbb8b4d174b6/articles");import os
import requests
def list_all(path):
items, cursor = [], None
while True:
params = {"page_size": 100}
if cursor:
params["cursor"] = cursor
page = requests.get(
f"https://api.notiondesk.so{path}",
params=params,
headers={
"Authorization": f"Bearer {os.environ['NOTIONDESK_API_KEY']}",
"nd-version": "2026-10-16",
},
).json()
items.extend(page["data"])
if not page["has_more"]:
return items
cursor = page["next_cursor"]- Курсор непрозрачен. Не анализируйте его и не создавайте собственный курсор. Передайте его обратно в том виде, в котором вы его получили.
- Вы можете изменять
page_sizeмежду страницами. Следующая страница начинается с того места, где закончилась предыдущая.
- Курсор фиксирует положение, а не моментальный снимок. Добавление или удаление элемента во время постраничного отображения может сместить последующие элементы, поэтому страница может повторять или пропускать один элемент. Если ваша интеграция удаляет элементы во время их отображения, начните заново с первой страницы.
- Некоторые списки обрываются раньше времени. Список изменений содержит максимум 1000 новых записей. Список перенаправлений страниц и отзывов содержит максимум 10 000 новых записей. После превышения этого лимита
has_moreпревращается вfalse.
- Некоторые списки никогда не разбиваются на страницы. Темы оформления и интеграции всегда возвращают все в одном ответе с
has_more: false.
Неправильно сформированный курсор или курсор, указывающий за конец списка, отвечает кодом 400 validation_error.
Создайте версию вашей интеграции API Notiondesk
Отправьте необязательный заголовок nd-version, чтобы указать версию контракта, для которой была написана ваша интеграция:
nd-version: 2026-10-16| Версия | Статус |
|---|---|
2026-10-16 | Текущий |
- Без заголовка запрос использует текущую версию.
- В каждом ответе в заголовке
nd-versionуказывается версия, которая использовалась для ответа.
- Неизвестное значение отвечает 400
invalid_version.
Новые маршруты, новые необязательные параметры и новые поля ответа поставляются без обновления версии. Ваша интеграция должна игнорировать поля, которые она не распознает, поэтому новое поле никогда не приведет к сбою.
nd-versionПравила именования
- Названия полей в запросах и ответах имеют формат snake_case :
page_size,next_cursor,default_locale.
- Параметры запроса имеют одно написание.
?page_size=10работает.?pageSize=10отклоняется как неизвестный параметр с кодом ошибки 400validation_error.
- Неизвестные параметры и поля тела запроса отклоняются с кодом 400
validation_error, поэтому опечатка никогда не проходит незаметно.
- API использует собственные существительные. Центр поддержки обозначается как
site, а коллекция — какcategory. Пути выглядят как/sites/{site_id}/categories.
- Даты указаны в формате ISO 8601 , например,
2026-10-18T14:39:03+00:00.
Часто задаваемые вопросы
Как мне узнать общее количество статей?
В списках нет общего количества элементов. Пролистайте список и посчитайте количество элементов или вызовите аналитический отчет quick, который возвращает количество статей в справочном центре. См. раздел «Получение аналитики справочного центра с помощью API Notiondesk» .
Каков максимальный размер страницы?
100 элементов. Значение по умолчанию — 20. Значение вне диапазона от 1 до 100 соответствует 400 validation_error.
Нужно ли мне отправлять заголовок nd-version?
nd-version?Нет. Без этого запрос будет использовать текущую версию. Для интеграций в рабочую среду рекомендуется отправлять запрос, чтобы их поведение оставалось неизменным.
Не нарушит ли добавление нового поля ответа мою интеграцию?
Нет, если ваш код игнорирует поля, которые он не распознает. Notiondesk добавляет поля ответа без новой версии.