Nordlet

← Docs / Changelog

Changelog

New features, changes and fixes in Nordlet, by release.

v0.5.0

0.5.0 - 2026-10-13 - Current release

Added

  • POST /v1/account/me returns billing.accountType (flat_rate or per_request) of the paying account.

Changed

  • /v1/sales/invoices/pdf and /v1/sales/invoices/send print an issued invoice with the seller name, code, VAT number, VAT payer status and address stored when it was issued; a later change of the company no longer changes the PDF of an issued invoice.
  • /v1/calendar/list lists a filing deadline only when the company has to file it: EU sales lists for periods with intra-EU sales, Intrastat above the national threshold or as set in filingOptions.intrastat, the Estonian and Latvian monthly corporate income tax returns for months with a distribution (Latvia also the last month of the financial year), the Norwegian shareholder register statement not for ENK, ANS, DA or KS, and the French CA3 or CA12 by filingOptions.frVatRegime.
  • /v1/calendar/list lists the Belgian annual client listing (be-client-listing) also for Belgian companies that are not VAT payers (franchise regime), from the 2025 operations.
  • The German VAT return (de-vat-return) is quarterly unless the company's vatPeriod is set, the Spanish Modelo 111 (es-payroll-withholding) is quarterly unless filingOptions.esLargeCompany is yes, and the Romanian D394 and D406 follow the VAT period.
  • filingOptions on /v1/account/companies/update accepts intrastat, euSalesListPeriod, atUvaExempt, bePayrollPeriod, dePayrollPeriod, esSii, esSimplifiedOnly, esLargeCompany, frVatRegime and frCompanySize.
  • Error and warning messages that pointed to Settings now point to Account (for example Account → Compliance → EU), and the error keys document_reading_is_available_after_the_first_top_up_top_up_credits_in_settings and no_peppol_access_point_is_set_up_for_this_company_enter_it_in_settings_complianc are now ..._in_account_b and ..._in_account_compliance.

Fixed

  • The pain.001 files from /v1/bank/payments/export and the payroll net-pay export now carry the debtor's bank (DbtrAgt, NOTPROVIDED when no BIC is known), which the pain.001.001.03 schema requires; files without it failed schema validation.
  • POST /v1/account/companies/create now stores every profile field it accepts (legalForm, incorporatedOn, vatPeriod, fiscalYearEndMonth, filingOptions, smeExemptionNumber, registryName, shareCapital, accountsKeptBy, bookkeeperName, auditorName, auditorRegistrationNumber, auditRequired); before, these were accepted and dropped.

0.4.0 - 2026-10-11

Added

  • POST /v1/billing/account/set-auto-top-up turns automatic top-ups on or off: when a usage charge leaves the balance at or below zero, Nordlet charges the saved card for the chosen amount through a Stripe invoice and credits the balance when the invoice is paid; POST /v1/billing/account/get returns autoTopUp.
  • POST /v1/billing/account/set-overdraft-cap sets how far below zero the balance may go (default 100 EUR, maximum 1000 EUR) for an account that has paid at least once; POST /v1/billing/account/get returns overdraftCapCents.
  • POST /v1/billing/flat-rate/create accepts plan (starter, business or scale, default starter) and opens the Stripe checkout for that plan's price; the plan is stored when the checkout completes.
  • POST /v1/billing/flat-rate/confirm starts the flat rate from a completed Stripe Checkout session id, so the buyer does not wait for the webhook.
  • POST /v1/billing/topup/confirm credits a paid Stripe Checkout top-up from its session id without waiting for the webhook, and POST /v1/billing/topup/create accepts returnTo: "onboarding" to send the buyer back to the plan page instead of the credits page.
  • POST /v1/billing/account/set-account-type sets the account type (flat_rate or per_request); POST /v1/billing/account/get returns accountType.
  • POST /v1/sales/invoice-templates/{create,update,get,list,delete} store named invoice and credit note templates (partner, currency, payment term in days, VAT scheme, supply type, numbering, series label, order number, discount, signatures, Intrastat fields, notes and lines) that the app uses to prefill a new document.

