---
title: "Validate, Generate & Send Peppol E-Invoice API"
slug: validate-generate-send-peppol-e-invoices
url: https://apyhub.com/corsair96/service/validate-generate-send-peppol-e-invoices
provider: API Forge
categories: [Document Intelligence Kit, Verification Kit]
tags: [e-invoicing, peppol, invoice-validation, invoice-generation, ubl, cii]
auth: api_key
version: 0.2.0
service_type: sync
endpoints: 4
atoms: 1-10
mcp: true
---

# Validate, Generate & Send Peppol E-Invoice API

Validate invoice data, generate UBL or CII documents, and submit invoices to Peppol. Get totals, validation results, and delivery status back.

## Endpoints

| Method | URL | Description | Atoms |
| --- | --- | --- | --- |
| POST | `https://api.eu.apyhub.com/corsair96/validate-generate-send-peppol-e-invoices/v1/invoices` | What it does Generates an electronic invoice from the invoice data in the request body and returns… | 10 |
| POST | `https://api.eu.apyhub.com/corsair96/validate-generate-send-peppol-e-invoices` | What it does Validates an invoice payload without generating the invoice. It accepts the invoice de… | 10 |
| POST | `https://api.eu.apyhub.com/corsair96/validate-generate-send-peppol-e-invoices/send` | What it does Submits an invoice to Peppol for dispatch. It takes a path id and a request body conta… | 10 |
| GET | `https://api.eu.apyhub.com/corsair96/validate-generate-send-peppol-e-invoices/status` | What it does Retrieves the sending status for a specific invoice sending resource identified by id.… | 1 |

## Endpoint reference

### Generate an electronic invoice

