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, andcorrectedInvoiceIssueDate.GET /v1/invoices/{id}also carriescorrectedInvoiceId, the invoice the credit note corrects, when exactly one matches. POST /v1/profiles/{profileId}/sales-invoiceswith 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 answers400 sales_invoice_metadata_mismatch.- On
GET /v1/documentsandGET /v1/documents/{id}, theinvoicesummary carriesisCreditNote. See Documents. - Exports: the JSON invoices gain the same three fields, and
invoices.csvandsales-invoices.csvappend three columns, at format version2. 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/invoicestakesseries,withoutSeries,sortBy, andsortDirection, and each invoice carriesnumberSeriesandnumberSequence. 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/closureandPOST /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/closurereports it withreasonnever_subscribed. - In the OpenAPI document, the closure response's
stateandreasonare 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, andPOST /v1/profiles/{id}/avatar, are described asmultipart/form-datawith one required part namedfile. The document used to show a query parameter calledrequestand no body, which was never what the routes read. POST /v1/documentsis described asmultipart/form-datawithprofileIdandfile, both required. The document used to call itapplication/x-www-form-urlencoded, which would have lost the file.- The server list names
https://api.syllevo.comfirst. A tool that picks the first server now picks production. - Every operation carries the sentence that explains it, and every
201declares theLocationheader it has always sent.