Changed

  • API calls and the app answer 402 only when the balance reaches minus the monthly cap, instead of zero, for accounts that have paid at least once.
  • Flat rate plans include issued invoices (500 / 3000 / 20000 a month) instead of requests, flat_rate API keys work while credits are above zero at 0.002 EUR per call instead of answering 403, per_request accounts pay 0.002 EUR per request with no plan fee, and the plan fields includedRequests / requestOverageEur are now includedInvoices / invoiceOverageEur.
  • Included database storage now equals included file storage on every plan: Starter 1 GB (was 256 MB), Business 5 GB (was 1 GB), Scale 30 GB (was 2 GB); includedDatabaseBytes in the billing plan list changed to match.
  • POST /v1/account/companies/activate no longer charges 50 EUR and no longer answers 402, and archived companies are no longer charged 1 EUR per month.
  • Sandbox companies (isSandbox: true) always file and send e-invoices to the administrations' test endpoints, whatever the system's or the company's environment setting says, and can switch automatic filing on for them.

Removed

  • Partner fields otherCode and foreignTaxNumber: POST /v1/partners/{get,list} no longer return them and POST /v1/partners/{create,update} ignore them; nothing used them.

0.3.14 - 2026-10-11

Changed

  • POST /v1/reference/exchange-rates/list and every currency conversion now have Bank of Lithuania EUR rates for the last 5 years, refreshed daily; you no longer need to call reference/exchange-rates/sync for each date.

0.3.13 - 2026-10-10

Fixed

  • POST /v1/bank/securities/import accepts statements larger than 1 MB; they were answered with 413 "Request body is too large".

0.3.12 - 2026-10-10

Added

  • POST /v1/bank/securities/import takes an Interactive Brokers Realized Summary CSV (content, optional fileName) for a bank account of the new type broker, and posts its trades, dividends, withholding tax, interest and fees to the ledger, one journal transaction per day, converted to the company's base currency at each day's rate. Shares, options and futures are matched first in, first out across imports. A position bought before the first imported statement is costed at the Interactive Brokers basis. An exercised or assigned option's premium moves into the cost or proceeds of the underlying shares, and an expired option's premium becomes the realized result. Rows already imported (same type, symbol, date and time, and amount) are skipped. Deposits, corporate actions and currency conversions are listed but not posted. POST /v1/bank/securities/list and /get return the imports and their operations. Posting rules securities.investments, securities.gain, securities.loss, securities.dividendIncome, securities.withholdingTax, securities.interestIncome, securities.interestExpense and securities.fees choose the accounts.

0.3.11 - 2026-10-10

