Концепции
Пагинация и форматы
Списки разбиваются на страницы с помощью cursor. Ответы приходят в JSON с предсказуемыми соглашениями.
Пагинация через cursor#
Каждый endpoint, возвращающий список, принимает два параметра запроса:
| Параметр | Описание |
|---|---|
limit | Количество элементов на странице, от 1 до 100. Значение по умолчанию см. в описании endpoint в справочнике API. |
cursor | Значение next_cursor с предыдущей страницы. Для первой страницы не указывайте его. |
Ответ всегда имеет такую структуру:
{
"data": [ { "id": "1043", "...": "..." } ],
"next_cursor": "eyJpZCI6IjEwNDMifQ"
}
Если next_cursor равен null, страниц больше нет. Cursor — непрозрачная строка: не формируйте и не изменяйте её и не храните долго.
Чтение всех страниц#
curl "https://api.linework.app/open/v1/me/posts?limit=50" \
-H "Authorization: Bearer $LINEWORK_API_KEY"
# next page: pass the next_cursor you received
curl "https://api.linework.app/open/v1/me/posts?limit=50&cursor=eyJpZCI6IjEwNDMifQ" \
-H "Authorization: Bearer $LINEWORK_API_KEY"
async function* all(path) {
let cursor = null;
do {
const url = new URL(`https://api.linework.app/open/v1${path}`);
url.searchParams.set("limit", "100");
if (cursor) url.searchParams.set("cursor", cursor);
const res = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.LINEWORK_API_KEY}` },
});
const page = await res.json();
yield* page.data;
cursor = page.next_cursor;
} while (cursor);
}
for await (const post of all("/me/posts")) console.log(post.id);
import os, requests
API = "https://api.linework.app/open/v1"
s = requests.Session()
s.headers["Authorization"] = f"Bearer {os.environ['LINEWORK_API_KEY']}"
def all_items(path):
cursor = None
while True:
params = {"limit": 100}
if cursor:
params["cursor"] = cursor
page = s.get(API + path, params=params, timeout=30).json()
yield from page["data"]
cursor = page.get("next_cursor")
if not cursor:
break
for post in all_items("/me/posts"):
print(post["id"])
Соглашения JSON#
- Имена полей записываются в
camelCase(например,createdAt,mediaIds). Единственное исключение —next_cursorв ответах со списками. - Идентификаторы — строки, даже если выглядят как числа. Не преобразуйте их в числа.
- Даты — строки ISO 8601 в UTC, например
2026-10-14T09:30:00.000Z. - Тела запросов передаются в JSON (
Content-Type: application/json), за исключениемPOST /media, который используетmultipart/form-data. - Отсутствующие необязательные значения равны
nullили опускаются; обрабатывайте оба случая одинаково. - В ответы в любой момент могут добавляться новые поля: игнорируйте поля, которые вам неизвестны.
Версионирование#
Версия указывается в пути (/open/v1). В рамках v1 мы вносим только обратно совместимые изменения: новые endpoint, новые необязательные параметры, новые поля ответа, новые коды ошибок. Несовместимые изменения появятся в /open/v2 и будут заранее объявлены в журнале изменений.