Документация

API

Формат запросов, ответов и справочник полей для интеграций.

Финансовый API кабинета

Финансовый API работает в текущей организации с правами авторизованного пользователя — через сессию кабинета или его API-ключ. Модуль должен быть включён. Для записи нужны подходящий действующий тариф и права владельца, администратора или разрешение сотруднику. Владелец и администратор сохраняют чтение истории ранее включённого модуля после окончания тарифа; запись в этом режиме запрещена. Проверяйте context.access.can_read, can_write и history_only. API-ключ не расширяет права пользователя и не обходит ограничения модуля или тарифа.

Адрес: /api/?mod=finance&action=.... Чтение использует GET и параметры строки запроса; изменения — POST с JSON-телом и Content-Type: application/json. Для серверной интеграции передавайте Authorization: Bearer <api_key> или запасной заголовок X-API-Key: <api_key>. Ключ определяет пользователя и организацию так же, как в остальных разделах API. У финансов отдельный контракт данных: общий CRUD через mod=data/save_data/delete_data здесь не применяется.

Ключ только для чтения позволяет выполнять доступные пользователю GET-запросы, включая историю, отчёты и выгрузку export. Все POST-действия запрещены с кодом 31, в том числе sync_regular: синхронизация создаёт регулярные ожидания. Ключ с правом записи допускает POST только при context.access.can_write=true. Код 1367 также означает запрет изменения ключом «только чтение»; недоступный тариф даёт 1364, а отсутствие разрешения или выключенный модуль — 1365.

Начните с action=context: ответ содержит access, timezone, today, now, categories, methods, currencies. Берите ID категории и способа оплаты из этих справочников, а клиента и посещение — из clients и bookings. Проверяйте направление и вид категории: денежная cash, возврат refund, списание долга writeoff.

Деньги передаются десятичными строками, например "1250.50"; ответы сохраняют два знака после точки. На входе разрешены до 16 цифр до точки и до двух после неё, без знака, пробелов и запятой. Фактическая оплата положительна; сумму отдельного обязательства при изменении и цену посещения можно явно уменьшить до "0.00" с учётом уже закрытой суммы. Валюты — RUB, USD, EUR; они не складываются и не конвертируются друг в друга.

В финансовых запросах и результатах пользовательские даты и время относятся к context.timezone организации. Используйте YYYY-MM-DD HH:mm:ss либо календарную дату YYYY-MM-DD. Финансовые ответы не добавляют автоматически пары _iso_string/_timezone из общего CRUD-контракта. Для фактического действия будущая дата запрещена; будущий срок задаётся у ожидания. Отдельное правило UTC действует только для UNTIL с Z в расписании.

Общие параметры, фильтры и повторы

Поля обязательны только для методов, где они перечислены ниже. Организация определяется текущей сессией или API-ключом; попытка подменить её даёт 1382. Булевы GET-параметры принимают true/false или 1/0; в JSON используйте boolean. Все изменения выполняются атомарно: ошибка откатывает данные, историю, финансовые события и ключ запроса.

