Invoices

Bulk-create paid invoices from the incoming credits of a bank statement

The revenue counterpart of /expenses/import: takes the same kind of file (CSV/Excel or ISO-20022 CAMT XML) and turns incoming credits into invoices. Credits are first matched against the user's unpaid invoices — a match records the payment and marks that invoice paid instead of creating a new one. Only the leftovers can become invoices, and they must survive: an exact re-import fingerprint check (importRef), a deterministic filter that rejects cash deposits, card refunds and transfers between the user's own accounts, two amount/date/payer duplicate checks against existing payments and earlier auto-created invoices, and finally a conservative Claude gate that must find positive evidence of a customer paying for goods or services. Payouts from card acquirers (SumUp, TWINT, Adyen…) and from app stores, marketplaces and payout platforms (Google Payment Corp, Apple, Shopify, Amazon, Stripe, PayPal, Etsy, Uber, Booking.com…) become one invoice per payout — that money is the business's own sales, settled in batches. Anything the model is unsure about is returned under unclassified for review and is never created. Rows under unclassified and nonInvoiceable carry a payload in details that can be posted to /invoices/from-credit to create the invoice anyway. Created invoices are stored paid, with the received amount recorded as a payment on the transaction date and VAT stored inclusive so the invoice total equals the money received.

post/invoices/import

Request

Request body multipart/form-data

dryRunstring

Set to true to run the full pipeline (parse, match, classify, AI) and report what would happen without writing anything.

filestring binary required

CSV/Excel bank statement, or an ISO-20022 CAMT XML statement.

localestring

Locale hint for AI text (e.g. en, de, fr). Defaults to the user's profile locale.

markPaidstring

Set to false to record payments on matched invoices without flipping isPaid. Defaults to true.

Response

Statement processed; returns what was matched, created, skipped as duplicate, rejected, and left for review.

Changes

No recorded changes to this operation across all 5 revisions of this API.