PHP developers already have good libraries to generate a Peppol UBL invoice:
num-num/ubl-invoice and josemmo/einvoicing are widely used for that.
What they leave open is the next step: sending that XML over the Peppol network.
getpeppr/getpeppr-php covers that step.
composer require getpeppr/getpeppr-php
use Getpeppr\Client;
$getpeppr = new Client((string) getenv('GETPEPPR_API_KEY'));
$sent = $getpeppr->importInvoice(
$xml, // the UBL you generated
'INV-2026-001.xml',
'9925:BE0314595348', // the recipient's Peppol id
idempotencyKey: $operationId, // one opaque id per logical send
);
echo $sent->providerDocumentId;
getpeppr validates the document against the official Peppol rulebooks and delivers it to the recipient's access point. The package never rewrites, repairs or regenerates it.
What version 0.1 does
- Sends a UBL Invoice or CreditNote, for your own company or, with a master key, for one of your platform's customers.
- Reads a document's status.
- Creates, lists and reads your platform's customers (Legal Entities).
- Verifies webhook signatures in constant time, and returns the event
idyou need to handle redeliveries once. - Tells you what to do when a call fails: each exception class says whether resending
can succeed. A document that breaks a Peppol rule and an account that may not send yet both
answer
retryable: false, yet one must be fixed and the other kept: the package tells them apart from theGetpeppr-Remediationheader, not fromretryable.
It is a PSR-18 client: it uses the HTTP client your application already has, never retries on its own, writes no logs, and keeps your API key, the document and the invoice number out of every exception message. Version 0.1.0 needs PHP 8.2 or later and is tested up to 8.5.
What it does not do
It does not generate UBL, and it is not a port of the TypeScript SDK. To send invoices
described as JSON, use the API directly or @getpeppr/sdk. Countries and document types are
those of the getpeppr service: see Countries.
Get started
- Documentation: getpeppr.dev/docs/php
- Source, examples and issues: github.com/zerolooplabs/getpeppr-php
- The sandbox is free and permanent: documents travel on the Peppol test network.