Skip to content

await peppol.invoices.send(invoice)

The Peppol API that reads the rulebook, so your code doesn't.

Send and receive e-invoices on the Peppol network from your software. One call submits an invoice under a verified sender identity, with the pre-send checks that apply to it; waitFor() or a webhook then tells you when the receiver's access point has it.

Built for software that invoices for many companies. Each customer you onboard sends under its own registered company identity.

You drive each customer's Peppol registration with a few API calls; getpeppr runs the regulated steps: ID verification and, in production, the customer's confirmation on a page we host.

No credit card for the sandbox.

  1. C1Your software
  2. C2getpeppr
  3. C3 · C4Receiver
import { Peppol } from "@getpeppr/sdk";
const peppol = new Peppol({ apiKey: "sk_sandbox_..." }); // master key

const invoice = await peppol.invoices.send({
  sender: { externalSubTenantId: "customer_8412" }, // your customer
  number: "INV-2026-001", buyerReference: "INV-2026-001",
  to: { peppolId: "9925:BE0314595348", // sandbox test receiver
    name: "SPF Economie (test receiver)", street: "Rue du Progrès 50",
    city: "Brussels", postalCode: "1210", country: "BE" },
  lines: [{ description: "Consulting", quantity: 1, unitPrice: 90,
    // sandbox: "AE" if this test customer has a VAT number
    vatRate: 0, vatCategory: "O" }],
});

await peppol.invoices.waitFor(invoice.id, "delivered", {
  timeout: 600_000, // 10 min: a sandbox delivery can take minutes
});
Checked before sending
delivered

The receiver's Peppol access point has the invoice.

Sandbox send to the test receiver · statuses from send() and waitFor()

# A conversation in Claude Code: what you type, the tools it calls, its answer.Codex, Cursor

$ claude mcp add --transport http getpeppr https://api.getpeppr.dev/mcp

You

Send a sandbox test invoice of EUR 90 and tell me when it's delivered.

tools called

send_test_invoice → submitted

get_document_status → delivered

Assistant

Delivered to the sandbox test receiver 9925:BE0314595348 on the Peppol test network. Sandbox only: nothing was sent in production.

Needs a free getpeppr account with your company registered. You sign in, no key to copy: /mcp in Claude Code, codex mcp login getpeppr in Codex; Cursor uses /mcp/auth.

Free sandbox. Your company: from EUR 49/mo, all prices excl. VAT. Compare plans

Before a send
JSON invoices get the pre-send checks that apply to them: required fields, VAT category codes, and the national checks our cartridge for the sender's country holds. Compliance gates
From an assistant
Claude Code or Codex sends test invoices through our hosted MCP server, with a free account and no API key to copy. MCP docs, Claude's directory (opens in a new tab)
Verified identities
Peppol identifiers are checked against a verification source before any live send, in 11 countries today. Countries, ID verification

Every identifier behind these words is a real rule of the Peppol rulebooks, BIS Billing 3.0 release v3.0.21, network and national families alike, or a scheme the lookup offers.

Try it from your terminal or your AI assistant

Validate invoices and look up receivers with no account, from your terminal, Claude Code or Codex. To send a test invoice, create a free account and register your company; your assistant then signs in, and everything it sends goes only to the sandbox test receiver.

SDK 6.4.0, CLI 0.14.2, latest on npm.

No terminal to hand? Check a receiver in your browser: the same Peppol Directory lookup, free.

Terminal

No account, no API key

Terminal
  1. # writes a starter invoice.json

    npx @getpeppr/cli init
  2. # offline pre-flight checks, not a Peppol conformance verdict

    npx @getpeppr/cli validate invoice.json
  3. # reads the public Peppol Directory

    npx @getpeppr/cli lookup 0208:0685660237

To send, store a free sandbox key with npx @getpeppr/cli login --sandbox, then send with the CLI.

AI assistant

Hosted MCP server, nothing to install