ПараметрФорматНазначение и ограничения
request_idstring, 8–100Обязателен у всех POST-действий, кроме sync_regular. Допустимы латинские буквы, цифры, дефис и подчёркивание. Повтор успешного action с прежним телом возвращает сохранённый результат с replayed=true; другое тело с тем же ключом даёт 1383. Для нового действия создавайте новый ключ.
id / versionintegerПри создании ID не передают. Для изменения, отмены или пропуска передайте ID нужной сущности и её актуальную версию из последнего чтения. При 1385 перечитайте данные; увеличение номера на клиенте не решает конфликт.
client_id / booking_idintegerНеобязательные связи, отсутствие связи — 0. ID относится к сущности выбранной организации. При оплате посещения клиент должен совпадать с клиентом посещения; распределение по разным клиентам запрещено.
category_id / method_idintegerДля нового движения выбирайте действующие записи из context. Способ обязателен для каждой денежной строки. Архивную запись нельзя выбрать заново, но неизменённая прежняя ссылка сохраняется при допустимом редактировании.
amount / currencystring / RUB | USD | EURСтрока суммы и отдельный код валюты обязательны в денежных методах. Все строки и распределения одного действия используют одну валюту.
occurred_at / due_atYYYY-MM-DD HH:mm:ssВремя фактического действия и срок обязательства. Если время действия не передано, используется текущее. Дата без времени означает локальную полночь; для конца фильтра to — 23:59:59.
from / to / as_ofYYYY-MM-DD | YYYY-MM-DD HH:mm:ssГраницы from/to включительны. Журнал фильтрует операции по occurred_at, ожидания — по due_at. as_of используется в балансах, отчётах и расчётах допустимой оплаты; у обычного списка это не общий фильтр состояния.
page / page_sizeintegerДля клиентов, посещений, операций и обязательств: страница от 1, по умолчанию page=1, page_size=30, максимум 100. total относится ко всем отобранным строкам, а не только текущей странице.
direction / state / currencystringНаправление — income или expense. state относится к запрашиваемой сущности: у операций и обязательств разные состояния. Срезы и сводки считаются отдельно по валютам.
client_id / booking_id / category_id / method_id / author_idintegerЖурнал поддерживает перечисленные ID. У обязательств нет фильтра способа оплаты или автора. В объединённом журнале выбор method_id или author_id оставляет только фактические операции. Фильтр посещения учитывает связанные распределения, а не только прямую ссылку операции.
clients_onlybooleanПоказывает строки с клиентом, исключая движения без клиента; применяется к журналу и обязательствам.
include_expected / journal_viewboolean / all | actual | expected | debtinclude_expected=true объединяет операции и обязательства. journal_view: все строки, фактические, неподтверждённые ожидания или подтверждённые долги. Проверяйте row_type: одинаковые числовые ID разных типов не означают одну сущность.
outstanding_only / show_deletedbooleanoutstanding_only=true у обязательств оставляет открытые положительные остатки. show_deleted=false у операций, журнала и сводки посещения скрывает отменённые операции; без параметра история сохраняется. deleted_count возвращает их количество независимо от видимости.

Полный реестр чтения: GET

Каждая строка — отдельный action модуля finance. Ответы ниже описывают содержимое data. Обычные чтения не создают регулярные платежи: при необходимости выполните отдельный sync_regular с правом записи. Ключ только чтения получает уже созданные ожидания.

actionПараметрыРезультат и особенности
context—Доступ и финансовые справочники: access, timezone, today, now, categories, methods, currencies. access содержит доступность чтения/записи и причину ограничения.
categories—items эффективных системных и собственных категорий: ID, версия, код, имя, направление, вид, признаки is_system/archived.
methods—items способов оплаты с ID, версией, кодом, именем и признаками is_system/archived.
clientsq, id, page, page_sizeПоиск по имени и необязательный точный ID. Возвращает items, total, page, page_size; у клиента — id/name.
bookingsq, id, client_id, page, page_sizeПоиск по названию, ID или клиенту. items, total, page, page_size; строки содержат клиента, сроки, признаки завершения/отмены, price_totals и price_version.
operationsfrom, to, client_id, booking_id, category_id, method_id, author_id, direction, currency, state, clients_only, include_expected, journal_view, show_deleted, page, page_sizeitems, totals, total, deleted_count, page, page_size. Поддерживает обычный и объединённый журнал. Для подбора источника возврата есть отдельный режим for_refund, описанный ниже.
obligationsfrom, to, client_id, booking_id, category_id, direction, currency, state, clients_only, outstanding_only, for_payment, page, page_sizeitems, totals, total, page, page_size. Строка содержит сумму, оплату, списание, остаток, срок и связи. Сводка totals заполняется при outstanding_only=true; for_payment добавляет допустимый allocation_limit.
client_balanceclient_id, as_of; for_payment, currency, correction_id, versiontotals по валютам: свободный аванс, резерв, долг, просрочено. Без ID клиента — общая сводка клиентов организации. В режиме for_payment=true обязательны клиент и валюта; добавляется available_to_allocate.
booking_summarybooking_id, show_deleted; for_payment, as_of, correction_id, version, currency, for_writeoffОбязателен booking_id. Возвращает booking, totals, operations, deleted_count, price_totals и актуальную price_version, когда доступна. Режим оплаты добавляет лимит распределения; история источников не становится повторным приходом посещения.
booking_summariesbooking_idsОбязательная строка из 1–100 ID посещений через запятую. items содержит booking_id, totals, confirmed, has_finance, price_totals, price_version, finance_price_totals доступных посещений.
operation_historyidОбязателен ID операции. items истории создания, редактирования, замены, отмены и согласования: action, author_id, author_name, occurred_at, before, after, replacements, reason.
cancellation_previewidОбязателен ID операции. Возвращает operations, releases, price_effects, price_changes, fingerprint перед каскадной отменой. Сам просмотр ничего не отменяет.
recurring—items настроек расписаний с версиями, условиями и next_payment_on. Это ближайший открытый непогашенный платёж либо прогноз до материализации; при паузе или исчерпанном правиле — null.
recurring_historyidОбязателен ID расписания. items с entity=recurring, действиями created/edited, автором, датой, before/after/reason. Неизменённые условия не создают лишних пунктов истории.
reportsfrom, to, as_of, client_id, booking_id, category_id, method_id, author_id, direction, currencysummary, daily, by_category, by_method, by_client, by_author, by_service, by_staff. По умолчанию to — сегодня, as_of — конец периода. Денежные фильтры категории/способа/автора/направления/валюты относятся к денежной части, а не ко всем историческим остаткам.
exportscope=operations | reportsОбязателен scope. При operations применяются параметры журнала, при reports — отчётов. Возвращает JSON с filename, mime, content, а не бинарный файл и не ссылку скачивания.