Added

  • POST /v1/platform-sellers/list, /get, /create, /update and /delete record the sellers on a platform the company operates, with tax residences and TINs, address, date of birth, IBAN, permanent establishments, and per year and quarter the consideration, fees, taxes and number of activities for the sale of goods, rental of immovable property (with the property address and type), personal services and rental of means of transport.
  • POST /v1/declarations/eu/dac7/preview and /dac7/xml build the yearly DAC7 platform operator report (Directive (EU) 2021/514): which sellers are reportable and why the others are excluded, and the XML file - the VMI DPI-DAC7-LT v0.4 layout in Lithuania and the EU DPI XML Schema v1.09 in Austria, Belgium, Bulgaria, Cyprus, Czechia, Germany, Estonia, Finland, Ireland, Malta, Portugal, Romania, Slovakia and Slovenia. The calendar gets a 31 January DAC7 deadline (<cc>-dac7) for companies with platform sellers; it is sent directly to VMI TIES (compliance system lt-ties) and to the BMF DPMG web service (at-dpmg), and offered as a download elsewhere.
  • POST /v1/declarations/eu/digital-reporting/list lists, for a date range, the intra-EU transactions that must be reported one by one from 1 July 2030 (Directive 2006/112/EC art. 262-264 as amended by Directive (EU) 2025/516): intra-EU supplies of goods, reverse-charge supplies, and acquisitions with self-assessed VAT, each with its invoice data, the Member State to report to, the deadline and the data elements still missing.
  • POST /v1/declarations/eu/own-goods-transfers/compute builds the monthly return of the special scheme for transfers of own goods (art. 369xa-369xk, from 1 July 2028) from stock transfers between warehouses in different Member States, valued at cost in euro per destination and dispatch Member State, with its due date.
  • Warehouses take and return countryCode (POST /v1/inventory/warehouses/create, /list), and the new POST /v1/inventory/warehouses/update changes a warehouse's name or countryCode.
  • POST /v1/reference/vat/resolve takes serviceKind (short_term_accommodation, passenger_road_transport) with serviceCountryCode, underlyingSupplierGaveVatNumber, underlyingSupplierChargesVat, goodsKind (installed, energy_network) and goodsLocationCountryCode. It now applies the platform deemed-supplier rule for short-term accommodation and road passenger transport from 1 July 2028 (art. 28a, 136b), and the extended Union OSS for goods sold where they are held, installed goods and energy supplies (art. 369b(b), (d), (e), 369aa).
  • Payout batches (POST /v1/bank/settlements/list, /get, /import, /post) return clearedNet, clearingDifference and clearingOpenCount, and each line returns clearingBankAccountId, clearingBooked, clearingDifference and clearingUnposted: for every payout line whose charge or refund was already imported from the Stripe payments export, they show the bank account holding it, the amount held there, the difference to what the payout moved, and whether that movement is still unposted. All refund lines of one charge are compared together against the refunded total of the payments export. The /post summary returns clearedAmount.
  • Bank accounts take and return type (bank or stripe, default bank) in POST /v1/bank/accounts/create, /update and /list, and /list filters by it. A Stripe account has no IBAN: sending one answers 422, and changing an account to stripe clears its IBAN.

Changed

  • The DAC7 compliance systems (lt-ties, at-dpmg, <cc>-dac7) no longer take environment in POST /v1/declarations/configs/update (sending it answers 400). The DAC7 file for lt-ties and at-dpmg goes to the test service and is marked as test data (OECD11); the file for every other DAC7 country is marked as live data (OECD1).

Fixed

  • POST /v1/ledger/accounts/list, the catalog item, e-commerce item and HR position responses no longer answer 500 for companies whose stored names still include Russian (ru), a language removed in 0.3.3; such names are left out of translations and deleted from the database.

  • POST /v1/bank/settlements/post no longer books a charge, refund or Stripe fee a second time when it was already imported from the Stripe payments export (POST /v1/bank/statements/import): such a line now moves its net amount out of the bank account that holds it, and the fee and receivable are not booked again. A difference between that amount and the payout line is listed in warnings. A batch with nothing left to book is posted with journalTransactionId null.

  • POST /v1/bank/statements/import with a Stripe payments export skips the charges, fees and refunds already posted with a payout batch, counts them in skipped and names the payouts in warnings.

0.3.10 - 2026-10-09