`POST https://api.eu.apyhub.com/corsair96/validate-generate-send-peppol-e-invoices/v1/invoices` · 10 atoms · accepts `application/json` · returns `application/json`

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `note` | body | string | no |  |
| `buyer.name` | body | string | yes |  |
| `buyer.taxId` | body | string | no |  |
| `buyer.vatId` | body | string | yes | Example: `FR12345678901`. |
| `buyer.address.city` | body | string | yes |  |
| `buyer.address.street` | body | string | no |  |
| `buyer.address.postalCode` | body | string | yes |  |
| `buyer.address.countryCode` | body | string | yes | Example: `FR`. |
| `buyer.address.additionalStreet` | body | string | no |  |
| `buyer.address.countrySubdivision` | body | string | no |  |
| `buyer.contact.name` | body | string | no |  |
| `buyer.contact.email` | body | string | no |  |
| `buyer.contact.phone` | body | string | no |  |
| `buyer.legalId.value` | body | string | yes |  |
| `buyer.legalId.scheme` | body | string | no |  |
| `buyer.tradingName` | body | string | no |  |
| `buyer.identifications` | body | array of object | no |  |
| `buyer.identifications[].value` | body | string | yes |  |
| `buyer.identifications[].scheme` | body | string | no |  |
| `buyer.electronicAddress.value` | body | string | yes | Example: `1234567890123`. |
| `buyer.electronicAddress.scheme` | body | string | yes | Example: `0088`. |
| `lines` | body | array of object | yes |  |
| `lines[].id` | body | string | no |  |
| `lines[].name` | body | string | yes |  |
| `lines[].note` | body | string | no |  |
| `lines[].charge.amount` | body | any | no |  |
| `lines[].charge.reason` | body | string | no |  |
| `lines[].charge.percent` | body | any | no |  |
| `lines[].vatRate` | body | any | yes | Example: `20`. |
| `lines[].discount.amount` | body | any | no |  |
| `lines[].discount.reason` | body | string | no |  |
| `lines[].discount.percent` | body | any | no |  |
| `lines[].itemCode.value` | body | string | yes |  |
| `lines[].itemCode.scheme` | body | string | no |  |
| `lines[].quantity` | body | any | yes | Example: `10`. |
| `lines[].unitCode` | body | string | no | Default: `C62`. |
| `lines[].unitPrice` | body | any | yes | Example: `100.00`. |
| `lines[].description` | body | string | no |  |
| `lines[].vatCategory` | body | string | no | One of: S, Z, E, AE, K, G, O, L, M. |
| `lines[].exemptionReason` | body | string | no |  |
| `lines[].exemptionReasonCode` | body | string | no |  |
| `number` | body | string | yes | Example: `INV-2026-0042`. |
| `seller.name` | body | string | yes |  |
| `seller.taxId` | body | string | no |  |
| `seller.vatId` | body | string | yes | Example: `FR12345678901`. |
| `seller.address.city` | body | string | yes |  |
| `seller.address.street` | body | string | no |  |
| `seller.address.postalCode` | body | string | yes |  |
| `seller.address.countryCode` | body | string | yes | Example: `FR`. |
| `seller.address.additionalStreet` | body | string | no |  |
| `seller.address.countrySubdivision` | body | string | no |  |
| `seller.contact.name` | body | string | no |  |
| `seller.contact.email` | body | string | no |  |
| `seller.contact.phone` | body | string | no |  |
| `seller.legalId.value` | body | string | yes |  |
| `seller.legalId.scheme` | body | string | no |  |
| `seller.tradingName` | body | string | no |  |
| `seller.identifications` | body | array of object | no |  |
| `seller.identifications[].value` | body | string | yes |  |
| `seller.identifications[].scheme` | body | string | no |  |
| `seller.electronicAddress.value` | body | string | yes | Example: `1234567890123`. |
| `seller.electronicAddress.scheme` | body | string | yes | Example: `0088`. |
| `dueDate` | body | string (date) | no |  |
| `payment.bic` | body | string | no |  |
| `payment.iban` | body | string | no |  |
| `payment.meansCode` | body | string | no | Default: `30`. |
| `payment.reference` | body | string | no |  |
| `payment.accountName` | body | string | no |  |
| `profile` | body | string | no | One of: basic, en16931, extended. |
| `currency` | body | string | yes | Example: `EUR`. |
| `delivery.date` | body | string (date) | no |  |
| `delivery.address.city` | body | string | yes |  |
| `delivery.address.street` | body | string | no |  |
| `delivery.address.postalCode` | body | string | yes |  |
| `delivery.address.countryCode` | body | string | yes | Example: `FR`. |
| `delivery.address.additionalStreet` | body | string | no |  |
| `delivery.address.countrySubdivision` | body | string | no |  |
| `delivery.partyName` | body | string | no |  |
| `issueDate` | body | string (date) | yes |  |
| `documentType` | body | string | no | One of: invoice, credit_note. |
| `paymentTerms` | body | string | no |  |
| `buyerReference` | body | string | yes | Example: `PO-2026-0150`. |
| `orderReference` | body | string | no |  |
| `projectReference` | body | string | no |  |
| `contractReference` | body | string | no |  |

#### Quickstart

Create a generated e-invoice from the required invoice, seller, buyer, and line item details.

```bash
curl -X POST "https://api.eu.apyhub.com/corsair96/validate-generate-send-peppol-e-invoices/v1/invoices" \
  -H "apy-token: $APY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "number": "INV-2026-0042",
    "issueDate": "2026-01-15",
    "currency": "EUR",
    "buyerReference": "PO-2026-0150",
    "seller": {
      "name": "Acme Supplies SAS",
      "vatId": "FR12345678901",
      "address": {
        "city": "Paris",
        "postalCode": "75010",
        "countryCode": "FR"
      }
    },
    "buyer": {
      "name": "Bluebird Retail SARL",
      "vatId": "FR10987654321",
      "address": {
        "city": "Lyon",
        "postalCode": "69002",
        "countryCode": "FR"
      }
    },
    "lines": [
      {
        "name": "Consulting services",
        "quantity": 10,
        "unitPrice": "100.00",
        "vatRate": "20"
      }
    ]
  }'
```

#### What you'll get back

