ZUGFeRD & XRechnung Validator
Upload a ZUGFeRD or Factur-X PDF or an XRechnung XML and see every rule it breaks — PDF/A-3 and the EN 16931 and XRechnung rules, each with its code.
- Free
- No account
- Files deleted automatically
Checked in three steps.
From the file on your computer to a report you can act on.
-
01
Upload the invoice
Drop a ZUGFeRD or Factur-X PDF or an XRechnung XML into the box. You need no account for it.
-
02
Every rule is checked
The file is tested against its format, its schema and the European and German business rules.
-
03
Read the report
You see whether the invoice is valid, and for every finding the rule it breaks with a message.
A valid file.
A valid invoice.
An e-invoice has to be in the right format and follow the invoice rules.
Both are checked, and each finding names the rule it breaks.
PDF/A-3
The archive format every ZUGFeRD and Factur-X invoice has to be, checked with veraPDF.
Schema
The invoice XML, inside the PDF or on its own, checked against the schema of its profile.
EN 16931
The business rules of the European standard, such as totals that have to add up.
XRechnung
The German rules on top, for an XRechnung XML and for PDFs of the XRECHNUNG profile.
The same check,
from your code.
This tool runs our validator API. Send the URL of an e-invoice, PDF or XML, with one request and get the report you see above as JSON — 1,000 validations a month are free.
Request
curl -X POST https://apdf.io/api/pdf/einvoice/validate \
-H "Authorization: Bearer TOKEN" \
-d file="FILE_URL"
const data = new FormData();
data.append('file', 'FILE_URL');
fetch('https://apdf.io/api/pdf/einvoice/validate', {
headers: {'Authorization': 'Bearer TOKEN'},
method: 'POST',
body: data
})
.then(response => response.json())
.then(json => console.log(json));
use GuzzleHttp\Client;
$client = new Client();
$response = $client->post(
'https://apdf.io/api/pdf/einvoice/validate', [
'headers' => [
'Authorization' => 'Bearer TOKEN'
],
'form_params' => [
'file' => 'FILE_URL'
]
]);
$body = $response->getBody();
echo json_encode($body->getContents());
require 'rest-client'
response = RestClient.post(
'https://apdf.io/api/pdf/einvoice/validate',
{
'file' => 'FILE_URL'
},
{
Authorization: "Bearer TOKEN"
}
)
puts response.body
import requests
response = requests.post(
'https://apdf.io/api/pdf/einvoice/validate',
headers = {
'Authorization': 'Bearer TOKEN'
},
data = {
'file': 'FILE_URL'
}
)
print(response.text)
import (
"fmt"
"github.com/go-resty/resty/v2"
)
func main() {
client := resty.New()
data := map[string]string{
"file": "FILE_URL"
}
resp, _ := client.R().
SetFormData(data).
SetHeader("Authorization", "Bearer TOKEN").
Post("https://apdf.io/api/pdf/einvoice/validate")
fmt.Println(resp.String())
}
import okhttp3.*;
class Pdf {
public static void main(String[] args) throws Exception {
OkHttpClient client = new OkHttpClient();
FormBody formBody = new FormBody.Builder()
.add("file", "FILE_URL")
.build();
Request request = new Request.Builder()
.url("https://apdf.io/api/pdf/einvoice/validate")
.addHeader("Authorization", "Bearer TOKEN")
.post(formBody)
.build();
Response response = client.newCall(request).execute();
System.out.println(response.body().string());
}
}