Полный реестр изменений: POST

Во всех строках, кроме sync_regular, дополнительно обязателен request_id. В таблице перечислены основные поля; условия редактирования, оплаты и связей раскрыты далее. Результаты — внутри data.

actionПараметрыРезультат и особенности
save_operationdirection, category_id, currency, rowsДенежный приход/расход, смешанная оплата, зачёт или списание по виду категории. Возвращает массивы operation_ids/obligation_ids, а не единый ID. При mode=expected создаёт ожидание и возвращает его id.
save_obligationdirection, amount, currencyСоздание или изменение отдельного ожидания/долга; при изменении обязательны id/version. Для ожидаемой оплаты посещения меняет срок по отдельному правилу ниже. Возвращает id.
allocateclient_id, currency, allocationsЗачёт уже полученного аванса в указанные обязательства; необязателен конкретный source_operation_id. Создаёт неденежную операцию balance, без нового денежного прихода. Возвращает массивы ID.
initial_balanceclient_id, type, amount, currencytype=advance создаёт начальный источник opening; type=debt — подтверждённое начальное обязательство. occurred_at/comment необязательны. ID находятся в соответствующих массивах ответа.
edit_operationid, version, amount, currencyИзменяет действующую операцию, сохраняя ID. Допустимы сумма/дата источника в установленных пределах либо метаданные разрешённого закрытого расчёта. Возвращает id; для изменения распределений используйте correct_operation.
correct_operationid, version; cancel | replacementОтмена с cancel=true либо замена полным объектом replacement. Причина — reason. Каскад зависимостей требует отдельного просмотра и отпечатка. Возвращает массивы затронутых/новых ID, а для согласования — дополнительные эффекты.
skip_obligationid, versionПомечает допустимое неоплаченное ожидание как skipped; reason необязателен. Оплата посещения, подтверждённый долг и частично оплаченный платёж не пропускаются. Возвращает массив затронутых обязательств.
save_booking_pricebooking_id, currency, amountЯвно меняет общую цену посещения в одной валюте и финансовый расчёт вместе с ней. Дополнительные поля: price_version, occurred_at, reason. Ответ содержит массивы ID и результат изменения цены, если она изменилась.
save_categoryname, directionСоздание категории; при изменении/архивировании нужны id/version. Дополнительно archived. Возвращает запись категории с актуальной версией.
save_methodnameСоздание способа оплаты; при изменении/архивировании нужны id/version. Дополнительно archived. Возвращает запись способа с актуальной версией.
save_recurringname, direction, category_id, currency, amount, start_on, recurrence_ruleСоздаёт или изменяет расписание; при изменении обязательны id/version. Дополнительно client_id, recurrence_start, recurrence_exdates, paused, comment. Возвращает id шаблона и массивы затронутых сущностей.
sync_regulartoОбщий запуск регулярных ожиданий. to необязателен, request_id не нужен. Возвращает complete, generated, cursor, synced_until; при незавершённом пакете повторяйте тот же запрос с прежним to до complete=true.

Деньги, предоплата, распределения и возвраты

Фактическая операция фиксирует полученные или потраченные деньги. Обязательство фиксирует сумму, которую ещё предстоит оплатить. Зачёт использует уже полученный аванс и не увеличивает приход повторно. Категорию списания долга выбирайте из context; она требует клиента и распределения на подтверждённый долг.

