Product updates, changelogs, and announcements.
Stay up to date with the latest getpeppr features, improvements, and announcements.
@getpeppr/sdk 5.0.0 follows Peppol BIS Billing 3.0.21: BGN and HRK are gone, XCG is in. It also ships the structured API result contract and header-driven retryability, merged over the past week and unpublished until now.
Swedish senders no longer wait for a human to read their first invoice. Two national rules are now checked before the document leaves: a missing organisationsnummer returns 422 SE-R-003, and a standard VAT rate outside 6/12/25 % returns 422 SE-R-006. Both used to be accepted by us and rejected by the network afterwards.
On the six endpoints that read the header, a request that reaches the idempotency check with an empty or whitespace-only Idempotency-Key now returns 400 idempotency_key_blank. It used to be silently ignored, so retries were executed as new requests.
GET /identity now returns an O/0 or AE/0 integration profile derived from the sender's exact provider inventory. Unverifiable roles and unreadable inventories block instead of guessing.
getpeppr send now reads GET /identity before every sandbox submission, adapts generated fixtures to O/0 or AE/0, and refuses conflicting user files locally.
A platform customer whose Peppol scheme has no active validator now settles as unsupported_scheme instead of pending. SDK 4.7.0 adds the status and a matching legal_entity.unsupported_scheme webhook, so your UI can stop promising progress that is not happening.
CLI 0.8.4 moved generated fixtures to O/0 for routing-only senders. CLI 0.9.0 supersedes that static assumption by reading the sender's exact provider profile before every sandbox send.
importFile() takes a sender, so a platform can send a customer's raw UBL under that customer's Peppol identity. Until now the gateway only ever compared the document against your own company — and the SDK dropped the field without a word. If you build a platform on getpeppr and send raw UBL, upgrade.
getpeppr lookup GB:VAT:123456789 was split by position, producing scheme GB and value VAT:123456789 — both wrong, and silently. The gateway and the SDK were fixed in 4.4.0; the CLI carried its own copy of that logic and kept the old behaviour until now. Also rebundles SDK 4.5.0.
buildInvoiceXml turned GB:VAT:123456789 into schemeID="GB" — a scheme the network does not know. Both spellings of a scheme are now accepted everywhere and always resolved to the numeric EAS code. Sellers in the UK, Ireland and Germany were also hit by a second, unrelated rule: upgrade if you build UBL with the SDK.
POST /v1/invoices/import never read the amounts your document states, leaving total and amount due null for the life of the invoice. Both are now extracted.
The same UBL sent under two different Idempotency-Keys now returns 409 duplicate_document on POST /v1/invoices/import, as it already did on the JSON route.
New GET /v1/identity endpoint, peppol.identity.get() in the SDK and a getpeppr whoami command: any API key — standard keys included — can now read its own account's Peppol identity and registration status. Until today there was no API way to answer "is my identifier registered?".
@getpeppr/sdk 4.1.1 corrects a promise the SDK made in your editor: raw import does not preserve your document byte for byte. Your content does travel as written; the serialisation does not. If you seal documents, hash a canonical form.
@getpeppr/sdk 4.1.0 corrects four VAT rule identifiers that named real rules — just not the ones being checked — and validateSchematron() now reports what it covered.
A new invoice.delivery_unconfirmed webhook fires 30 minutes after a send with no delivery evidence, and a document still silent after 7 days is now reported as undeliverable instead of staying open forever.
@getpeppr/cli 0.7.1 rebundles SDK 4.1.1. Four VAT rule identifiers that named real rules — just not the ones being checked — were fixed in the SDK this morning; CLI users only receive them now, because the CLI bundles the SDK rather than importing it at runtime.
@getpeppr/sdk 4.0.0 stops inventing invoice statuses and the detail endpoint now returns the real one — waitFor() no longer expires on delivered invoices.
@getpeppr/sdk 3.2.0 and @getpeppr/cli 0.6.0 flag the VAT categories EN 16931 allows but getpeppr cannot route — before the send, not at the 422.
@getpeppr/sdk 3.1.0 types verificationDetail.registryStatus, the field that tells you a business registry knows a company and does not consider it active.
@getpeppr/sdk 3.0.0 removes GB:CRN — it is not a Peppol scheme — and rebuilds the UK VAT and German Leitweg-ID format rules against real network data.
@getpeppr/sdk 2.6.0 adds the countryRules field to the server validation result type, so TypeScript users can read the Dutch (and future) national-rule findings without a cast.
The gateway now auto-includes your KVK/OIN on Dutch invoices and rejects anything else the Dutch Peppol rules would kill — instantly, with the official rule code, instead of a silent failure after acceptance.
SDK 2.5.0 fixes directory.search() pagination metadata (totalCount/hasMore were undefined) and trims WebhookEventType to exactly what the gateway accepts.
getpeppr init now targets the sandbox test receiver. CLI 0.8.4 later completed the fresh-account send contract by changing the generated tax lines to O/0.
A monthly digest of EU e-invoicing mandates — deadlines, country rollouts and what they mean for your integration. First edition, the Belgium 2026 playbook, is out now.
SDK 2.4.0 validates French buyer identifiers before you send: SIREN/SIRET checksums (including the real La Poste rule) and the DGFiP VAT-key formula that catches typos offline.
SDK 2.3.0 rounds VAT once per tax group as EN 16931 requires, amountDue now always equals the UBL PayableAmount, and the new computeUblPayableAmount() derives the legal amount due without re-implementing the formula.
Marking a French-flow invoice as paid now emits the reform's payment_received_notification, and the new France guide covers identifiers, directory registration and statuses end to end.
GET /v1/invoices and the SDK now expose per-axis structured status detail (with native jurisdiction codes), waitFor() resolves instead of timing out when an invoice gets paid, and four webhook events land — including the opt-in invoice.status_changed with stable event ids.
A recipient's contact email is no longer used as a delivery fallback. Documents travel through the Peppol network only, and an unreachable recipient now fails explicitly instead of reporting a misleading "delivered".
A new invoice.undeliverable webhook event fires when a recipient cannot be found on the Peppol network, and the SDK's waitFor() and the CLI --watch now treat no_action as a terminal failure instead of waiting for a timeout.
The grace period is over. What Belgium's B2B e-invoicing mandate actually requires from your stack — and a TypeScript path to compliance.
French SIREN and SIRET numbers are now verified automatically, backed by INSEE Sirene, France's official business registry.
Check whether any company is registered on the Peppol network — by VAT, company number, or name. Free, instant, no account, and available as a public JSON API.
@getpeppr/sdk v2.0.0 fixes events.list() to return the real event shape, scopes the /v1/events feed to your API key's environment, and adds the peppol_identifier.* webhook types. Includes a breaking type change to EventEntry.
@getpeppr/sdk now types the legal_entity.registration_failed webhook fired when a sandbox Legal Entity verifies but cannot be registered on the Peppol network.
@getpeppr/sdk now types the inbound.* webhook events fired when you receive documents over the Peppol network.
@getpeppr/sdk now manages your customers as Peppol Legal Entities and sends invoices on their behalf — fully typed.
Swedish 0007 organisation numbers are now verified in real time against Bolagsverket, Sweden's official business registry.
Improved Belgian 0208 identifier handling and fixed the SDK directory lookup response shape.
Import ready-made n8n workflows for validating invoices, checking Peppol recipients, and sending invoices through getpeppr.
New Activity page in the dashboard — a tamper-proof audit trail that tracks API key creation, webhook changes, contact management, and more.
Three new commands for the getpeppr CLI: scaffold invoices, convert to UBL XML, and search the Peppol Directory — all without an account.
New changelog page in the console and news section on the website, powered by Markdown files.
Validate Peppol e-invoices from your terminal with @getpeppr/cli, now available on npm.
New contact fields for phone numbers and Peppol Directory metadata in @getpeppr/sdk.
Configure webhook endpoints to receive real-time notifications for invoice events with automatic retry on failure.