AI assistant
  1. # Claude Code

    claude mcp add --transport http getpeppr https://api.getpeppr.dev/mcp
  2. # Codex

    codex mcp add getpeppr --url https://api.getpeppr.dev/mcp
  • Claude Code: Sign in later with /mcp when an account tool asks.
  • Codex: Run codex mcp login getpeppr before the account tools.

Cursor and Claude (web & desktop) connect through https://api.getpeppr.dev/mcp/auth and ask you to sign in to getpeppr when you connect.

Without an account, your assistant can check whether a company is on Peppol, validate a sample invoice, plan your integration and find the documentation page that answers a question. With a free account, it can send a test invoice to the sandbox test receiver and follow it until it is delivered or failed. Cursor and Claude (web & desktop) sign in when they connect. Every tool, in the MCP docs

A test send goes only to the sandbox test receiver 9925:BE0314595348 (SPF Economie); any other receiver and any production key (sk_live_…) are refused. Going live happens in the console and in your own code. Give it sample or test invoices only, never a real invoice or real people's data. Listed in the MCP Registry as dev.getpeppr/mcp.

Invoice from 11 countries today

Peppol is one network, but every country decides how a company proves who it is. Where we can check that automatically, you sign up and send. Where we can't, we do it with you.

On getpeppr today: French regulated CTC not yet open in production.

Self-serve · 11 countries

  • Francenetwork rules only
  • Belgiumnetwork rules only
  • Irelandnetwork rules only
  • United Kingdomnetwork rules only
  • NetherlandsNL-R-001 NL-R-002 NL-R-003 NL-R-004 NL-R-005 NL-R-006 NL-R-007 NL-R-008 NL-R-009
  • DenmarkDK-R-002 DK-R-014 DK-R-016 DK-R-013 DK-R-005 DK-R-006 DK-R-007 DK-R-008 DK-R-009 DK-R-010 DK-R-011 DK-R-017 DK-R-003 DK-R-004
  • GermanyDE-R-001 DE-R-015 DE-R-016 DE-R-017 DE-R-018 DE-R-022 DE-R-026 DE-R-030 DE-R-031 DE-R-T02 DE-R-002 DE-R-003 DE-R-004 DE-R-005 DE-R-006 DE-R-007 DE-R-027 DE-R-028 DE-R-008 DE-R-009 DE-R-010 DE-R-011 DE-R-019 DE-R-023-1 DE-R-023-2 DE-R-024-1 DE-R-024-2 DE-R-020 DE-R-025-1 DE-R-025-2 DE-R-014
  • SwedenSE-R-001 SE-R-002 SE-R-003 SE-R-004 SE-R-013 SE-R-005 SE-R-006 SE-R-007 SE-R-010 SE-R-008 SE-R-009 SE-R-011 SE-R-012
  • NorwayNO-R-002 NO-R-001Sending: VAT-registered companies only
  • Estonianetwork rules only
  • IcelandIS-R-001 IS-R-002 IS-R-003 IS-R-006 IS-R-007 IS-R-008 IS-R-009 IS-R-010 IS-R-004 IS-R-005

Sign up and send on your own. We check your declared Peppol identifier automatically through the relevant verification source. No call with us and no manual approval on our side — you set yourself up from the console.

Legal mandates

What the law requires, country by country, with the date a government has fixed. Product coverage above; the law here.

Belgium
Live, B2B mandate since 1 Jan 2026. Structured invoices via Peppol BIS for Belgian VAT-taxable B2B.
Germany
Receive live, since 1 Jan 2025. Issuing obligations phase in after transitional periods.
France
Receive mandate live, since 1 Sept 2026. All receive since 1 Sept 2026; large and mid-sized businesses issue since then, SMEs follow on 1 Sept 2027.

Regulation moves. You keep one API.

getpeppr is built on Storecove, a certified Peppol Access Point. When BIS 3.0, a country's rules or the network change, we update the gateway and the SDK: your API keeps its shape.