ПараметрФорматНазначение и ограничения
modeactual | expectedПо умолчанию фактическое движение. expected допускает ровно одну строку source=money денежной категории и создаёт обязательство без денежной операции; сумму берёт из rows[0].amount. Будущий срок передайте как due_at.
rowsarray, 1–30Обязательный массив строк: каждая строка создаёт отдельную операцию. Для разделения оплаты между наличными и картой передайте две строки с разными способами.
rows[].sourcemoney | balancemoney — новые деньги; balance — прежний аванс, только для прихода с клиентом и обязательствами. Смешанный платёж сначала использует старый аванс; излишек новых денег остаётся свободным авансом клиента.
rows[].amount / rows[].method_idstring / integerСумма каждой строки строго положительна. method_id обязателен для money; для зачёта аванса и списания долга денежный способ не используется.
allocationsarrayНеобязательное явное распределение на отдельные обязательства. Обязательства должны быть открыты и совпадать по клиенту, валюте и направлению. Одна цель не должна повторяться в массиве.
allocations[].obligation_id / allocations[].amountinteger / stringСумма распределения положительна и не превышает доступный остаток. Частичная оплата задаёт меньшую сумму, а не новую сумму обязательства. Для расхода на обязательство и списания сумма строк должна совпадать с распределением.
source_operation_idintegerУ allocate выбирает конкретный источник аванса; без него используются доступные источники. У возврата обязателен и указывает исходный действующий приход cash/opening того же клиента и валюты.
booking_id / client_idintegerПри включённых финансах новая клиентская запись из календаря или виджета сразу получает ожидание оплаты по стоимости посещения. После отметки состоявшегося визита неоплаченный остаток становится долгом. При приходе с booking_id цели выбираются по финансовому расчёту посещения автоматически; client_id должен совпадать. Для самостоятельного обязательства используйте allocations. Расход может быть связан с посещением в допустимом контексте клиента.
adjust_booking_pricebooleanВозврат — save_operation с direction=expense, категорией вида refund, исходной оплатой и денежными строками. booking_id ограничивает возврат выбранным посещением. adjust_booking_price=true явно согласует снижение цены оказанной услуги; без этого возврат не означает автоматическое изменение цены.
comment / occurred_atstringКомментарий необязателен. occurred_at — действительная локальная дата операции не позже текущего момента; пропущенное поле означает текущее время.

Отдельные обязательства и цена посещения

Ожидание, его реальная оплата и общая цена посещения — разные действия. Для уменьшения суммы уже частично оплаченного платежа используйте явное изменение обязательства, а для цены посещения — save_booking_price. Сумма не может стать меньше уже закрытой оплатой или списанием.

ПараметрФорматНазначение и ограничения
title / category_id / commentstring / integer / stringНазначение, необязательная денежная категория нужного направления и комментарий. При изменении передавайте сохраняемые текстовые поля явно; пропущенные значения не являются универсальным PATCH.
confirmedbooleanДля отдельного приходного обязательства true означает подтверждённый долг, false — ожидание. Отменить подтверждение можно только в разрешённом неоплаченном состоянии. Расходное обязательство отражает ожидаемый расход.
due_at / occurred_atdate / datetimedue_at — срок оплаты, в том числе будущий. occurred_at — момент изменения условий, не позже текущего. Ручной срок хранится в истории и защищён от автоматического пересчёта расписания.
id / versionintegerПри изменении передайте также исходные direction, currency, client_id и полную новую сумму. Их смена запрещена; версия относится к обязательству, а не к денежной оплате.
booking_idintegersave_obligation для открытого приходного расчёта посещения задаёт срок due_at, а не переписывает цену. При ссылке на посещение нужны его ID, валюта и актуальная версия существующего обязательства. Для цены используется отдельный метод.
amount / price_version / reasonstring / integer / stringУ save_booking_price сумма может быть нулевой; передавайте актуальную price_version из посещения и необязательную причину до 4000 символов. Изменение обновляет общую цену и финансовый расчёт атомарно.
reasonstringУ skip_obligation причина необязательна. Действие предназначено для отдельного неоплаченного ожидания; пропуск не удаляет историю и не отменяет фактические деньги.

Редактирование, замена и удаление операций

Удаление финансовой операции означает отмену с сохранением истории. Не отправляйте DELETE и не создавайте отрицательный платёж. Сначала перечитайте актуальную операцию; учитывайте ограничения minimum_amount, latest_occurred_at, edit_metadata_only и связи, возвращаемые журналом.

