Пагинация, фильтры и ошибки
Пагинация всегда keyset
Страницы нумеруются не номером, а курсором: в ответе приходит cursor, его
надо передать в следующий запрос.
GET /api/v1/settlements
→ { "settlements": [...], "cursor": "1937..." }
GET /api/v1/settlements?cursor=1937...
→ { "settlements": [...], "cursor": null }
cursor: null означает, что список кончился.
Постраничного ?page=2 нет и не будет. Данные лежат по шардам, и OFFSET
заставляет каждый шард прочитать и выбросить все строки до нужной — на
десятой странице это десять тысяч прочитанных строк ради ста отданных.
Курсор читает ровно то, что отдаёт.
Фильтры
Пустое значение — это отсутствие фильтра. ?q= означает «где угодно», а не
«где название равно пустой строке».
Перечисления передаются именами: ?kind=cottage_village, а не ?kind=1.
Числовое значение сервер тоже примет — оно лежит в базе, и человек, который
подсмотрел его там, не должен получить непонятную ошибку, — но в
документации и в схеме показаны только имена.
Ошибки
| Код | Что случилось | Чинится ли повтором |
|---|---|---|
401 |
нет токена или он недействителен | нет, нужен новый токен |
403 |
токену не хватает скоупа, либо политика отказала | зависит, см. скоупы |
404 |
нет такого объекта, либо он не опубликован | нет |
422 |
входные данные не прошли валидацию | да, если исправить данные |
429 |
превышен лимит запросов | да, позже |
Тело ошибки валидации — стандартное для Laravel:
{
"message": "The plot number field must not be greater than 20 characters.",
"errors": {
"plot_number": ["The plot number field must not be greater than 20 characters."]
}
}
Лимиты запросов
| Поверхность | В минуту | Считается по |
|---|---|---|
/api/v1/* с токеном |
300 | аккаунту |
/api/v1/* публичное |
60 | адресу |
| MCP с токеном | 120 | аккаунту |
| MCP публичный | 30 | адресу |
По аккаунту, а не по адресу, — намеренно: ассистент работает на чьём-то ноутбуке за тем же NAT, что и тысяча других людей, и лимит по адресу заставил бы их делить бюджет.
Идентификаторы
Приходят и принимаются строками. Это снежинки — 64-битные числа, которые JavaScript округляет молча, а идентификатор, вернувшийся немного другим, — это объект, который больше не найти.