Peppol Access Point partnerStorecove (opens in a new tab)
A certified backbone
Storecove is a certified Peppol Access Point on the Peppol network. We track BIS 3.0 updates and country rules in the gateway and the SDK; the changelog says when one changes what you can send.
A layer per country
As each country opens on getpeppr, we ship its layer: identifier schemes, validation rules, national extensions. Same API; a new rule can refuse a value the network no longer accepts, and a new country may ask for a field of its own. The France guide walks through the newest one.
The EU calendar
BIS 3.0 today, with country rules for the countries we serve. Next on the EU calendar: ViDA Digital Reporting Requirements for cross-border B2B, from 1 July 2030.

One platform account. Every customer its own identity.

Your customers each keep their own Peppol identity. Your team keeps one integration. getpeppr models that directly: provision a customer, capture authorisation, send on their behalf, and listen for lifecycle webhooks.

No XML in your product, no access-point operations in your backlog, and no per-customer onboarding loop rebuilt from scratch.

Read the Peppol API integration guide, or see how it compares with other Peppol APIs for a multi-tenant SaaS.

Your SaaS platformone master API keysend asCustomer AOwn Peppol identityCustomer BOwn authorisationCustomer COwn lifecycle statusJSON in, UBL outgetpepprVerification of each identity, UBL and BIS 3.0, Peppol delivery, webhooks.one gateway, one bill

Peppol API comparison

Five providers compared on tenant model, tooling, pricing, onboarding, and market focus. The source-checked guide explains where each one fits.

getpepprYou are here

SDKs:
TypeScript + CLI + hosted MCP server (sandbox)
Pricing:
Business from EUR 49/mo + usage; Platform: one plan at EUR 99/mo + usage, 50 Legal Entities included, no per-customer minimum
Countries:
Belgium + France + Ireland + UK + Netherlands + Denmark + Germany + Sweden + Norway + Estonia + Iceland self-serve · French regulated CTC not yet open in production
Self-Service:
Sandbox self-serve; Platform production contract-gated
Evaluation path:
Free sandbox + offline CLI + AI assistant via hosted MCP

peppol.sh

SDKs:
REST/OpenAPI + code samples; TypeScript SDK published on npm (0.1.0), Python and PHP announced as coming soon
Pricing:
Personal EUR 0.20/document; Connect EUR 0.16→0.10 (EUR 250 top-up)
Countries:
Developer- and agent-first Peppol
Self-Service:
Yes (API-created sandbox)
Evaluation path:
Instant API-created sandbox

e-invoice.be

SDKs:
5 languages (TS, Python, PHP, Ruby, Java) + MCP
Pricing:
From EUR 0.25/invoice; Enterprise from EUR 0.18
Countries:
Belgian certified AP; claims 30+ reachable countries
Self-Service:
Yes
Evaluation path:
Free sandbox, no sales call

Storecove

SDKs:
RESTful JSON API + OpenAPI/Swagger
Pricing:
Quote required
Countries:
31-country compliance; Peppol + DBNAlliance
Self-Service:
30-day test account by request
Evaluation path:
Requested 30-day sandbox

Basware

SDKs:
Network REST API + XML integrations
Pricing:
Subscription; contact Basware
Countries:
Global network
Self-Service:
Support-provisioned test account
Evaluation path:
Testing account via Basware Support

See the full Peppol API comparison, with its sources and the date each provider was checked.

Pricing, written down

Start free in the sandbox. Pay when you go live, for what you send and receive.

Business plans run from a free sandbox to EUR 399/month. The Platform plan lets SaaS products send and receive on behalf of their customer companies, with 50 companies included and no per-customer minimum.

For companies sending their own Peppol invoices.

∞test docs

sk_sandbox_… keys, the sandbox test receiver only

Sandbox

Free/forever

Test everything. No credit card required.

  • Unlimited test documents
  • Full SDK access
  • Sandbox environment
  • Validation API
  • Documentation & guides
Start Building

No credit card. No time limit.

100docs / month

then EUR 0.25/doc, sent or received

Starter

EUR 49/mo