ПараметрФорматНазначение и ограничения
category_id / method_id / comment / reasoninteger / integer / string / stringedit_operation принимает допустимые категорию, способ оплаты, комментарий и причину. rows/allocations/replacement в этом методе запрещены; поля клиента, посещения, валюты, направления и источника не меняются.
amount / occurred_atstring / datetimeДействующий приход вида cash/opening, включая оплату услуги с распределениями, можно менять через edit_operation с сохранением ID в пределах minimum_amount, latest_occurred_at и последующих связей. Зачёт, списание, расход или возврат меняют сумму/дату через correct_operation; при закрытом расчёте учитывайте edit_metadata_only.
replacementobjectПолный объект нового save_operation внутри correct_operation: направление, категория, валюта, строки, клиент/посещение и распределения. Прежняя операция получает state=replaced, новые ID возвращаются в operation_ids. Историческая строка остаётся в истории.
cancelbooleancorrect_operation с cancel=true переводит операцию в cancelled и освобождает её распределения в общей транзакции. Необязательная причина до 4000 символов сохраняется в истории.
cancel_dependents / preview_fingerprintboolean / stringДля использованного источника сначала вызовите cancellation_preview. Проверьте operations, releases, price_effects, price_changes; затем отправьте cancel=true, cancel_dependents=true и preview_fingerprint из ответа. Устаревший отпечаток даёт 1385.
id / versionintegerВерсия всегда актуальной операции. Отменённые, заменённые и полностью освобождённые исторические версии доступны для чтения; не используйте их как цель нового редактирования.

Расписания и синхронизация ожиданий

Расписание создаёт обязательства, а не оплачивает их. Сохранение существующего шаблона пересчитывает будущие автоматические ожидания, сохраняя оплаты, пользовательские отмены, удаления и ручные условия. Один период сохраняет ID в журнале и ожидаемых платежах; изменение старого месячного расписания не создаёт второй долг за тот же месяц.

ПараметрФорматНазначение и ограничения
start_on / recurrence_startYYYY-MM-DDПри создании обязательна исходная start_on. При изменении она остаётся прежней, а новую дату первого вхождения передают как recurrence_start. Валюта, направление и клиент существующего шаблона не меняются.
recurrence_rulestringПравило — до 1024 символов. Частоты FREQ=DAILY/WEEKLY/MONTHLY/YEARLY, необязательный INTERVAL, окончание COUNT либо UNTIL. INTERVAL и COUNT — целые от 1 до 99999. BYDAY=MO,TU,... разрешён только с WEEKLY; BYMONTHDAY=1,...,31 — только с MONTHLY. Остальные сочетания отклоняются 1381.
UNTILYYYYMMDD | YYYYMMDDTHHmmss | YYYYMMDDTHHmmssZГраница включительна. С Z это абсолютный момент UTC с учётом зоны организации и DST; без Z — локальное время, а только дата включает весь локальный день. Например, 20261029T180000Z в Токио означает 30 октября 03:00; локальный end_on равен 30 октября.
recurrence_exdatesarray, YYYY-MM-DDМассив максимум из 1000 локальных календарных дат без времени. Исключённые даты не создают ожиданий; изменение правила не переписывает уже защищённые экземпляры.
pausedbooleanПриостановка отменяет будущие автоматические платежи, если по ним не было оплат или ручных изменений. Оплаченные, изменённые и отменённые пользователем платежи сохраняются. При возобновлении подходящие даты восстанавливаются без дублей. Дни строго между приостановкой и возобновлением не начисляются, даже при переносе начала назад; сами граничные дни сохраняются. Даты считаются в часовом поясе организации: выключение и включение в один день не пропускает платёж. Перенос начала назад достраивает остальные допустимые периоды по окончательному правилу.
day_of_month / interval_months / end_oninteger / integer / YYYY-MM-DDСовместимость прежнего месячного контракта без recurrence_rule: день 1–31, интервал 1–120 месяцев, необязательное окончание. Недостающее число переносится на конец месяца. Новые обычные MONTHLY-правила пропускают отсутствующее число; не передавайте оба контракта одновременно.
toYYYY-MM-DDМинимальный горизонт — локальное сегодня плюс 30 дней включительно; более поздний to расширяет его. При отсутствии открытого будущего платежа создаётся ближайший допустимый повтор даже дальше горизонта. Пакет — до 240 вхождений; до завершения повторяйте тот же запрос с прежним to. Ключ периода исключает дубли.
next_payment_onYYYY-MM-DD | nullПоле только для чтения: ближайший непогашенный платёж начиная с локального сегодня. Это не внутренний курсор. Чтение само не материализует ожидания.

Категории и способы оплаты

Управление справочниками использует save_category и save_method, а не общий CRUD. Архивирование и восстановление сохраняют существующие финансовые связи.