Added

  • Peppol sending and receiving through the company's own access point account at Recommand, Storecove or e-invoice.be: the compliance system peppol (POST /v1/declarations/configs/update) takes provider (recommand, storecove or e-invoice-be), accountId (the Recommand company ID or the Storecove legal entity ID; not used by e-invoice.be), apiKey, apiSecret (Recommand only), webhookSecret and optional apiBaseUrl. POST /v1/peppol/webhooks/{provider}/{companyId} takes the access point's webhook calls for one Nordlet company, checked against its webhook secret: the X-Signature HMAC of the body for Recommand, the X-Signature HMAC of the canonical JSON for e-invoice.be, HTTP Basic authentication with the secret as password for Storecove. Each received document becomes a document capture with provider: "peppol" and the new field senderId, and sends the webhook event document_capture.peppol_received. Without an access point, Nordlet only generates Peppol files.
  • POST /v1/peppol/participants/lookup (with partnerId or participantId) says whether a receiver is registered on the Peppol network, which Peppol BIS Billing 3.0 documents it accepts and the address of its access point.
  • POST /v1/sales/invoices/peppol-status returns and stores the delivery status of an invoice sent over Peppol (pending, delivered, rejected, failed) from Recommand or e-invoice.be, and answers 422 for Storecove, which reports delivery only through its webhook; invoices return the new fields peppolMessageId, peppolStatus, peppolDetail, peppolSentAt and peppolCheckedAt, and status changes reported by the access point send the webhook events sale_invoice.peppol_delivered, sale_invoice.peppol_rejected and sale_invoice.peppol_failed.
  • POST /v1/capture/documents/confirm takes type (invoice or credit_note); captures carry extraction.documentType, so a received credit note is confirmed as a purchase credit note. It also takes oppositeLines and oppositeDocumentNumber: lines with the opposite sign are saved as a second document of the opposite type for the same supplier (a purchase credit note against the new invoice, numbered "-CR" by default, or a purchase invoice next to a credit note, "-INV"), returned as oppositeInvoice. Received Peppol documents fill extraction.oppositeLines with negative lines and allowances that no line of the same VAT rate can carry.

Changed

  • POST /v1/sales/invoices/peppol-send now sends through the company's own access point and returns status and detail; without an access point it answers 422. A refusal by the access point (for example, a receiver not on Peppol) answers 422 with the reason, and an invoice whose delivery failed or was rejected can be sent again. In the peppol compliance system, provider is now one of recommand, storecove or e-invoice-be instead of free text, and environment is removed.

Fixed

  • Peppol UBL invoices and credit notes for an intra-community supply now carry the delivery date and the deliver-to country (cac:Delivery), which the Peppol rules BR-IC-11 and BR-IC-12 require.

0.3.9 - 2026-10-08

