All notable changes to the QUiCK Public API (/1/ and /2/ endpoints) are
documented here.
PATCH /2/expenses/{id}/update/ and PATCH /2/incomes/{id}/update/ now
keep the automatically generated payment in line with the record after
every update, the same way as QUiCK itself does. Previously these
endpoints saved payment_method without touching the payments: an
invoice switched to cash stayed unpaid, and one switched back to transfer
kept its old automatic payment.cash and card create the automatic payment, or update it to the
current amount, account and date; transfer and cod remove it. A
card payment needs paid_through. A cash payment is always booked to
the company's cash account (Házipénztár) in the invoice's currency, which
replaces any paid_through sent with it.payment_method changes: an
update of any field adds a missing automatic payment, and a change of the
amount is carried over to the payment. Incomes synced from Számlázz or
Billingo are the exception, see below.card payment without paid_through is
booked to the company's bank account.fulfilled_at, so an income
without it gets none. A cancelled, storno or zero-amount income has all
of its payments, user-recorded ones included, replaced by a single
zero-amount payment on every update -- previously only when
is_cancelled changed.payment_method, paid_through or exchange_rate changes, and it is
recorded without an account, the same way as the sync records it. Any
other update, such as setting tags, leaves their payments alone.POST /2/incomes/create/, POST /2/partners/create/
and PATCH /2/partners/{partnerId}/update/ now carry an error_code
field next to _error. It is a stable machine identifier that is never
translated and does not change with ?lang=, so it is the field to
branch on -- _error is human-facing text. The duplicate and conflict
cases read duplicate_invoice_number and partner_conflict, which is
what tells a retry apart from a malformed request; ordinary validation
failures read invalid. The rest of the body is unchanged, so this is
additive.POST /2/incomes/create/ creates an income as an accounting document
(income_type=2) in a single call -- the header, at least one revenue
categorization, optional invoice line items and an optional invoice
image, all created together in one transaction. Use this to bring in
invoices issued through a system of your own -- for example under a
foreign entity -- that don't go through an accounting-software or NAV
sync.exchange_rate defaults to 1 and exchange_date is optional, so an
income in the company's default currency needs neither. For any other
currency the actual rate is required.400.invoice_number that already exists for the company returns
400 with the existing record's id in existing_income_id, so a
retried request can tell whether it already went through.PATCH /2/incomes/{id}/update/.POST /2/incomes/create/ also accepts a storno: send invoice_type 1
with the cancelled document's number in referred_invoice_number. The
referred accounting document is set to cancelled and its payments are
replaced by a single zero-amount payment. Only accounting documents are
matched -- a storno sent here never cancels an invoice synced from
invoicing software or NAV. If the storno arrives first, it is accepted
and nothing is cancelled; the original sent later is not cancelled
retroactively, so send it with is_cancelled: true or set that
afterwards. referred_invoice_number now takes up to 64 characters
(previously 32).PATCH /2/incomes/{id}/update/ accepts is_cancelled on accounting
documents that are not processed yet. Changing it recalculates the
document's payments: a cancelled document gets a single zero-amount
payment.POST /2/partners/create/ and PATCH /2/partners/{partnerId}/update/
endpoints create and update partners (customers and/or vendors). At least
one of is_customer/is_vendor must be true.400 naming the colliding partner's id,
rather than being merged into it.default_account_number,
default_account_name, is_customer and is_vendor through
PATCH /2/partners/{partnerId}/update/; sending any other field is
rejected with a 400 naming the offending fields.tax_number is normalised before saving, the same way as in QUiCK:
dashes are removed from a Hungarian tax number, so 12345678-1-23 is
stored and returned as 12345678123. Empty strings are rejected on
every text field; send null to clear one.GET /2/currencies/ returns the currency catalogue: the id -> ISO code
pairs behind every currency field in expense, income and payment
payloads. Previously those ids could not be resolved through the API at
all, so integrations had to hard-code a mapping./1/ endpoints that have a verified /2/ replacement (expenses
list/detail, taxes create/update/delete/list, salaries
create/update/delete/list) are now marked deprecated in the OpenAPI
schema, pointing at their /2/ replacement.expense-types and
revenue-types folded into Expenses/Incomes, ledger numbers /
VAT categories / audit XML folded into Accounting) -- if you
generate an SDK or navigate the docs by tag, section names changed.description/summary/help text) is now
served bilingually: Hungarian by default, ?lang=en for English.
operationIds, tag names, and schema/property names are unaffected --
still plain English identifiers.POST /2/expenses/create/ now validates that uploaded content actually
matches a supported file type, regardless of the declared filename
extension -- content that isn't a real PDF/JPEG/PNG/XML now returns
400 instead of being silently accepted.PATCH /2/company-info/update/{company_id}/ accepts a new
income_policies field, and GET /2/company-info/ (and the update
response) now returns it -- previously only editable as raw JSON in
Django admin.
revenue_type/ledger_number/
tag -- the engine legitimately auto-creates those."v": 2 key: policies (the rule
engine that auto-assigns revenue_type, job_number,
ledger_number, tag and split rules to incoming invoices) and
ignore_policies (import-skip rules).null deletes the existing configuration.GET /2/expenses supports filtering by custom field text search and by
amount range.403 if the company
requires two-factor authentication and the authenticated user hasn't
enabled it.GET /2/expenses supports filtering by updated_since.
date_field=created_at with from_date.2026-07-01T12:00:00Z or
2026-07-01T12:00:00+02:00); a value without a timezone is
interpreted as UTC.+ in a +HH:MM offset (%2B) -- otherwise it
decodes as a space in the query string and the request fails with an
invalid date format error.400, at which
point a full resync is required (query without updated_since).ledger_number being unexpectedly editable on checked or
integration-synced expenses; it is now frozen as intended.GET /2/expenses and GET /2/expenses/{expense_id}/ now include the
id on the ledger_number, vat_ledger_number, and
company_vat_category reference objects (previously name/code only),
matching the income detail output -- lets you reliably identify the
referenced record even when code is null or name isn't unique.PATCH /2/incomes/{income_id}/update/ gained new accounting fields:
accounting_id (str, nullable) -- external accounting reference;
submit null or an empty string to clear it. Editable only when
enable_accounting_id is on for the company and the income hasn't
been booked yet.vat_period_type (nullable: monthly, quarterly, yearly)vat_period_started_at (date, nullable) -- any date is accepted and
rounded down to the start of its period (e.g. 2026-02-15 +
quarterly -> 2026-01-01)vat_period_type and vat_period_started_at must be submitted
together (both or neither), otherwise the endpoint errors;
submitting both as null clears the VAT period. Editable only when
enable_vat_period is on and the income hasn't been booked yet.accounting_period_start and accounting_period_end must be
submitted together, and the start date can't be after the end date.GET /1/incomes/{income_id}/ gained new fields, returned when
fields=accounting is requested: accounting_id, vat_period_type,
vat_period_started_at, vat_period_ended_at.
accounting is included in
fields.editable_fields reflects these too -- accounting_id,
vat_period_type, and vat_period_started_at appear as editable
depending on company settings (enable_accounting_id,
enable_vat_period) and the income's processing status.GET /2/revenue-types/ endpoint lists revenue types, sorted
case-insensitively by name.New POST /2/revenue-types/create/ endpoint creates revenue types.
is_external=True, so it won't be
auto-deleted.New POST /2/revenue-types/update/ endpoint updates revenue types by
id, in bulk, with partial success; sets is_external=True on the
updated types.
POST /2/revenue-types/delete/ endpoint deletes revenue types by
id; an unknown id or one belonging to another company lands in
failed_ids instead of failing the whole request.PATCH /2/incomes/{income_id}/update/ (new endpoint) supports partial
updates to an income.
type=1), accounting document
(type=2), cash receipt (type=6), collective receipt (type=7).editable_fields on the income detail
response).vat_area, due_at,
payment_method, planned_payment_date, paid_through,
secondary_id, exchange_rate, exchange_date,
accounting_period_start, accounting_period_end, tags,
simple_tags, assignments, note, needs_review,
review_done, ledger_number_id are editable.invoice_number, net_amount,
gross_amount, currency, fulfilled_at, issued_at,
partner_id, partner_name, partner_zip_code, partner_city,
partner_address, partner_country, partner_tax_number,
partner_account_number (ignored on invoices).Cash receipt and collective receipt: invoice_number,
net_amount, vat_amount, gross_amount, currency,
exchange_rate, exchange_date, fulfilled_at (also sets
due_at and issued_at), secondary_id, tags, simple_tags,
assignments.
secondary_id, tags, simple_tags, and assignments (and
within assignments, only revenue_type).List fields (tags, simple_tags): the submitted list replaces
the full set.
assignments: the submitted list replaces all of the income's
assignments.
revenue_type (int), net_amount,
vat_amount, gross_amount, vat (VAT category id), tags
([int]), job_number, ledger_number_id,
vat_ledger_number_id, company_vat_category_id (the last
three only apply under advanced accounting).Response: the same shape as the GET /1/incomes/{income_id}/
detail response.
GET /1/incomes/{income_id}/ gained a new secondary_id field.
vat_percent/percent fields changed from integer to float on:
GET /1/incomes and GET /1/incomes/{income_id}/:
items[].vat_percentGET /1/incomes/{income_id}/: assignments[].vat.percentGET /2/expenses and GET /2/expenses/{expense_id}/:
items[].vat_percentGET /2/expenses/{expense_id}/: assignments[].vat.percentCompany VAT category endpoints gained a type field (cost or
revenue):
GET /2/accounting/vat-categories/ returns type (read-only).POST /2/accounting/vat-categories/create/ accepts an optional
type, defaulting to cost.
created_vat_categories in the response now returns the full
VAT category (id, name, percent, vat_area, country,
type) instead of the previous ledger-number-like shape.POST /2/accounting/vat-categories/update/{vat_category_id}/
accepts an optional type.
GET /1/incomes/{income_id}/ gained a new editable_fields field --
lists which fields (income- and assignment-level) can be edited,
depending on the income's source/type and processing status.
GET /2/monthly-taxes/ (with fields=taxes) per-tax items gained
source (manual, or an integration label such as navm2m) and
description.GET /2/monthly-taxes/ supports filtering by ?source=; an
unrecognized value returns 400.POST /2/taxes/update/ on a tax synced from an integration now ignores
changes to every field except tags (previously any field could be
submitted, with unclear effect on the synced data).GET /2/expense-types/ endpoint lists expense types, sorted
case-insensitively by name.New POST /2/expense-types/create/ endpoint creates expense types.
is_external=True, so it won't be
auto-deleted.New POST /2/expense-types/update/ endpoint updates expense types by
id, in bulk, with partial success; sets is_external=True on the
updated types.
POST /2/expense-types/delete/ endpoint deletes expense types by
id; an unknown id or one belonging to another company lands in
failed_ids instead of failing the whole request.GET /2/expenses/{expense_id}/ gained a new editable_fields field --
lists which fields can be edited on the expense, depending on its
source and processing status.PATCH /2/expenses/{expense_id}/update/ editable-field coverage
expanded: every field listed in the detail response's
editable_fields is now editable, on both the expense and its
assignments.
List fields (tags, simple_tags):
Assignments follow the same add/remove logic:
id is edited with the
submitted values.id is added.assignments itself stays optional, but if submitted it must
contain at least one item -- an empty list is rejected.GET /1/artifacts/expense/ and GET /1/artifacts/income/ gained
filename and extension fields -- only present when has_artifact
is true.PATCH /2/expenses/{expense_id}/update/ can set secondary_id and
excluded_from_accounting on an expense.
secondary_id: strexcluded_from_accounting: bool -- this is an action; submitting
true creates an action object.excluded_from_accounting=true for an expense that's
already excluded returns an error.New GET /2/monthly-taxes/ endpoint lists a company's taxes grouped by
month.
to_date, from_date, is_paid, is_installment.fields=taxes includes per-tax detail (and a tags list) under
each month; omitted, only the monthly totals are returned.New POST /2/taxes/create/ endpoint creates taxes.
currency isn't accepted.tags/simple_tags accept tag ids directly on creation.code can't be submitted together with name or
account_number.New POST /2/taxes/update/ endpoint updates taxes by id, in bulk.
Response: the monthly-tax list response for the updated taxes.
POST /2/taxes/delete/ endpoint deletes taxes by id (204 No
Content).GET /2/monthly-salaries/, POST /2/salaries/create/,
POST /2/salaries/update/, and POST /2/salaries/delete/ endpoints --
same shape as the taxes endpoints above, for salary costs (a given
tax_number can only appear once per month).GET /2/expenses and GET /2/expenses/{expense_id} now return
artifact_created_at, artifact_filename and artifact_extension
when the expense has an artifact (has_artifact is true).PATCH /2/company-info/update/{company_id}/ accepts enable_vat_period
and enable_accounting_id, letting these company settings be turned
on/off through the API.Added tag endpoints:
GET /2/tags/ -- lists the company's tags, filterable by name
and is_external.POST /2/tags/create/ -- creates tags; all API-created tags get
is_external: true and are not auto-deleted even if unused.PATCH /2/tags/update/ -- updates tags; also sets
is_external: true on the edited tag.POST /2/tags/delete/ -- deletes tags not referenced by any
expense/income/etc.; response splits ids into deleted and
not_deleted.GET /2/documents now returns attached and unattached documents by
default; filter with ?is_attached=true/false.GET /2/expenses supports filtering partially paid expenses with
?is_installment=true/false.?is_paid=true/false) and partially paid (?is_installment=true/false)
status.