Returns a JSON object with invoice metadata, generated document files, totals, and validation details. Top-level fields include `createdAt`, `currency`, `documentType`, `documents`, `dueDate`, `id`, `issueDate`, `number`, `profile`, `status`, `totals`, and `validation`.

```json
{
  "createdAt": "2026-01-15T10:30:00Z",
  "currency": "EUR",
  "documentType": "invoice",
  "documents": [],
  "dueDate": "2026-02-14",
  "id": "inv_12345",
  "issueDate": "2026-01-15",
  "number": "INV-2026-0042",
  "profile": "en16931",
  "status": "generated",
  "totals": {},
  "validation": {}
}
```

### Validate an invoice without generating it

`POST https://api.eu.apyhub.com/corsair96/validate-generate-send-peppol-e-invoices` · 10 atoms · accepts `application/json` · returns `application/json`

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `note` | body | string | no |  |
| `buyer.name` | body | string | yes |  |
| `buyer.taxId` | body | string | no |  |
| `buyer.vatId` | body | string | yes | Example: `FR12345678901`. |
| `buyer.address.city` | body | string | yes |  |
| `buyer.address.street` | body | string | no |  |
| `buyer.address.postalCode` | body | string | yes |  |
| `buyer.address.countryCode` | body | string | yes | Example: `FR`. |
| `buyer.address.additionalStreet` | body | string | no |  |
| `buyer.address.countrySubdivision` | body | string | no |  |
| `buyer.contact.name` | body | string | no |  |
| `buyer.contact.email` | body | string | no |  |
| `buyer.contact.phone` | body | string | no |  |
| `buyer.legalId.value` | body | string | yes |  |
| `buyer.legalId.scheme` | body | string | no |  |
| `buyer.tradingName` | body | string | no |  |
| `buyer.identifications` | body | array of object | no |  |
| `buyer.identifications[].value` | body | string | yes |  |
| `buyer.identifications[].scheme` | body | string | no |  |
| `buyer.electronicAddress.value` | body | string | yes | Example: `1234567890123`. |
| `buyer.electronicAddress.scheme` | body | string | yes | Example: `0088`. |
| `lines` | body | array of object | yes |  |
| `lines[].id` | body | string | no |  |
| `lines[].name` | body | string | yes |  |
| `lines[].note` | body | string | no |  |
| `lines[].charge.amount` | body | any | no |  |
| `lines[].charge.reason` | body | string | no |  |
| `lines[].charge.percent` | body | any | no |  |
| `lines[].vatRate` | body | any | yes | Example: `20`. |
| `lines[].discount.amount` | body | any | no |  |
| `lines[].discount.reason` | body | string | no |  |
| `lines[].discount.percent` | body | any | no |  |
| `lines[].itemCode.value` | body | string | yes |  |
| `lines[].itemCode.scheme` | body | string | no |  |
| `lines[].quantity` | body | any | yes | Example: `10`. |
| `lines[].unitCode` | body | string | no | Default: `C62`. |
| `lines[].unitPrice` | body | any | yes | Example: `100.00`. |
| `lines[].description` | body | string | no |  |
| `lines[].vatCategory` | body | string | no | One of: S, Z, E, AE, K, G, O, L, M. |
| `lines[].exemptionReason` | body | string | no |  |
| `lines[].exemptionReasonCode` | body | string | no |  |
| `number` | body | string | yes | Example: `INV-2026-0042`. |
| `seller.name` | body | string | yes |  |
| `seller.taxId` | body | string | no |  |
| `seller.vatId` | body | string | yes | Example: `FR12345678901`. |
| `seller.address.city` | body | string | yes |  |
| `seller.address.street` | body | string | no |  |
| `seller.address.postalCode` | body | string | yes |  |
| `seller.address.countryCode` | body | string | yes | Example: `FR`. |
| `seller.address.additionalStreet` | body | string | no |  |
| `seller.address.countrySubdivision` | body | string | no |  |
| `seller.contact.name` | body | string | no |  |
| `seller.contact.email` | body | string | no |  |
| `seller.contact.phone` | body | string | no |  |
| `seller.legalId.value` | body | string | yes |  |
| `seller.legalId.scheme` | body | string | no |  |
| `seller.tradingName` | body | string | no |  |
| `seller.identifications` | body | array of object | no |  |
| `seller.identifications[].value` | body | string | yes |  |
| `seller.identifications[].scheme` | body | string | no |  |
| `seller.electronicAddress.value` | body | string | yes | Example: `1234567890123`. |
| `seller.electronicAddress.scheme` | body | string | yes | Example: `0088`. |
| `dueDate` | body | string (date) | no |  |
| `payment.bic` | body | string | no |  |
| `payment.iban` | body | string | no |  |
| `payment.meansCode` | body | string | no | Default: `30`. |
| `payment.reference` | body | string | no |  |
| `payment.accountName` | body | string | no |  |
| `profile` | body | string | no | One of: basic, en16931, extended. |
| `currency` | body | string | yes | Example: `EUR`. |
| `delivery.date` | body | string (date) | no |  |
| `delivery.address.city` | body | string | yes |  |
| `delivery.address.street` | body | string | no |  |
| `delivery.address.postalCode` | body | string | yes |  |
| `delivery.address.countryCode` | body | string | yes | Example: `FR`. |
| `delivery.address.additionalStreet` | body | string | no |  |
| `delivery.address.countrySubdivision` | body | string | no |  |
| `delivery.partyName` | body | string | no |  |
| `issueDate` | body | string (date) | yes |  |
| `documentType` | body | string | no | One of: invoice, credit_note. |
| `paymentTerms` | body | string | no |  |
| `buyerReference` | body | string | yes | Example: `PO-2026-0150`. |
| `orderReference` | body | string | no |  |
| `projectReference` | body | string | no |  |
| `contractReference` | body | string | no |  |