Added

  • A new posting rule cash.advances (2435 in the Lithuanian chart, 542 in the Romanian chart) names the account of cash advances paid to employees; /v1/cash/advance-holders/balances and /v1/reports/advance-reconciliation count only cash orders posted to it.
  • The Hungarian KSH Intrastat settings (POST /v1/declarations/configs/update, system hu-ksh-intrastat) take a new field questionnaireMinutes, the time spent filling in the questionnaire in whole minutes; the OSAP 2010 and 2012 upload files write it into VGEA002, which KSH-ELEKTRA requires before a questionnaire can be submitted, and the file comes with a warning while it is not set.
  • /v1/account/api-keys/list returns a new field createdByUserId, the user who created or rotated the key.
  • POST /v1/sales/invoices/issue takes returnToStock: true on a credit note for an invoice: the goods on its lines go back into stock at the cost they left it with on the credited invoice, and cost of goods sold (6000) is credited by the same amount. More than was sold on the invoice is refused with 422.
  • /v1/assets/settings/get and /update (autoDepreciation) and /v1/agreements/settings/get and /update (autoBilling) switch on automatic monthly depreciation and agreement billing: every night the depreciation of the previous month is posted and due agreement invoices are generated.
  • Purchase invoice lines take deferralStartDate and deferralEndDate: registering the invoice books the line to prepaid expenses (posting rule purchases.prepaidExpenses, 2900 in the Lithuanian chart, 471 in the Romanian chart), and each month of the period is released to the line's expense account every night or with POST /v1/purchases/deferrals/post; /v1/purchases/deferrals/list shows the schedule.
  • POST /v1/payroll/runs/reverse reverses an approved payroll run with a mirror journal entry and sets its status to reversed, so a corrected run can be created for the same month; it sends the webhook event payroll_run.reversed.
  • For a Lithuanian company, POST /v1/payroll/runs/create without lines adds unused-leave compensation to an employee whose contract ends in the month: the remaining days of the leave balances times the average daily pay of the three months before (or the contract salary when there is no approved payroll for them), as a taxable addition.
  • Business trips: /v1/hr/per-diem-rates/{create,list,delete} keep the company's daily per diem per destination country, and /v1/hr/business-trips/{create,get,list,approve,delete} record a trip; the automatic payroll run for the month a trip ends pays its approved per diem as a tax-free addition.
  • POST /v1/bank/transactions/match-many matches one bank payment to several invoices in its currency with one journal entry; /v1/bank/transactions/unmatch undoes all of them.
  • POST /v1/cash/orders/create takes saleInvoiceId or purchaseInvoiceId: the order posts against receivables or payables and changes the invoice's paid amount and payment status.
  • /v1/cash/expense-reports/{create,get,list} settle an employee's cash advance with the receipts paid from it (expense and input VAT debited, cash.advances credited); /v1/cash/advance-holders/balances and /v1/reports/advance-reconciliation return the new field settled.
  • POS shifts and receipts: /v1/pos/shifts/{open,get,list,close} and /v1/pos/receipts/{create,get,list}; closing a shift turns its receipts into one Z-report posted like /v1/pos/reports/create and returns the expected cash and the difference to the counted cash.
  • POST /v1/partners/merge moves every document and record of a duplicate partner, including its journal entries, to the partner kept, and hides the duplicate.
  • POST /v1/ledger/journal/transactions/create accepts an optional currency; a currency other than the company base currency is refused with 422 instead of being ignored.
  • POST /v1/purchases/invoices/register accepts returnFromStock: true for a credit note that credits an invoice: the goods on its lines leave the warehouse from the batches that invoice received, at their cost; the stock account is credited with that cost and any difference to the credited amount goes to cost of goods sold. More than the invoice received, or than is still in those batches, is refused with 422.
  • Polish employees have a new employee field, plKodUrzedu, the 4-digit code of the tax office of their place of residence (listed by POST /v1/hr/employees/fields, saved in payrollOptions).
  • POST /v1/sales/invoices/apply-advance takes an optional amount and applies an advance in parts across several invoices; by default it applies the unapplied advance or the unpaid balance of the invoice, whichever is smaller, reversing the advance VAT in proportion with the last part taking the remainder. Invoice responses carry advanceAppliedAmount on advance invoices.
  • POST /v1/bank/transactions/match, /match-many and /record accept documentType: 'payroll_run' for an approved payroll run: an outgoing bank payment of all or part of the run's unpaid net pay is posted from the net-pay account the run was approved to (debit) against the bank account (credit), and paying more than is still owed is refused with 409; /v1/bank/transactions/unmatch reverses it, and /v1/bank/transactions/suggest-matches suggests approved runs for outgoing payments.
  • Payroll runs returned by /v1/payroll/runs/{create,get,list,approve,reverse} have a new field paidAmount, the net pay matched to bank payments so far.