For developers and early-stage SaaS.

  • 100 documents included (sent + received)
  • Live Peppol delivery
  • Webhooks & events
  • Email support (< 24h)
  • Management dashboard
  • Up to 3 team members

800docs / month

then EUR 0.22/doc, sent or received

Pro

EUR 149/mo

For growing businesses.

  • 800 documents included (sent + received)
  • Live Peppol delivery
  • Webhooks & events
  • Management dashboard
  • Email support (< 24h)
  • Up to 10 team members

2,000docs / month

then EUR 0.20/doc, sent or received

Business

EUR 399/mo

For high-volume document exchange.

  • 2,000 documents included (sent + received)
  • Live Peppol delivery
  • Webhooks & events
  • Management dashboard
  • Priority email support
  • Up to 25 team members

All prices in EUR, excluding VAT. Business plans have no setup fees. Platform production access is contract-gated. Usage counts documents both sent and received.

Questions developers ask first

The answers below are the same ones search engines and AI assistants read from this page.

Which countries can I send invoices to?

Any participant on the Peppol network, wherever it is registered — that part does not depend on where you are. What does depend on your country is where you can invoice FROM. We check your declared Peppol identifier automatically through the relevant verification source. You are self-serve in France, Belgium, Ireland, the United Kingdom, the Netherlands, Denmark, Germany, Sweden, Norway, Estonia and Iceland today. The coverage page at getpeppr.dev/countries has the full list.

Is the sandbox really free?

Yes. Free forever, unlimited test documents, no credit card required. When you're ready to go live, plans start at EUR 49/month.

Do I need to understand Peppol or UBL?

No. Send JSON: getpeppr checks it before it leaves and sends it over Peppol through our access-point provider, which generates the UBL. Zero XML knowledge required.

Can my AI assistant send invoices?

Test invoices only. With a free getpeppr account and your own company registered, your AI assistant can send a sandbox test invoice to the sandbox test receiver (9925:BE0314595348, SPF Economie) and follow its status until it is delivered or failed. The MCP server never sends in production and refuses production keys (sk_live_…); real invoices go out from your own code with a production key.

Is getpeppr production-ready?

Yes. We run on Storecove's certified Peppol Access Point and production sending is enabled. Our SDK and gateway carry 15,000+ automated tests and are built for Peppol BIS 3.0.

What is the SaaS Platform plan for?

It is for SaaS products that send and receive Peppol documents on behalf of many customer companies. Each customer company you register for production counts as one Legal Entity. There is one Platform plan: EUR 99 a month plus EUR 0.25 per document, with 50 Legal Entities included, then EUR 1 per registered Legal Entity per month beyond them. There is no per-customer minimum and no setup fee.

Can SaaS platforms go live self-serve?

Sandbox is free, needs no agreement and is self-serve: an organisation admin chooses “A platform for my customers” at signup, or starts the platform sandbox trial later from the console overview, then creates the sandbox master key in the console. Production platform access is contract-gated — we enable it after a signed platform agreement and DPA, so responsibilities, the entity count you are billed on, and data processing terms are clear before live customer sending.

How is platform usage billed?

One central bill for the whole platform, never one per customer: the EUR 99 platform fee, EUR 0.25 per document sent or received in production, and EUR 1 per month for each registered customer Legal Entity beyond the 50 included. Accrued usage is charged when it reaches EUR 50, so small volumes never produce noisy micro-charges. There is no per-customer setup fee and no per-customer minimum. Sandbox is free, self-serve and needs no agreement.

How does getpeppr compare to building with raw Peppol?

A typical Peppol integration takes 3–5 weeks: reading UBL 2.1 specs, implementing XML generation, handling AS4 protocol, and managing BIS 3.0 validation rules. With getpeppr, you send JSON and we handle everything. Most developers send their first test invoice in minutes, not weeks.

Ready to send your first Peppol invoice?

Validate locally or create a free sandbox. No credit card, full SDK access.

npm install @getpeppr/sdk

Free sandbox, no time limit. Production access follows the plan you choose.