ПараметрФорматНазначение и ограничения
id / versionintegerПри создании отсутствуют; при изменении, архивировании и восстановлении передаются из справочника. Для системной записи сохраняется логический системный ID.
name / directionstring / income | expenseИмя обязательно, до 255 символов. У новой категории обязательно направление. Системные названия/смысл и направление существующей категории не переопределяются произвольно.
archivedbooleantrue архивирует, false восстанавливает. Передавайте имя записи и актуальную версию вместе с флагом; это полноценное сохранение.

Подбор оплаты, исторический срез и экспорт

Эти параметры используются только в соответствующих режимах чтения; они не заменяют проверку остатка в транзакции записи.

ПараметрФорматНазначение и ограничения
for_payment / as_ofboolean / datetimeДля obligations/booking_summary режим оплаты добавляет allocation_limit; для client_balance требует клиента и валюту и возвращает available_to_allocate на дату действия.
correction_id / version / for_writeoffinteger / integer / booleanПри подборе новой оплаты вместо существующей передайте ID и версию исправляемой операции; лимиты исключают её прежнее распределение. for_writeoff=true разрешает только подтверждённый долг на дату действия.
for_refund / client_id / currencyboolean / integer / stringУ operations режим for_refund=true требует клиента и валюту; необязательны booking_id/as_of. Возвращает допустимые источники с лимитом на дату возврата; несовместим с include_expected=true, расходным направлением и состоянием кроме posted.
correction_version / booking_idinteger / integerПри подборе источника исправляемого возврата передайте correction_id и correction_version либо version. Клиент, валюта и посещение должны совпадать с исправляемым возвратом.
as_ofdate / datetimeВ отчёте from/to задают период, а as_of — границу исторического расчёта остатков и распределений. Денежный приход, стоимость оказанных услуг, аванс, долг и ожидаемый расход — разные показатели, не взаимозаменяемые суммы.
scopeoperations | reportsoperations экспортирует весь выбранный журнал, включая ожидания при соответствующем флаге; reports — итоги и срезы отчёта. CSV находится в JSON-поле content, кодировка UTF-8, разделитель — точка с запятой. Заголовки, статусы, виды операций и валюты представлены понятными названиями на языке запроса; технические ID и ключи групп не выгружаются. Даты записаны как ДД.ММ.ГГГГ ЧЧ:ММ:СС в часовом поясе организации; у связанных визитов есть отдельная дата. В русской выгрузке десятичный разделитель суммы — запятая, в английской — точка. Для автоматической обработки с идентификаторами используйте обычные JSON-чтения.

Поля ответов

Методы возвращают JSON-конверт. Дополнительные поля зависят от action; не подменяйте ID операции ID обязательства или шаблона.

Поле ответаФорматНазначение и ограничения
ok / databoolean / objectУспех: ok=true, результат внутри data. У save_obligation/save_recurring/edit_operation есть свой data.id; у save_operation фактической оплаты используются массивы ID.
code / messageinteger / stringПри отказе: ok=false, числовой code и локализованный message. Не используйте текст сообщения как стабильный идентификатор ошибки.
operation_ids / obligation_idsinteger[]У POST с ключом запроса — ID созданных/затронутых операций и обязательств. Разделённая оплата возвращает несколько операций. Пустой массив допустим.
request_id / replayedstring / booleanВозвращаются у изменений с ключом запроса. replayed=false означает первое выполнение, true — сохранённый результат успешного повтора.
items / total / page / page_sizearray / integer / integer / integerПостраничные списки используют эти поля. У справочников, истории, расписаний и пакетной сводки посещений основное поле — items; общей пагинации для них нет.
row_type / kind / statestringВ объединённом журнале row_type=operation/obligation. Виды операций: cash/balance/writeoff/opening; состояния операций: posted/cancelled/replaced; обязательств: open/cancelled/skipped.
paid / written_off / remainingstringОплачено деньгами/авансом, списано и ещё осталось. У закрытого обязательства остаток равен нулю; история платежей сохраняется. У одного ожидания одинаковый ID в журнале и списке обязательств.
available / reserved / debt / overduestringСвободный аванс, зарезервированная оплата будущих услуг, подтверждённый долг и его просроченная часть. Значения группируются по валюте; они не являются новым денежным приходом.
complete / generated / cursor / synced_untilboolean / integer / string / dateЗавершённость пакета, число созданных ожиданий, непрозрачный курсор и локальная дата горизонта. cursor — поле ответа: сравнивайте его между незавершёнными пакетами для контроля продвижения; передавать его на вход не требуется. Не вычисляйте из него дату следующего платежа.
filename / mime / contentstringИмя файла, MIME и текст CSV. Файл формируется из data.content; отдельного бинарного ответа нет.

