Core reference

Получить изменения, случившиеся после момента, названного курсором

Дельта-чтение: «что изменилось с момента X». Одна операция на все сущности — сущность называется параметром entity, а не отдельным адресом, поэтому интегратор учит одну форму и хранит один курсор.

Ответ несёт ИДЕНТИЧНОСТЬ изменения, а не объект: сущность, идентификатор, вид изменения и момент. Сам объект читатель забирает штатной операцией под своими правами — у ленты нет своего сериализатора, значит нет и второго места, где можно отдать поле, которого читателю видеть нельзя.

Первый вызов делается БЕЗ курсора и данных не отдаёт: он возвращает пустой список и позицию. Порядок такой — снять курсор, вычитать данные штатными операциями, продолжить с курсора; лента не является выгрузкой и строк, не менявшихся с момента заведения журнала, не содержит.

Гарантия — «НЕ МЕНЬШЕ одного раза». Один объект может приехать дважды: строка, изменённая повторно, приезжает с новым изменением, а курсор, предъявленный второй раз, отдаёт ту же страницу. Читатель обязан сводить по паре entity + id. «Ровно один раз» не обещано и обещано не будет.

has_more означает «в этом прогоне есть ещё», а не «в кабинете больше ничего не менялось»: ложь закрывает прогон, следующий запрос откроет новый и увидит случившееся после.

Курсор непрозрачен: его возвращают как есть, не разбирая и не собирая. Он привязан к кабинету и к набору сущностей; предъявленный в другом кабинете или с другим entity отклоняется. Курсор старше срока хранения журнала — 30 суток — отвечает 409 changes.cursor_expired: за ним стоят вычищенные строки, и молчание вместо отказа означало бы тихую потерю.

get/api/v1/reference/changes

Request

  • Base URL: https://erp.akeda.ru
  • URL: https://erp.akeda.ru/api/v1/reference/changes
  • Auth: one of:
    • HTTP bearer
    • API key in header X-Api-Key
    • OAuth 2 (authorization code, authorization URL https://erp.akeda.ru/oauth2/authorize, token URL https://erp.akeda.ru/oauth2/token, scopes: akeda:delegate)

Query parameters

entitystring

Сущности через запятую (core.contact,core.document). Без параметра берутся все, доступные предъявителю. Названная сущность без права — отказ 403, а не молчаливое сужение: молчание читается как «ничего не менялось».

Выбор влияет и на срок жизни курсора. Курсор, снятый БЕЗ параметра, означает «всё, что мне видно», и переживает появление новых сущностей — они просто начинают приезжать. Курсор, снятый с поимённым списком, связан этим списком: запрос с другим набором отвечает 400, потому что прошлого новых сущностей читатель не получил бы, а решил бы, что получил.

cursorstring

Курсор предыдущего ответа. Пусто — первый вызов, отдающий позицию без данных.

limitinteger

Потолок страницы. Строк, а не прогонов

Headers

X-Tenantstring required

Slug выбранного кабинета; кабинет не является юрлицом

Response

Страница изменений и курсор продолжения

entitiesstring[] required

Сущности, которые эта лента обслуживает предъявителю

countinteger required

Число строк, а не прогонов

limitinteger required
has_moreboolean required

«В этом прогоне есть ещё». Ложь закрывает прогон, а не кабинет: следующий запрос увидит случившееся после

cursorstring required

Непрозрачная строка. Возвращается как есть; разбирать и собирать её нельзя

Changes

No recorded changes to this operation across all 1 revision of this API.