# ИИ-сканер чеков для учёта расходов: сценарий с Claude и Codex

*2026-09-01*

На чеке из кафе — `$27.82`, операция по карте всё ещё «в обработке», а бумага рядом с ноутбуком уже начинает сворачиваться. Отложите чек на неделю — и вспомнить название заведения, чаевые и нужную категорию будет заметно сложнее.

Claude или Codex могут превратить фотографию в черновик операции, пока чек ещё перед вами. Агент считывает видимые данные, сверяет будущую операцию со счетами, категориями и недавними строками журнала, а затем показывает точный запрос на запись. До вашего подтверждения журнал не изменится.

Сразу обозначим, где заканчиваются возможности продукта. **В Expense Budget Tracker нет встроенной камеры или сканера чеков, и он не хранит изображение чека.** Предоставленное вами изображение распознаёт Claude, Codex или провайдер модели в выбранной конфигурации. Трекер хранит только подтверждённые структурированные данные журнала.

Возможность считывать изображения зависит от выбранной конфигурации ИИ. [Anthropic указывает, что Claude умеет обрабатывать и анализировать визуальные данные](https://platform.claude.com/docs/en/intro), а [OpenAI Responses API принимает текст, изображения и файлы](https://developers.openai.com/api/reference/cli/resources/responses/methods/create). Но это ещё не значит, что любой клиент Claude или Codex автоматически откроет локальную фотографию. Клиент должен поддерживать вложения или получить доступ к файлу по указанному пути — с вашего разрешения. Распознавание изображений помогает, но числа всё равно должен проверить человек.

![Claude или Codex превращают фотографию чека в предварительный просмотр операции, которую можно проверить перед записью](/blog/ai-receipt-scanner-expense-tracker.png)

## Как «сканер» работает в этом сценарии

Здесь речь о переносе данных из чека в журнал с помощью ИИ, а не о встроенной функции камеры.

Модель работает с предоставленным изображением, а Expense Budget Tracker — только с подтверждёнными данными журнала.

| Этап | Что происходит |
|---|---|
| Получение изображения | Вы фотографируете чек или сохраняете скан там, откуда Claude или Codex сможет его открыть. |
| Распознавание | Модель считывает видимые поля: продавца, дату, промежуточную сумму, скидку, налог, чаевые, итог, валюту и признаки способа оплаты. Всё, в чём она не уверена, помечается отдельно. |
| Проверка журнала | Агент проверяет выбранное рабочее пространство Expense Budget Tracker, актуальную схему, счета, категории и возможные дубликаты. |
| Предварительный просмотр | Агент показывает извлечённые факты, сомнительные места, выбранную категорию и точный запрос на запись. |
| Подтверждение | Вы подтверждаете именно этот запрос либо вносите исправления и просите подготовить новый предварительный просмотр. |
| Проверка результата | Агент записывает одну структурированную операцию и снова запрашивает её из журнала. |
| Сверка | Когда операция по карте или банковскому счёту окончательно проводится, вы сопоставляете её с записью из чека, а не импортируете второй экземпляр. |

Без последнего этапа **ИИ-сканер чеков для учёта расходов** не даст журнала, которому можно доверять. Правильно считать `$27.82` — лишь начало. У операции также должны быть верные рабочее пространство, счёт, знак суммы, валюта и категория, а возможные дубликаты нужно проверить отдельно.

Если вам нужно приложение со встроенной камерой, папкой входящих чеков и хранением вложений, это не тот продукт. Expense Budget Tracker предназначен для структурированных финансовых данных. Изображения чеков, которые нужно сохранить, остаются в вашей обычной файловой системе, архиве документов или другом сервисе.

## Подключение через прямой Agent API или удалённый MCP-коннектор

Expense Budget Tracker поддерживает два способа подключения. Оба дают доступ к финансовым данным одного типа, но используют разные учётные данные и по-разному работают в клиенте.

### Прямой Agent API для Claude Code, Codex и агентов с поддержкой HTTP

Прямое подключение начинается с этого адреса:

```text
https://api.expense-budget-tracker.com/v1/
```

Агент вызывает `GET /v1/`, следует инструкциям из ответа, подключается по коду из письма и сохраняет полученный `ApiKey` с длительным сроком действия вне памяти чата. Затем он вызывает `/v1/me`, получает список рабочих пространств и выбирает нужное, проверяет `/v1/schema`, читает данные через `/v1/sql/query` и отправляет один подтверждённый запрос на изменение через `/v1/sql/execute`.

Этот способ подходит, если Claude Code или Codex уже умеет открывать файл чека на вашем компьютере и выполнять HTTP-запросы. [Руководство по настройке ИИ-агента](/ru/docs/agent-setup/) описывает последовательность подключения, а [справочник API](/ru/docs/api/) — текущий контракт чтения и записи. Подробный сценарий работы с Claude Code в терминале разобран в статье [«Как учитывать расходы и вести бюджет с помощью Claude Code»](/ru/blog/how-to-track-expenses-and-manage-your-budget-with-claude-code/).

### Удалённый MCP с OAuth в браузере

Клиент с поддержкой MCP может вместо этого подключиться по адресу:

```text
https://mcp.expense-budget-tracker.com/mcp
```

Здесь авторизация проходит в браузере через OAuth. Подключение использует токены доступа и обновления MCP, а не `ApiKey` из Agent API. Для чтения служат такие инструменты, как `list_workspaces`, `get_schema` и `sql_query`; для записи нужны отдельная область доступа `expenses:write` и инструмент `sql_execute`.

Удалённый коннектор не получает доступ к фотографиям на вашем компьютере. Клиенту или модели всё равно нужно передать чек через поддерживаемое вложение или файловый механизм. Процесс OAuth и области доступа описаны в [руководстве по MCP-коннектору](/ru/docs/mcp-connector/).

Какой бы способ вы ни выбрали, порядок один: сначала распознавание чека, затем проверка журнала, потом предварительный просмотр и только в конце отдельное подтверждение записи.

## Полный процесс для одного небольшого чека

Возьмём чёткую фотографию такого вымышленного чека из ресторана:

| Поле на чеке | Видимое значение |
|---|---|
| Продавец | North Street Cafe, New York |
| Дата и время | 31 августа 2026 года, 12:17 |
| Промежуточная сумма за еду | `$24.00` |
| Скидка | `-$2.00` |
| Налог | `$1.82` |
| Чаевые | `$4.00` |
| Итоговая сумма | `$27.82` |
| Подсказка о способе оплаты | Visa с последними цифрами `4242` |

Арифметика сходится: `$24.00 - $2.00 + $1.82 + $4.00 = $27.82`. Такая проверка полезна, но не доказывает, какой счёт и какую категорию нужно выбрать. Агенту по-прежнему нужен журнал.

### 1. Сначала подтвердите, куда пойдёт запись

Попросите агента определить и показать:

- контекст аккаунта, в который выполнен вход
- точное название и ID рабочего пространства
- целевой счёт в журнале и его валюту
- дату чека и часовой пояс
- валюту чека

Для этого примера предположим, что пользователь подтвердил рабочее пространство `Personal` с ID `workspace-personal-example`, счёт `a-visa_4242-usd`, валюту `USD` и местное время Нью-Йорка для чека. Это вымышленные значения, а не встроенные названия рабочих пространств, счетов или категорий. Последние четыре цифры карты — подсказка, но не разрешение молча выбрать счёт. Если две сохранённые карты заканчиваются на `4242`, агент должен остановиться и спросить, какой картой оплатили покупку.

### 2. Проверьте актуальную схему

Агент должен вызвать:

```text
GET https://api.expense-budget-tracker.com/v1/schema
```

Ответ со схемой — источник истины: в нём перечислены доступные сейчас таблицы, столбцы, ограничения и правила записи. Примеры в статье могут устареть; перед генерацией SQL агент должен опираться на `/v1/schema`. В текущей схеме журнала оператор `INSERT` обязан явно содержать подтверждённый `workspace_id`. Выбор рабочего пространства для API-ключа задаёт контекст запроса, но не убирает этот столбец из добавляемой строки.

### 3. Разделяйте факты, подсказки и сомнения

Хороший отчёт о распознавании выглядит так:

| Поле | Извлечённое значение | Уверенность или проблема |
|---|---|---|
| Продавец | North Street Cafe | Чётко видно |
| Время операции | `2026-08-31 12:17` по местному времени | Чётко видно; пользователь подтвердил часовой пояс Нью-Йорка |
| Валюта | USD | Знак `$`, местоположение и валюта счёта подтверждены пользователем |
| Промежуточная сумма | `24.00` | Чётко видно |
| Скидка | `-2.00` | Чётко видно |
| Налог | `1.82` | Чётко видно |
| Чаевые | `4.00` | Чётко видно |
| Оплачено | `27.82` | Чётко видно, арифметика сходится |
| Способ оплаты | Visa с последними цифрами `4242` | Подсказка сопоставлена со счётом, который подтвердил пользователь |

Не превращайте сомнительный текст в уверенно заполненное поле. Если последняя цифра итоговой суммы может быть `2` или `7`, правильный ответ — «итоговая сумма неразборчива; нужна другая фотография или ручное подтверждение», а не правдоподобная догадка.

### 4. Выберите одну операцию или разбивку по категориям

Весь чек относится к расходам в ресторане, поэтому одна строка журнала с категорией `Dining Out` будет уместна, если в рабочем пространстве уже есть категория с точно таким названием. Налог, скидка и чаевые объясняют итоговую сумму; в обычном личном бюджете выносить их в отдельные строки не нужно.

Чек из продуктового магазина, в котором есть еда, лекарства и кухонный прибор, иногда стоит разбить по категориям. В текущей модели журнала для этого создаётся несколько строк с одним `event_id`, обычно на одном счёте. Каждая строка получает свою категорию и сумму с соответствующим знаком, а сумма всех строк должна точно совпадать с исходным платежом: `-27.82` для расхода в `$27.82`.

Предварительный просмотр должен объяснять, как между категориями распределены общие для чека налог, скидки, сборы за обслуживание и округление. Для одного чека подойдёт пропорциональное распределение, а для другого — отнесение скидки к конкретному товару, если эта связь очевидна. Универсального правила нет. Если разбивка получится произвольной, оставьте одну строку в более широкой существующей категории или спросите пользователя.

Агент должен сначала запросить существующие категории журнала, а не изобретать новую, пусть даже с более аккуратным названием:

```sql
SELECT category, COUNT(*) AS use_count
FROM ledger_entries
WHERE kind = 'spend'
  AND category IS NOT NULL
GROUP BY category
ORDER BY use_count DESC
LIMIT 100
```

### 5. Проверьте возможные совпадения и покажите кандидатов, а не вердикт

Перед составлением `INSERT` запросите операции по подтверждённому счёту за небольшой период вокруг даты чека. Для примера выше поиск дубликатов может выглядеть так:

```sql
SELECT entry_id, event_id, ts, account_id, amount, currency, category, counterparty, note, external_id
FROM ledger_entries
WHERE event_id = 'receipt-2026-08-31-north-street-cafe-2782'
   OR (
     account_id = 'a-visa_4242-usd'
     AND currency = 'USD'
     AND ts >= '2026-08-29 00:00:00-04'
     AND ts < '2026-09-03 00:00:00-04'
     AND amount = -27.82
   )
ORDER BY ts
LIMIT 100
```

Агент отправляет этот оператор в `POST /v1/sql/query`. Здесь `event_id` — значение, которое агент создал для этого события; при разбивке оно будет одинаковым во всех связанных строках. Поле группирует строки и позволяет искать конкретные события, но база данных не считает его уникальным ключом для защиты от дубликатов. Точное совпадение `event_id` — веский повод разобраться, а не разрешение удалить или перезаписать что-либо.

Запись на такую же сумму с похожим названием продавца примерно в то же время — тоже лишь кандидат в дубликаты. Два реальных платежа в кафе могут совпасть по сумме, а незавершённая карточная операция иногда окончательно проводится с другим названием продавца или временем.

Если найдено вероятное совпадение, предварительный просмотр должен показать его рядом с извлечёнными данными чека и не предлагать `INSERT`, пока пользователь не решит, как его обработать.

### 6. Покажите точную строку и точный запрос на запись

Предположим, что запрос не нашёл кандидатов в дубликаты, а `Dining Out` уже существует. Теперь можно показать конкретный предварительный просмотр — пока без записи:

| Поле журнала | Предлагаемое значение |
|---|---|
| Рабочее пространство | `Personal` (`workspace-personal-example`) |
| Счёт | `a-visa_4242-usd` |
| Время | `2026-08-31 12:17:00-04` |
| Сумма | `-27.82` |
| Валюта | `USD` |
| Тип | `spend` |
| Категория | `Dining Out` |
| Контрагент | `North Street Cafe` |
| Примечание | `Receipt subtotal 24.00; discount -2.00; tax 1.82; tip 4.00` |
| Кандидаты в дубликаты | В выбранном окне не найдены |

В предварительном просмотре также должен быть точный SQL, который агент намерен отправить:

```sql
INSERT INTO ledger_entries (
  event_id,
  ts,
  account_id,
  amount,
  currency,
  kind,
  category,
  counterparty,
  note,
  workspace_id
)
VALUES (
  'receipt-2026-08-31-north-street-cafe-2782',
  '2026-08-31 12:17:00-04',
  'a-visa_4242-usd',
  -27.82,
  'USD',
  'spend',
  'Dining Out',
  'North Street Cafe',
  'Receipt subtotal 24.00; discount -2.00; tax 1.82; tip 4.00',
  'workspace-personal-example'
)
```

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

### 7. Выполните только подтверждённый запрос, затем снова прочитайте строку

После подтверждения прямой Agent API отправляет точный оператор по адресу:

```text
POST https://api.expense-budget-tracker.com/v1/sql/execute
```

Затем агент проверяет его через `/v1/sql/query`:

```sql
SELECT entry_id, event_id, ts, account_id, amount, currency, kind, category, counterparty, note, workspace_id
FROM ledger_entries
WHERE event_id = 'receipt-2026-08-31-north-street-cafe-2782'
LIMIT 100
```

Контрольный запрос должен вернуть ровно одну строку, совпадающую с подтверждённым предварительным просмотром. Успешный HTTP-ответ без такого сравнения — ещё не полная проверка.

### 8. Сверьте запись, когда платёж по карте будет проведён

Чек фиксирует то, что произошло у кассы. Проведённая карточная операция подтверждает, какая сумма в итоге списана со счёта. Когда она появится в очередной выгрузке по карте, ищите по тому же счёту, сумме, диапазону дат, признакам продавца и любому стабильному ID источника. Если данные указывают на уже записанную по чеку операцию, исключите строку выписки из импорта, а не создавайте вторую строку журнала.

Если проведённая сумма отличается, не создавайте компенсирующую запись. Разберитесь, правильно ли считан итог чека, не изменились ли чаевые, не превратилось ли временное удержание в окончательное списание и не изменилась ли сумма из-за конвертации валюты. Подготовьте одно видимое исправление и запросите для него отдельное подтверждение.

Для больших пакетов [руководство по импорту банковских выписок](/ru/blog/how-to-import-bank-statements-into-an-expense-tracker/) объясняет, как работать с пересекающимися периодами и переводами. [Руководство по сверке бюджета](/ru/blog/how-to-reconcile-your-budget-with-your-bank-balance/) показывает, как сопоставить проведённые операции по счёту с надёжно установленным остатком.

## Где распознавание чеков становится сложным

Фотографии чеков — сложные исходные данные. Надёжный ИИ-сканер чеков на базе Claude или Codex должен выносить такие случаи на проверку, а не делать вид, что всё распознано однозначно.

| Сложный случай | Безопасный подход |
|---|---|
| Размытая, тёмная, сложенная или обрезанная фотография | Пометьте неразборчивые поля, запросите новое изображение или значение вручную и ничего не записывайте, пока остаются сомнения в итоговой сумме, дате или валюте. |
| Промежуточная сумма и итог | Пересчитайте видимые составляющие и используйте фактически оплаченную итоговую сумму. Проверьте, включён ли налог или добавлен отдельно и не входит ли сбор за обслуживание в итог. |
| Чаевые | Различайте напечатанные рекомендуемые чаевые, чаевые, вписанные от руки, сумму авторизации по карте и окончательный итог. Позже сравните итог с проведённой суммой по карте. |
| Скидки и купоны | Сохраняйте окончательную оплаченную сумму. При разбивке по категориям покажите, как распределена скидка, а не назначайте её молча. |
| Возвраты и возмещения | Считайте чек на возврат подтверждением ожидаемого или уже выполненного возврата денег, а не обычным доходом. Записывайте возврат как отдельную структурированную операцию на счёт поступления, только когда его статус и сумма ясны, а после проведения сверяйте запись. |
| Чек с несколькими категориями | Назначьте связанным строкам один `event_id`; покажите каждую сумму по категории с соответствующим знаком, правило распределения, решение по округлению и итог. Сумма строк должна совпадать с окончательной оплаченной суммой. |
| Наличные или карта | Используйте счёт, с которого фактически прошла оплата. Логотип продавца или электронного кошелька на фотографии не доказывает способ оплаты; если строка со способом оплаты отсутствует, спросите пользователя. |
| Иностранная валюта | Явно сохраняйте валюту чека. Если карточный счёт открыт в другой валюте, не придумывайте курс или сумму списания; дождитесь проведённой операции или получите точную подтверждённую сумму. |
| Кандидаты в дубликаты | Сравните дату, сумму со знаком, счёт, валюту, продавца и любой стабильный идентификатор источника. Покажите кандидатов для принятия решения, а не пропускайте или добавляйте их молча. |

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

## Универсальная инструкция для Claude или Codex

Вставьте этот текст после подключения агента, а затем замените значения в квадратных скобках. Пока вы осваиваете процесс, лучше разбирать по одному чеку.

```text
Используй изображение чека по адресу [точный путь к файлу или вложение] вместе с Expense Budget Tracker.
Для прямого API начни с https://api.expense-budget-tracker.com/v1/ и следуй
инструкциям из ответа. Используй сохранённый ApiKey вне памяти чата. Если подключение
идёт через MCP, используй MCP-инструменты для рабочих пространств, схемы и запросов,
сохраняя описанный ниже порядок подтверждения.

Пока не записывай данные. При работе с прямым API покажи контекст моего аккаунта из /me.
Выведи список доступных рабочих пространств и попроси меня подтвердить нужное.
Проверь /v1/schema (или вызови get_schema). Запроси доступные счета и попроси меня подтвердить
точный счёт и его валюту. Не выбирай счёт только по последним четырём цифрам карты.

Прочитай изображение и извлеки продавца, дату и время чека, валюту, промежуточную сумму,
налог, чаевые, сбор за обслуживание, скидки, возвраты, итоговую сумму и признаки способа
оплаты. Отметь все размытые, обрезанные, неоднозначные или арифметически противоречивые
данные. Никогда не выдумывай недостающее значение. Сообщи, достаточно ли одной строки журнала
или нужна разбивка по категориям, и запроси мои существующие категории, прежде чем предлагать
названия. Для разбивки используй один event_id во всех связанных строках и докажи, что
сумма всех строк с учётом знака совпадает с итоговой суммой.

С помощью запросов только для чтения проверь возможные совпадения в журнале по подтверждённому
счёту и диапазону дат. Покажи кандидатов в дубликаты вместе с основаниями; не считай
совпадение даты и суммы ни доказательством дубликата, ни доказательством новой покупки.

Затем покажи предварительный просмотр без записи: подтверждённое рабочее пространство,
точный счёт, сумму со знаком, точную валюту, время, тип, существующую категорию, контрагента,
примечание, суммы всех строк разбивки, если она нужна, и кандидатов в дубликаты. Покажи
точный SQL-запрос на запись, включи подтверждённый workspace_id в каждый INSERT и укажи
ожидаемое число затронутых строк. Не создавай компенсирующие записи, конвертации на основе
догадок или дополнительные строки.

Остановись и дождись моего отдельного явного подтверждения именно этого запроса на запись.
После подтверждения отправь только одобренный оператор через /v1/sql/execute (или sql_execute).
Снова запроси строку через /v1/sql/query (или sql_query) и сравни каждое сохранённое поле с
подтверждённым предварительным просмотром. Сообщи о любом несовпадении, не изменяя больше
никаких данных. Позже помоги мне сопоставить эту запись из чека с проведённой банковской
или карточной операцией, не создавая дубликат.
```

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

## Где проходят границы данных

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

| Граница | Какие данные задействованы |
|---|---|
| Ваше устройство или клиент | Изначально чек хранится как фотография или файл. Клиент получает только тот доступ к файлу, который вы ему предоставили. |
| Claude, Codex и выбранный провайдер модели | Содержимое чека и ваши инструкции обрабатываются согласно условиям и настройкам провайдера и клиента. Проверьте эти условия для своей конфигурации: Expense Budget Tracker не может давать гарантии конфиденциальности от имени Anthropic или OpenAI. |
| Прямой Agent API или MCP-коннектор | Агент отправляет только необходимые для задачи запросы к рабочему пространству и схеме, выборки из журнала и подтверждённые структурированные записи. Ни одному из подключений трекера изображение чека не требуется. |
| Хранилище Expense Budget Tracker | В этом процессе трекер хранит подтверждённые структурированные финансовые данные: сумму, валюту, счёт, категорию, контрагента и примечание. Изображение чека он не хранит. |
| Ваш архив чеков | Если исходное изображение понадобится для возврата, гарантии, возмещения или отчётности, вы храните его отдельно в выбранном месте. |

Такой подход может подойти, если вам нужно [приложение для бюджета без подключения к банку](/ru/blog/budget-app-without-bank-linking/): для работы с чеками не требуется постоянная синхронизация с банком, а каждое предлагаемое изменение журнала остаётся видимым. При этом вы всё равно выбираете провайдера ИИ, предоставляете доступ к файлу и отправляете выбранные финансовые запросы на чтение и запись через подключение трекера.

## Подходит ли вам такое сканирование чеков

Если под «приложением для бюджета со сканированием чеков» вы понимаете встроенную камеру телефона, папку входящих и сохранённые вложения, выберите продукт, созданный для этой задачи. Этот процесс нужен, когда вы хотите сканировать чеки с помощью ИИ, но видеть каждую операцию до внесения в журнал, а исходное изображение хранить отдельно.

Используйте этот процесс, если вам нужны:

- добавление чеков без подключения банковского счёта
- Claude или Codex для распознавания изображения и проверки журнала
- выбор счёта и категории с опорой на существующие данные
- точный предварительный просмотр перед каждой записью
- кандидаты в дубликаты вместо скрытых предположений
- проверенная структурированная операция, которую позднее можно сверить

Expense Budget Tracker не пытается заменить архив чеков с возможностью поиска.

Начните с одного чёткого чека, одного подтверждённого счёта и одной знакомой категории. Проверьте арифметику, подтвердите одну точную строку, снова запросите её из журнала и сопоставьте с операцией, когда та будет проведена. Этот короткий цикл оставляет понятный след изменений, к которому можно вернуться позже.

---
*[Открыть HTML-версию этой страницы](https://expense-budget-tracker.com/ru/blog/ai-receipt-scanner-expense-tracker/)*

*Удаленные MCP-клиенты с поддержкой OAuth могут подключиться к `https://mcp.expense-budget-tracker.com/mcp` с доступом OAuth Bearer. Обязательное разрешение — `expenses:read`. Клиент также может запросить необязательное разрешение `expenses:write`: оно отображается на экране согласия OAuth и требуется для изменения данных.*

*Агенты командной строки и прямых HTTP-запросов могут использовать отдельный Agent API, начав с `GET https://api.expense-budget-tracker.com/v1/` и следуя ответу сервиса обнаружения, чтобы получить ApiKey.*

*Подсказка: добавьте `.md` к любому URL этого сайта, чтобы получить чистую Markdown-версию страницы.*