Ошибки финансовых действий

Финансовый диапазон — 1381–1399. Проверки модуля, тарифа и разрешений также могут вернуть коды общего контракта модулей. После конфликта перечитайте актуальные данные, а после сетевого сбоя повторяйте исходный запрос с тем же ключом.

КодОбластьПричина и действие
31API keyAPI-ключ разрешает только чтение. Для POST нужен ключ с правом записи и соответствующие права пользователя.
1367read_onlyДополнительная проверка запрещает изменение ключом «только чтение». Для изменения нужен ключ с правом записи и соответствующие права пользователя.
1381payloadНеверные поля, сумма, валюта, дата, структура или сочетание RRULE. Исправьте входные данные.
1382AuthorizationНедоступный контекст пользователя или попытка подменить организацию. Проверьте авторизацию и организацию текущей сессии или API-ключа.
1383request_idЭтот request_id уже использован с другим телом. Для нового действия нужен новый ключ.
1384idСсылка на недоступного клиента, посещение, справочник или финансовую сущность. Перечитайте ID.
1385versionДанные или отпечаток предварительного просмотра изменились. Перечитайте сущность и повторно проверьте действие.
1386available_to_allocateНе хватает свободного аванса на дату действия. Проверьте доступный остаток.
1387remainingРаспределение превышает остаток или новая сумма ниже закрытой оплаты/списания.
1388client_id / currency / directionНе совпадают клиент, валюта, направление или неизменяемые связи.
1389has_dependentsДействие ограничено связанными оплатами, возвратами или закрытым расчётом. Сначала исправьте зависимости.
1390confirmedПодтверждённый долг нельзя пропустить как необязательное ожидание.
1391source_operation_idНедопустимый источник, сумма или контекст возврата. Повторно подберите источник и проверьте цену.
1392is_systemНельзя произвольно менять системное имя/смысл категории или способа оплаты.
1393POSTИзменение отправлено не методом POST.
1394archivedКатегория или способ архивированы. Выберите действующую запись либо восстановите справочник.
1395completeСначала завершите синхронизацию регулярных ожиданий, затем изменяйте расписание.
1396occurred_atФактическое действие не может быть в будущем. Задайте будущий срок у ожидания.
1397paid / written_offНельзя пропустить оплату посещения или уже частично оплаченный платёж. Явно измените цену/сумму.
1398stateИсторическая версия доступна только для чтения. Откройте актуальную операцию.
1399request_idСохранение не завершилось из-за внутренней ошибки. Безопасно повторите исходное действие с тем же ключом.

Примеры последовательностей

ID условные: клиент 501; категории 101=client_advance, 102=service_payment, 103=rent, 104=client_refund; способы 201=cash, 202=card. Замените их значениями текущей организации из context. ID 1001… и 2001 иллюстрируют результаты сохранений; берите реальные ID из ответов, а версии — из свежего чтения. Для серверных запросов добавьте выбранный заголовок API-ключа; также можно использовать авторизованную сессию кабинета.

1. Приход двумя способами и свободная предоплата

Две денежные строки создают две операции на общую сумму 1000.00. Без посещения и распределений они остаются авансом клиента. У ответа фактической оплаты нет единого data.id.

Запросы и пример ответа
GET /api/?mod=finance&action=context

POST /api/?mod=finance&action=save_operation
Content-Type: application/json

{
	"request_id": "docs-finance-split-01",
	"direction": "income",
	"category_id": 101,
	"client_id": 501,
	"currency": "RUB",
	"rows": [
		{
			"source": "money",
			"amount": "300.00",
			"method_id": 201
		},
		{
			"source": "money",
			"amount": "700.00",
			"method_id": 202
		}
	]
}

{
	"ok": true,
	"data": {
		"operation_ids": [
			1001,
			1002
		],
		"obligation_ids": [],
		"request_id": "docs-finance-split-01",
		"replayed": false
	}
}

2. Отдельное ожидание и частичная оплата

Создано ожидание 1000.00, затем отдельно получено 400.00. В примере новая оплата имеет ID 1003; остаток обязательства — 600.00. Создание ожидания само денег не добавляет.

Запросы и пример ответа
POST /api/?mod=finance&action=save_obligation
Content-Type: application/json

{
	"request_id": "docs-finance-obligation-01",
	"direction": "income",
	"title": "Оплата дополнительной услуги",
	"category_id": 102,
	"client_id": 501,
	"currency": "RUB",
	"amount": "1000.00"
}

