Skip to content
API pagesChangelog

API documentation

Changelog

What changed in the Syllevo API, newest first. Contract version is reported as info.version in the published OpenAPI document and echoed in the api-supported-versions response header.

Breaking changes do not land inside a version. If a route's shape has to change, it arrives as /v2 beside /v1, and /v1 keeps answering. Additive changes, a new optional field on a response, a new optional query parameter, a new error code in an existing family, can land in /v1 at any time, so write clients that ignore fields they do not recognize.

2026-10-12

Additive, in /v1, with one fix to what amounts mean.

  • Credit notes are negative. An e-Factura credit note (type code 381) prints positive amounts, and Syllevo filed it with them, so it added to totals instead of subtracting. It is now stored with negative net, VAT, total, and line amounts, and invoices filed before this date are corrected over the following days. See Invoices.
  • Each invoice carries documentTypeCode, isCreditNote, correctedInvoiceNumber, and correctedInvoiceIssueDate. GET /v1/invoices/{id} also carries correctedInvoiceId, the invoice the credit note corrects, when exactly one matches.
  • POST /v1/profiles/{profileId}/sales-invoices with a credit note's XML accepts the amounts as printed or with the minus sign, but every amount in one request has to use the same one. A printed net beside a negative total answers 400 sales_invoice_metadata_mismatch.
  • On GET /v1/documents and GET /v1/documents/{id}, the invoice summary carries isCreditNote. See Documents.
  • Exports: the JSON invoices gain the same three fields, and invoices.csv and sales-invoices.csv append three columns, at format version 2. See Exports and handover packs.

2026-10-04

Additive, in /v1.

  • GET /v1/invoices/number-gaps: where a client's sales numbering skips, per series and year of issue, with the sales either side of each gap. See Invoices.

2026-10-03

Additive, in /v1.

  • GET /v1/invoices takes series, withoutSeries, sortBy, and sortDirection, and each invoice carries numberSeries and numberSequence. See Invoices.
  • GET /v1/invoices/facets: invoice counts per issue month and per number series. See Invoices.

2026-09-27

Additive, in /v1.

  • GET /v1/billing/closure and POST /v1/billing/closure: closing the account, and when the organization will be deleted. See Billing.
  • An organization whose subscription ended is now deleted 90 days later, after two emails to its Owners. Exports keep answering until then. See Exports and handover packs.
  • An organization that never subscribed is closed the same way 12 months after it was created, and GET /v1/billing/closure reports it with reason never_subscribed.
  • In the OpenAPI document, the closure response's state and reason are string enums.

2026-09-11

Contract version v1. First publication of these pages.

They were written against the contract as it stood on this date: 137 routes across the resource areas listed in the table of contents. Nothing is deprecated, and nothing is scheduled for removal.

Worth knowing on day one, because each one has surprised somebody:

  • An unmatched path answers 401, not 404. See Authentication.
  • Enums serialize as integers, with one exception. See Conventions.
  • e-Factura is a per-deployment switch, on in production. While it is off its routes answer 404. See e-Factura and SPV.
  • Supplier connectors are switched on per deployment, and the catalog lists only the ones that are on. Connecting to one whose credentials are not filled in answers connector-not-configured. See Sources.

2026-09-11, corrections

Contract version v1. The same day, after the pages above were written. Writing them turned up six places where the published OpenAPI document described something other than what the API does. The document was wrong in five of them, and the API changed in one.

One behavior change. POST /v1/profiles/{profileId}/completeness/expected answers 201 now, not 200, with a Location header naming the month the expectation belongs to. A client that checks for 200 specifically will stop seeing a match. Check for 2xx. See Status and month-end completeness.

One rename, with the old spelling still accepted. The query parameter on GET /v1/registry/company is cui, not Cui, in the document and in any client generated from it. Query string keys are matched without regard to case, so a caller still sending Cui= keeps working. See Search and company lookup.

Four corrections to the document, none of which changes a request or a response:

  • The three avatar uploads, POST /v1/organization/avatar, POST /v1/users/me/avatar, and POST /v1/profiles/{id}/avatar, are described as multipart/form-data with one required part named file. The document used to show a query parameter called request and no body, which was never what the routes read.
  • POST /v1/documents is described as multipart/form-data with profileId and file, both required. The document used to call it application/x-www-form-urlencoded, which would have lost the file.
  • The server list names https://api.syllevo.com first. A tool that picks the first server now picks production.
  • Every operation carries the sentence that explains it, and every 201 declares the Location header it has always sent.