Changelog
Dated log of changes to the Agent API and the partner portal. Newest first.
2026-08-20New
- Contracts module in the Agent API (/v1/agent/contracts): list, detail, create, update, delete, payment schedule (incl. marking a payment as paid), linked invoices and recurring invoices, stats, AI extraction from PDF, and attachments. Scopes contract:read/create/update/delete; new partner keys get read/create/update by default, older keys need to be regenerated.
- PATCH /v1/agent/invoices/:id: edit an invoice's content (items, dates, notes, bank account, contract linking…). Same rules as the app: cancelled/archived/locked documents can't be edited, Peppol-sent ones only accounting metadata. The payload is camelCase (session shape) with an optional optimistic version lock. Requires the invoice:update scope.
- Tightening: USER-scoped API keys (efk_live_/efk_test_) are now authorized by the intersection of the key's scopes and the user's permissions. A key with restricted scopes (e.g. invoice:read only) can no longer perform write operations through its owner's permissions; least-privilege keys are now enforced.
- Projects (zákazky) in the Agent API: /v1/agent/projects (list, create with a color, detail, update) plus new case_id fields on expenses (create, upload, update, list filter) and caseId on contracts. Documents and contracts can be tagged with a project the moment they are created. Expenses also gained branch_id (previously only branch_code on upload).
2026-08-01New
- Idempotency for document creation: POST /v1/agent/invoices and POST /v1/agent/expenses now accept an optional Idempotency-Key header. Retrying with the same key and body returns the stored response (the document isn't created twice, and the number series isn't consumed); the same key with a different body returns 409. Strongly recommended for all retry mechanisms.
- POST /v1/agent/invoices/:id/send-reminder: calling it again within 10 minutes no longer resends the reminder, it returns 200 with sent:false instead of a duplicate email to the customer.
- E-invoice validation fixes: a corrective document (§25, UNTDID 384) now keeps the actual sign of its amounts (previously it behaved like a credit note by taking the absolute value); a credit note without a VAT category on a line now correctly fails on SK-BT-148; deduplication of received documents now includes the document type (a credit note with the same number as an invoice is no longer dropped as a duplicate).
2026-07-27Fix
- POST /v1/agent/expenses/scan-qr: parsing of eKasa receipts now applies only to organizations with SK (eKasa) fiscalization. Organizations from other countries (e.g. CZ) get a generic result { type: "text", raw } even for an eKasa QR code.
2026-07-23Fix
- GET /v1/agent/expenses/:id/qr: the generated Pay by Square QR code no longer includes the due date (banking apps were pre-filling it or rejecting the payment).
2026-07-22Improvement
- The phone number in the inline customer object (POST /v1/agent/invoices) is now validated as E.164: separators and the 00 prefix are normalized, and an invalid number returns a clear 400 VALIDATION_ERROR (previously an opaque 500 from a DB constraint).
2026-07-21New
- New payment_method value: "offset" (mutual set-off) when creating an invoice, marking an expense as paid, or recording a payment. Credit notes can now be settled with a negative amount due (previously it was clamped to zero).
- POST /v1/agent/invoices/:id/send-reminder: added "cs" (Czech) as a supported reminder language, alongside sk/en/de/hu.
2026-07-18Improvement
- Invoices in the pending_approval state (awaiting approval) are now blocked the same way as drafts: you can't send a reminder for them or mark them as paid/cancelled; the API returns 400 instructing you to issue the invoice first.
2026-07-14Improvement
- Issuing and editing an invoice (POST/PATCH /v1/invoices): new field numberSeriesAction (optional, "exception" | "advance") controls the series counter when customNumber (on issue) or number (on edit) jumps ahead of the series. Non-interactive requests without numberSeriesAction are handled by the API as "exception" by default: the document keeps the number you sent, but the series counter is no longer advanced automatically (behavior change, 2026-07). The Agent API doesn't yet support custom document numbers. Send "advance" to restore the previous behavior (continuing from the given number). Interactive (session) clients get a 409 NUMBER_OUT_OF_SERIES instead of the default, with details { typedNumber, expectedNext, nextIfException, nextIfAdvance, sequenceId, sequenceName, prefix }.
- Documents saved with "exception" behavior are not tied to any number series and don't create a sequence_log entry: in series diagnostics they appear as "numbers outside series" and can later be adopted into a series retroactively.
2026-06-26New
- Production onboarding (FS webhook → email confirmation): a company chooses eFaktúra as its delivery service provider (PDS) on the Slovak Financial Administration portal, the FS sends the mandate via webhook, and eFaktúra automatically sends the company a confirmation email. The company confirms receipt of e-invoices by clicking a public page (no login), this links it to your child org on live Peppol.
- POST /agent/organizations/:id/peppol-claim: (re)sends the FS confirmation email for an org already owned by the key (scope invoice:send, NOT org:provision).
- Public confirmation page for partner-claim: token-only, no company login required (anti-misrouting: the company's mailbox confirms via its FS company_email).
- New documentation: Production onboarding and API keys and scopes.
2026-06-20New
- Bulk sending via Peppol: POST /agent/peppol/send/batch with body { invoiceIds: [...] } (1–200 IDs per call).
- Invoice attachments via the API: add, list, and remove attachments (scope invoice:update).
- Received documents via the API: download the original PDF as well as the invoice's UBL XML (scope invoice:download).
2026-06-15New
- Self-billing: support for the poacc:selfbilling:3.0 profile for both invoices and credit notes.
2026-06-10Improvement
- The sandbox now runs on a real phoss-ap-TEST on the OpenPeppol TEST network: efk_pk_test_ sends go through the real Peppol TEST network (replacing the original in-process simulated Access Point). Still no credits and no FS.
2026-05-31New
- Partner portal: document overview (Documents), invoices sent and received via Peppol with both document and transport statuses, filters, and a summary.
- Partner portal: self-service sandbox API keys, an API call overview (logs), a list of client organizations.
- Partner portal: partner login (email + password) via an administrator invitation.
- Developer portal launched at developers.efaktura.sk, including the API reference (Scalar) and documentation.
2026-05-30New
- Sandbox: efk_pk_test_ sends work immediately with no configuration on the Peppol TEST environment, no credits or FS.
- Sandbox routing by key tier (test/live) on the same base URL (Stripe model).