#### Quickstart

Validate an invoice by sending the required invoice fields as JSON.

```bash
curl -X POST "https://api.eu.apyhub.com/corsair96/validate-generate-send-peppol-e-invoices" \
  -H "apy-token: $APY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "number": "INV-2026-0042",
    "issueDate": "2026-01-15",
    "currency": "EUR",
    "buyerReference": "PO-2026-0150",
    "seller": {
      "name": "Acme Supplies SAS",
      "vatId": "FR12345678901",
      "address": {
        "city": "Paris",
        "postalCode": "75001",
        "countryCode": "FR"
      }
    },
    "buyer": {
      "name": "Northwind Trading Ltd",
      "vatId": "FR12345678901",
      "address": {
        "city": "Lyon",
        "postalCode": "69002",
        "countryCode": "FR"
      }
    },
    "lines": [
      {
        "name": "Consulting services",
        "quantity": 10,
        "unitPrice": "100.00",
        "vatRate": "20"
      }
    ]
  }'
```

#### What you'll get back

Returns a JSON object with `valid` and `validation` fields, plus an optional `totals` object. `valid` is a boolean; `validation` is an object with its own `valid`, `ruleset`, `errorCount`, `violations`, and `warningCount` fields; `totals` contains invoice amount breakdown fields such as `lineNetAmount`, `taxTotalAmount`, and `payableAmount`.

```json
{
  "valid": true,
  "validation": {
    "valid": true,
    "ruleset": "en16931",
    "errorCount": 0,
    "violations": [],
    "warningCount": 0
  },
  "totals": {
    "lineNetAmount": "1000.00",
    "taxTotalAmount": "200.00",
    "payableAmount": "1200.00"
  }
}
```

### Submit an invoice to Peppol

`POST https://api.eu.apyhub.com/corsair96/validate-generate-send-peppol-e-invoices/send` · 10 atoms · accepts `application/json` · returns `application/json`

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `webhookUrl` | body | string | no | Optional outbound webhook URL for status callbacks |
| `buyerEndpoint` | body | string | yes | Example: `0002:DE999999999`. |
| `invoiceNumber` | body | string | yes | Example: `FAC-2026-0042`. |
| `sellerEndpoint` | body | string | yes | Example: `0192:55210854117`. |
| `id` | path | string | yes |  |