{
	"ok": true,
	"data": {
		"id": 2001,
		"operation_ids": [],
		"obligation_ids": [
			2001
		],
		"request_id": "docs-finance-obligation-01",
		"replayed": false
	}
}

POST /api/?mod=finance&action=save_operation
Content-Type: application/json

{
	"request_id": "docs-finance-partial-01",
	"direction": "income",
	"category_id": 102,
	"client_id": 501,
	"currency": "RUB",
	"rows": [
		{
			"source": "money",
			"amount": "400.00",
			"method_id": 201
		}
	],
	"allocations": [
		{
			"obligation_id": 2001,
			"amount": "400.00"
		}
	]
}

3. Зачёт прежнего аванса без нового прихода

После проверки доступного аванса и лимита обязательства направьте 100.00 из исходной операции 1001 на обязательство 2001. Это отдельная операция вида balance; остаток становится 500.00, денежный приход не увеличивается.

Запросы и пример ответа
GET /api/?mod=finance&action=client_balance&client_id=501&currency=RUB&for_payment=true

GET /api/?mod=finance&action=obligations&client_id=501&currency=RUB&outstanding_only=true&for_payment=true

POST /api/?mod=finance&action=allocate
Content-Type: application/json

{
	"request_id": "docs-finance-allocate-01",
	"client_id": 501,
	"currency": "RUB",
	"source_operation_id": 1001,
	"allocations": [
		{
			"obligation_id": 2001,
			"amount": "100.00"
		}
	]
}

4. Изменение свободного источника, возврат и отмена оплаты

У ещё не использованной операции 1002 увеличена сумма с 700.00 до 800.00; затем из неё возвращено 200.00. Отдельный запрос отменяет частичную оплату 1003 из примера 2. Для использованного источника с зависимостями сначала требуется cancellation_preview и согласование каскада.

Запросы и пример ответа
POST /api/?mod=finance&action=edit_operation
Content-Type: application/json

{
	"request_id": "docs-finance-edit-01",
	"id": 1002,
	"version": 1,
	"currency": "RUB",
	"amount": "800.00",
	"category_id": 101,
	"method_id": 202
}

POST /api/?mod=finance&action=save_operation
Content-Type: application/json

{
	"request_id": "docs-finance-refund-01",
	"direction": "expense",
	"category_id": 104,
	"client_id": 501,
	"source_operation_id": 1002,
	"currency": "RUB",
	"rows": [
		{
			"source": "money",
			"amount": "200.00",
			"method_id": 202
		}
	]
}

POST /api/?mod=finance&action=correct_operation
Content-Type: application/json

{
	"request_id": "docs-finance-cancel-01",
	"id": 1003,
	"version": 1,
	"cancel": true,
	"reason": "Ошибочно зарегистрированная оплата"
}

5. Расписание расходов, журнал и выгрузка

Создаётся три месячных ожидания по 10000.00. Если complete=false, повторяют тот же запрос синхронизации с прежним to. Чтения показывают ожидания и отчёт; выгрузка возвращает CSV внутри JSON. Фактический расход появится только после отдельной оплаты.

Запросы и пример ответа
POST /api/?mod=finance&action=save_recurring
Content-Type: application/json

{
	"request_id": "docs-finance-recurring-01",
	"name": "Аренда помещения",
	"direction": "expense",
	"category_id": 103,
	"currency": "RUB",
	"amount": "10000.00",
	"start_on": "2026-11-01",
	"recurrence_rule": "FREQ=MONTHLY;INTERVAL=1;BYMONTHDAY=1;COUNT=3",
	"recurrence_exdates": [],
	"paused": false
}

POST /api/?mod=finance&action=sync_regular
Content-Type: application/json

{
	"to": "2027-01-31"
}

GET /api/?mod=finance&action=recurring

GET /api/?mod=finance&action=obligations&direction=expense&outstanding_only=true&from=2026-11-01&to=2027-01-31

GET /api/?mod=finance&action=reports&from=2026-11-01&to=2027-01-31

GET /api/?mod=finance&action=export&scope=operations&include_expected=true&from=2026-11-01&to=2027-01-31

Исходящие финансовые события

Доступ через API-ключи и исходящая доставка — разные возможности. Финансовые события finance_operation, finance_obligation, finance_recurring, finance_category, finance_method доставляются по общим настройкам веб-хуков организации и правилам тарифа. Они содержат причину cause, изменённые поля и снимки before/after; обработчик должен учитывать повторные доставки и порядок событий. Наличие события не означает успешную HTTP-доставку.

Формат и доставка веб-хуков