Changed

  • Estonian e-MTA filings (system ee-emta) now go through Nordlet's own X-tee security server.

  • /v1/account/members/remove now also revokes every API key the removed member created or rotated in that company, and deleting a user account revokes that user's keys in every company; the member.removed audit entry lists them in revokedApiKeys.

  • /v1/hr/contracts/create now refuses with 409 a contract for an employee who already has a contract covering any day of the new one.

  • Document reading is not available during the free trial: /v1/capture/documents/upload and /v1/capture/documents/extract answer 402 payment_required until the account's first top-up, and bills received at the intake e-mail address are stored unread (status pending) so they can be read with /v1/capture/documents/extract after the top-up.

  • /v1/payroll/runs/create without lines refuses with 422 an employee who has more than one contract in the month, instead of answering that the run already exists.

  • The consolidation reads /v1/consolidation/report, /v1/consolidation/intercompany/report, /v1/consolidation/intercompany/candidates and /v1/consolidation/intercompany/links/list now answer 403 unless a signed-in caller is a member of every member company, or, for an API key, a user who is owner, admin or accountant in both the group owner company and each member company exists.

  • Selling an item made by a production order (POST /v1/sales/invoices/issue, POS reports, web-shop fulfilment, write-offs and stock counts) now takes its cost out of the finished goods account the production order put it on (2030 in the Lithuanian chart), instead of goods for resale (2040).

  • The cost-of-goods-sold entries of a sale invoice now carry the projectId and costCenterId of the sale line, so /v1/projects/report and /v1/reports/cost-centers show the cost of the goods sold on a project or cost centre.

  • Stock values are now kept in whole cents: a goods receipt, a landed-cost share, a production order's labour and scrap, and every amount taken out of a batch are rounded to cents, and a production order's totalCost returns cents.

  • POST /v1/ledger/journal/transactions/create, POST /v1/migration/books/validate and /v1/migration/books/import now refuse with 422 journal and opening-balance lines whose debit or credit has a fraction of a cent.

  • POST /v1/ledger/journal/transactions/create and every document line input that takes costCenterId (sale and purchase invoices and the other documents) now refuse with 422 a cost center whose isActive is false; postings already made to it are kept.

  • POST /v1/partners/merge no longer fails with 409 when both partners have an open VAT review: the duplicate's open review is resolved as superseded (sending vat_review.resolved) and the kept partner's review stays open.

  • POST /v1/bank/statements/import and POST /v1/bank/transactions/import now refuse with 422 a statement or line whose currency differs from the bank account's currency; in a camt.053 file with statements in several currencies for the same IBAN, only the statement in the account's currency is imported.

  • POST /v1/bank/statements/import with an ISO 20022 templateId now accepts MT940 files, recognised by their content or format: "mt940", and applies the template's reference matching and Ntry/CdtDbtInd posting rules to their lines.

  • POST /v1/bank/transactions/suggest-matches now also suggests issued advance invoices for incoming payments and sale credit notes for outgoing refunds (returned as documentType: "sale_invoice").

  • POST /v1/inventory/landed-costs/create now spreads the amount over the received quantity (or value) of the batches; the share for units already gone from stock is posted to cost of goods sold, credited to the stock account they were on, and a sold-out batch no longer answers 409. The response and /v1/inventory/landed-costs/get return journalTransactionId.

  • POST /v1/declarations/pl/pit-11/generate and the PIT-11 calendar filing now address each person's PIT-11 to the tax office of that person's place of residence, taken from the employee field plKodUrzedu, instead of the company's e-Deklaracje office; a person without a valid code is refused with 422.

  • A credit note on an advance invoice (POST /v1/sales/invoices/issue) now reverses advances received (4440 in the Lithuanian chart) instead of debiting revenue; crediting a proforma, or more of an advance than is still unapplied, is refused with 422, and POST /v1/sales/invoices/apply-advance refuses with 409 an advance whose credit notes cover all of its unapplied part.

  • POST /v1/sales/acts/create and /v1/sales/acts/update now refuse with 422 a saleInvoiceId that belongs to a different partner.

  • The {{amount}} placeholder of the pay-now link (POST /v1/sales/invoices/payment-link, GET /v1/public/pay/{token}) is now the unpaid balance of the invoice after payments, applied advances and credit notes; both answer 409 for a fully paid invoice, whose PDF and e-mail no longer carry a pay-now line.

  • The credit note that takes the last unapplied part of an advance invoice now reverses exactly the advance net and VAT still open; if its own VAT differs, its vatTotal, netTotal and its last line's VAT and net are set to those open amounts at issue.

  • POST /v1/payroll/runs/reverse now refuses with 409 a run that has bank payments matched to it; unmatch them first.

  • POST /v1/hr/business-trips/create now refuses with 409 a trip that overlaps another trip of the same employee, so one day never carries two per diems.

  • POST /v1/payroll/runs/create with lines now refuses with 422 a line without gross for an employee who has more than one contract in the month, instead of paying for one contract only.

  • POST /v1/hr/contracts/create now refuses with 400 a positionId, departmentId or scheduleId that is not one of the company's own.