#### Quickstart

Send an invoice dispatch request with the invoice ID in the path and the required invoice details in the JSON body.

```bash
curl -X POST "https://api.eu.apyhub.com/corsair96/validate-generate-send-peppol-e-invoices/send" \
  -H "apy-token: $APY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "invoiceNumber": "FAC-2026-0042",
    "sellerEndpoint": "0192:55210854117",
    "buyerEndpoint": "0002:DE999999999"
  }'
```

#### What you'll get back

Returns a JSON object with `dispatchedAt`, `invoiceId`, `messageId`, `mode`, and `status` fields. `dispatchedAt` is a date-time string, `invoiceId` and `messageId` are strings, `mode` is a string, and `status` is either `"pending"` or `"sent"`.

```json
{
  "dispatchedAt": "2026-01-15T10:30:00Z",
  "invoiceId": "inv_12345",
  "messageId": "msg_67890",
  "mode": "production",
  "status": "sent"
}
```

### Retrieve the sending status

`GET https://api.eu.apyhub.com/corsair96/validate-generate-send-peppol-e-invoices/status` · 1 atoms · accepts `application/json` · returns `application/json`

| Parameter | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `id` | path | string | yes |  |

#### Quickstart

Fetch the status for a specific invoice by replacing the path parameter value in the URL.

```bash
curl -X GET "https://api.eu.apyhub.com/corsair96/validate-generate-send-peppol-e-invoices/status" \
  -H "apy-token: $APY_TOKEN"
```

#### What you'll get back

Returns a JSON object with these top-level fields: `createdAt`, `id`, `invoiceNumber`, `status`, `statusHistory`, and `updatedAt`.

- `createdAt`, `updatedAt`: date-time strings
- `id`, `invoiceNumber`: strings
- `status`: one of `pending`, `sent`, `delivered`, `accepted`, or `rejected`
- `statusHistory`: an array of objects with `at`, `detail`, and `status` fields

```json
{
  "createdAt": "2026-10-29T12:00:00Z",
  "id": "inv_12345",
  "invoiceNumber": "INV-1001",
  "status": "sent",
  "statusHistory": [
    {
      "at": "2026-10-29T12:05:00Z",
      "detail": "Invoice sent to recipient",
      "status": "sent"
    }
  ],
  "updatedAt": "2026-10-29T12:05:00Z"
}
```

## About

## What it does
E Invoicing API lets you validate, generate, and track electronic invoices, then submit them to Peppol for delivery. Send an invoice body with seller, buyer, line items, and required references; get back validation results, totals, and, when generating, downloadable UBL or CII documents.

Use it when you need to build compliant invoicing workflows without hand-coding the document rules. The invoice payload supports invoice and credit note documents, profiles such as basic, en16931, and extended, plus billing details like payment terms, delivery, references, VAT breakdowns, discounts, and charges. The generated response includes the invoice id, number, issue date, due date, currency, status, totals, and a validation summary with any rule violations.

If you only need checks, call the validation endpoint and get a boolean valid response plus the validation object and totals. If you already have an invoice id, submit it with sellerEndpoint and buyerEndpoint to Peppol, optionally including a webhookUrl for status callbacks. The status endpoint returns the current sending state for that id, including status history with timestamps and details.

This is a fit for ERP integrations, billing platforms, and back-office automation where invoice structure, validation, and delivery status all need to stay machine-readable.

## Usage

Base URL: `https://api.eu.apyhub.com` (default region — see
`GET https://apyhub.com/api/public/regions` for the rest).

Authenticate with an ApyHub API key in the `apy-token` header.
Full docs and a live playground: https://apyhub.com/corsair96/service/validate-generate-send-peppol-e-invoices
