Skip to content
Built for AI agents — fully bootstrappable API →

Peppol for
developers.

Send Peppol e-invoices from your app in one API call. JSON in. Compliant UBL out. Delivered via Peppol.

send-invoice
# 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"} ✓
Works with your stack. browse all integrations →

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.

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.

1

Create an account via API

POST your email to /v1/signup and get a sandbox API key back instantly.

sandbox
2

Send test invoices immediately

Use your ps_test_ key to send invoices. Sandbox delivers via email. Safe to experiment.

sandbox
3

Submit KYC when ready

POST your company details to /v1/account/kyc. We verify your identity.

4

Go live on Peppol

After approval, create a ps_live_ key and your invoices are delivered via the real Peppol network.

live
terminal / bootstrapping
# 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..." }
Stripe App Marketplace

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.

Stripe
└→ invoice.finalized
└→ peppol.sh
JSON → UBL conversion
BIS 3.0 validation
└→ Peppol Network
└→ Customer AP
status: delivered ✓

Everything you need to send Peppol

A focused toolkit for sending compliant e-invoices to any company on the Peppol network.

Send invoices & credit notes

JSON or PDF upload. Two ways to send compliant documents via Peppol. One endpoint, one call.

API-first bootstrapping

Create an account, manage keys, and submit KYC. All via API. No dashboard needed. Perfect for automation.

Sandbox from day zero

Every account starts in sandbox mode. Send unlimited test invoices via email before going live on Peppol.

Delivery tracking

Know exactly when your invoice arrives. Webhooks for delivery events, or poll the status endpoint.

Peppol participant lookup

Check if a company is registered on Peppol before sending. Search by name or tax ID.

AI-agent ready

SKILL.md included. AI agents can create accounts, send invoices, and track delivery autonomously.

Certified Peppol Access Point
Peppol Security Committee member
99.5% uptime SLA
EU data residency
EN 16931 compliant

Pay per document sent. No surprises.

0.25/ invoice sent
Free sandbox foreverNo monthly feesAll SDKs includedVolume discounts
View pricing details →

Send your first Peppol invoice in 30 seconds.

One curl to sign up. One curl to send. No UI, no approval, no credit card.

Start for free →
curl -X POST https://api.peppol.sh/v1/signup -d '{"email": "you@company.com"}'