All notable changes to the QUiCK Public API (/1/ and /2/ endpoints) are
documented here.
/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.