Fixed

  • /v1/assets/assets/get and /v1/assets/assets/list now return a netBookValue of 0 for a disposed asset.
  • /v1/assets/assets/update now refuses a disposed asset with 409, so its cost can no longer change after the disposal was posted.
  • Several simultaneous /v1/assets/assets/dispose calls for one asset now post the disposal once; the other calls get 409.
  • The supplier payment file from /v1/bank/payments/export now cuts EndToEndId to 35 characters, names to 70 and remittance text to 140, as SEPA allows, and refuses an invoice that is not in euros with 422.
  • The advance holder reports no longer count a cash salary payment or any other cash paid to an employee that is not an advance.
  • A batch bought at a price with more than two decimals, such as 3 units for 10.00, could leave a cent on the stock account after it was sold one unit at a time; the last unit taken from a batch now takes whatever value is left, so the stock account and /v1/reports/stock-balance reach exactly zero together.
  • /v1/payroll/runs/create without lines now pays an employee whose contract was ended with an end date inside the month, for the working days up to that date.
  • /v1/hr/contracts/end and /v1/hr/contracts/create now refuse with 422 an end date before the contract start date.
  • Simultaneous /v1/ecommerce/orders/reserve calls for different orders can no longer reserve more of an item than is on hand, and an order with several lines of one item is checked against their total.
  • /v1/ecommerce/orders/cancel now refuses with 409 an order that a simultaneous /v1/ecommerce/orders/fulfill has fulfilled, so a cancelled order never has an invoice.
  • /v1/ecommerce/orders/create and /v1/ecommerce/orders/fulfill now refuse a deleted customer with 400, as /v1/sales/invoices/create does.
  • /v1/partners/credit-check now converts open invoices in other currencies to the base currency, so openReceivables agrees with /v1/reports/partner-balances.
  • A schema validation error now names the field in fieldErrors, such as name or lines.0.unitPriceExclVat, instead of _.
  • The Lithuanian VAT return (/v1/declarations/lt/fr0600/compute) now includes the sales and output VAT of POS Z-reports dated in the period.
  • The Lithuanian EU sales list (/v1/declarations/lt/fr0564/compute) now includes invoices with vatScheme: 'reverse_charge', in the services column.
  • The Lithuanian corporate tax return PLN204 of a micro company now adds the booked income tax (accounts 69) back to profit before tax (box 19) and shows it in taxAlreadyBooked.
  • The Polish JPK_V7M and VAT-UE now take purchase invoices by registration date instead of document date, as the ledger does.
  • The Latvian balance sheet row R790 now shows the year result as income less expenses, and the Latvian profit and loss rows no longer include balance-sheet accounts, so R180 carries only expenses.
  • POST /v1/sales/invoices/issue now issues an invoice whose total is zero (for example a 100% discount) with journalTransactionId: null instead of answering 500; the cost of goods that leave stock is still posted.
  • lineNet on /v1/sales/acts/* is now rounded exactly like invoice lines (3 × 1.0050 gives 3.02, not 3.01).
  • POST /v1/sales/invoices/einvoice-xml for Romanian companies now writes line amounts that add up to the invoice net and VAT-group totals when a discount leaves fractions of a cent (EN 16931 rule BR-CO-10).
  • The KSeF FA(3) e-invoice (POST /v1/sales/invoices/einvoice-xml, format ksef-fa3) now makes the line net values (P_11) of each VAT rate add up exactly to that rate's total (P_13_x), and the rate totals to the invoice net, so a discounted invoice no longer differs by a cent between its lines and its totals; each line of a discounted invoice shows the discount in P_10.
  • POST /v1/sales/recognition/progress at 100% and POST /v1/sales/recognition/modify now release exactly the deferred income posted for the line, so a foreign-currency percent-complete line no longer releases one cent too much.
  • POST /v1/sales/invoices/peppol-xml line amounts and VAT-group taxable amounts now add up to the invoice net total when a discount leaves fractions of a cent, so TaxExclusiveAmount equals the invoice netTotal and no PayableRoundingAmount is written.
  • GET /v1/public/pay/{token} now answers 404 for an invoice that is still a draft.
  • POST /v1/purchases/receipts/create now costs a later partial receipt of an order line at the order price; a landed cost added to an earlier receipt of the same line no longer lowers it (order 10 @ 6.00, receive 5, add 5.00 freight, receive 5: the second receipt is 30.00, not 25.00).
  • POST /v1/hr/timesheets/generate now creates a timesheet for an employee whose contract ends within the month, up to the end date, and covers the days of every contract the employee has in the month.
  • POST /v1/payroll/runs/approve now answers 422 instead of 500 for a run in which every amount is zero.
  • POST /v1/inventory/landed-costs/create now refuses with 422 an amount with a fraction of a cent, instead of recording one amount and spreading a rounded one over the stock.
  • POST /v1/capture/documents/confirm is now atomic: a failed confirmation no longer leaves the newSupplier behind, and two simultaneous confirmations of one capture create one invoice and answer the other with 409.
  • POST /v1/purchases/invoices/delete of a draft created by /v1/capture/documents/confirm now releases the capture (status back to extracted, purchaseInvoiceId null), so it can be confirmed again or deleted instead of answering 409.
  • POST /v1/bank/settlements/post: a commission worked out from commissionPercent is now rounded to whole cents, with the seller share taking the remainder, so summary.commissionAmount, summary.sellerAmount and the journal entries no longer carry fractions of a cent.
  • POST /v1/declarations/pl/jpk-fa/generate now fills NrFaKorygowanej with the corrected invoice's number even when that invoice was issued before the requested period.
  • POST /v1/reports/vat-summary, /v1/reports/vat-detail, /v1/reports/eu-purchases and /v1/reports/oss now report foreign-currency invoices in the company's base currency at the invoice's exchange rate, as the ledger and the VAT return do, instead of in the invoice currency.
  • POST /v1/reports/stock-aging with an asOf date in the past now ages the stock as it stood on that date, so its total equals /v1/reports/stock-balance for the same date; it used to age today's remaining stock.
  • POST /v1/reports/online-sales now returns one row per channel and currency, with a new currency field, and values each order in whole cents the way an invoice with the same lines is totalled; it used to add up unrounded line amounts across currencies.
  • POST /v1/reports/fec now files bank transactions in the BQ journal, cash orders in CA and payroll runs in PAIE; they were all written to OD.
  • POST /v1/declarations/pl/jpk-kr/generate now marks every ZOiS, Dziennik and KontoZapis element with typ="G", as the JPK_KR(1) schema requires; earlier files failed schema validation.
  • POST /v1/declarations/pl/jpk-mag/generate now reports a stock-take shortage as RW and goods transferred into a warehouse as PW.
  • POST /v1/production/orders/complete called twice at the same time now completes the order once; the second call gets 409.
  • POS Z-reports (/v1/pos/reports/create, /v1/pos/shifts/close) now take a set's product components out of stock instead of leaving them in stock or refusing the report with 422.
  • /v1/ecommerce/orders/reserve and /v1/ecommerce/orders/fulfill now reserve and consume a set's product components, matching the availability /v1/ecommerce/products/list reports; service lines no longer reserve or consume stock.
  • POST /v1/pos/reports/create now requires cashAmount plus cardAmount to equal net plus VAT exactly; a mismatch, including a fraction of a cent, answers 422 instead of 500.
  • POST /v1/ledger/owners/create and /v1/ledger/owners/update now answer 422 when equityAccountCode names an account that is not in the company's chart of accounts.