Peppol for
developers.
Send Peppol e-invoices from your app, or embed e-invoicing into your product. One API call. JSON in. Compliant UBL out.
# Create an account (no UI needed) curl -X POST https://api.peppol.sh/v1/signup \ -d '{"email": "dev@acme.com"}' # → {"api_key": "ps_test_a1b2c3...", "status": "sandbox"} # Send your first invoice curl https://sandbox.peppol.sh/v1/invoices \ -H "Authorization: Bearer ps_test_a1b2c3..." \ -d '{ "number": "INV-2026-001", "issue_date": "2026-03-01", "from": { "name": "Acme BVBA", "tax_id": "BE0123456789" }, "to": { "name": "TechCorp BV", "tax_id": "NL123456789B01" }, "lines": [{ "description": "Consulting Q1", "quantity": 1, "unit_price": 5000, "tax_rate": 21 }] }' # → {"id": "inv_a1b2c3", "status": "queued"} ✓
import Peppol from '@peppol-sh/node'; const peppol = new Peppol('ps_test_...'); await peppol.invoices.send({ number: "INV-2026-001", issue_date: "2026-03-01", from: { name: "Acme BVBA", tax_id: "BE0123456789" }, to: { name: "TechCorp BV", tax_id: "NL123456789B01" }, lines: [{ description: "Consulting Q1", quantity: 1, unit_price: 5000, tax_rate: 21 }] }); // → { id: "inv_a1b2c3", status: "queued" } ✓
from peppol_sh import Peppol peppol = Peppol("ps_test_...") peppol.invoices.send( number="INV-2026-001", issue_date="2026-03-01", from_={ "name": "Acme BVBA", "tax_id": "BE0123456789" }, to={ "name": "TechCorp BV", "tax_id": "NL123456789B01" }, lines=[{ "description": "Consulting Q1", "quantity": 1, "unit_price": 5000, "tax_rate": 21 }] ) # → Invoice(id="inv_a1b2c3", status="queued") ✓
use PeppolSh\Client; $peppol = new Client('ps_test_...'); $peppol->invoices->send([ 'number' => 'INV-2026-001', 'issue_date' => '2026-03-01', 'from' => [ 'name' => 'Acme BVBA', 'tax_id' => 'BE0123456789' ], 'to' => [ 'name' => 'TechCorp BV', 'tax_id' => 'NL123456789B01' ], 'lines' => [[ 'description' => 'Consulting Q1', 'quantity' => 1, 'unit_price' => 5000, 'tax_rate' => 21 ]] ]); // → {"id": "inv_a1b2c3", "status": "queued"} ✓
You send JSON. We handle Peppol.
No UBL schemas. No SMP lookups. No access point configuration. Just a simple API call to send compliant e-invoices.
JSON in, UBL out
Send a simple JSON payload. We convert to Peppol BIS 3.0 UBL, validate against the spec, and deliver via the Peppol network.
One call to send
No multi-step flows. POST to /v1/invoices and it's queued for delivery. Track status via webhooks or polling.
Sandbox from signup
Create an account via API, get a sandbox key instantly, and send test invoices in under a minute. No UI, no approval, no credit card.
EU e-invoicing mandates are here.
Structured e-invoicing is becoming mandatory across Europe. ViDA will require it EU-wide by 2030, and multiple member states already enforce it today. peppol.sh handles compliance automatically. EN 16931 validation. Peppol BIS 3.0. Certified Access Point.
Your invoices, or your users' invoices.
The same API supports both patterns. One Company per sender identity. Whether that's you or your customers.
Send your own invoices.
For companies sending Peppol invoices to their customers. Create one Company, start sending.
Embed Peppol into your product.
Add Peppol e-invoicing to your SaaS, ERP, or billing tool. One Company per tenant, same API. No per-tenant fees. No monthly minimum.
Fully API-driven. No dashboard required.
Create an account, send test invoices, and go live. All from your terminal or your AI agent. No browser needed.
Create an account via API
POST your email to /v1/signup and get a sandbox API key back instantly.
Send test invoices immediately
Use your ps_test_ key to send invoices. Sandbox delivers via email. Safe to experiment.
Submit KYC when ready
POST your company details to /v1/account/kyc. We verify your identity.
Go live on Peppol
After approval, create a ps_live_ key and your invoices are delivered via the real Peppol network.
# 1. Create account $ curl -X POST https://api.peppol.sh/v1/signup \ -d '{"email":"dev@acme.com"}' { "id": "ten_k8m2x9", "status": "sandbox", "api_key": "ps_test_a1b2c3d4e5..." } # 2. Send a test invoice $ curl https://sandbox.peppol.sh/v1/invoices \ -H "Authorization: Bearer ps_test_a1b2..." \ -d '{"number":"INV-001", ...}' { "id": "inv_f7g8h9", "status": "queued" } # 3. Submit KYC → 4. Create live key $ curl -X POST .../v1/account/kyc -d '...' $ curl -X POST .../v1/account/keys \ -d '{"sandbox": false}' { "api_key": "ps_live_x9y8z7..." }
Peppol e-invoicing for
every Stripe payment
Automatically send compliant Peppol e-invoices for your Stripe invoices. Install the app, configure your settings, and every invoice gets delivered via Peppol. No code changes required.
Everything you need to send Peppol
All features available via REST API. No SDK required.
Send invoices & credit notes
JSON or PDF upload. Two ways to send compliant documents via Peppol. One endpoint, one call.
POST /v1/invoicesAPI-first bootstrapping
Create an account, manage keys, and submit KYC. All via API. No dashboard needed. Perfect for automation.
POST /v1/signupSandbox from day zero
Every account starts in sandbox mode. Send unlimited test invoices via email before going live on Peppol.
ps_test_Delivery tracking
Know exactly when your invoice arrives. Webhooks for delivery events, or poll the status endpoint.
GET /v1/invoices/:idPeppol participant lookup
Check if a company is registered on Peppol before sending. Search by name or tax ID.
GET /v1/lookupAI-agent ready
SKILL.md included. AI agents can create accounts, send invoices, and track delivery autonomously.
Learn more →Pay per document. No surprises.
Send your first Peppol invoice in 30 seconds.
One curl to sign up. One curl to send. No UI, no approval, no credit card.
E-invoicing mandates are rolling out across Europe. Get ahead of compliance.
Start for free →