API for Controlled Invoice Compliance
Validate, auto-fix, revalidate via KoSIT, and generate audit evidence. One composite endpoint or three granular calls — full pipeline control.
1,300+ rules in the core validation engine. Every fixed invoice is revalidated via KoSIT Schematron before release.
POST /v2/validate-and-fix
{
"xml": "<Invoice xmlns='urn:oasis:names:...'> ... </Invoice>",
"fileName": "INV-2026-0847.xml",
"remediation_policy": "safe",
"generate_evidence_pack": true
}{
"validationRef": "VAL-1740744832000-ABC12DEF",
"originalValid": false,
"fixedValid": true,
"engine": "hybrid",
"fixesApplied": 2,
"remainingIssues": [],
"fixSummary": {
"totalIssues": 3,
"autoFixable": 2,
"needsInput": 1,
"blocked": 0,
"unknown": 0,
"canAutoFixAll": false
},
"evidencePackUrl": "/api/v1/evidence-pack/EP-REF-...",
"_links": {
"self": "/api/v2/validate-and-fix",
"fixWithInput": "/api/v1/fixer/fix-with-input?flow_id=..."
}
}Every field is explicit. No hidden transformations. No silent rewrites.
Where It Fits
Invoice Navigator API
Invoice Navigator sits between your export and your delivery channel. One composite endpoint handles the full pipeline — or use three granular endpoints for step-by-step control.
Your pipeline logic stays yours.
Not Another Validation API
Controlled Auto-Fix
Structural corrections where commercial meaning is unchanged. Whitespace, namespaces, code lists — fixed automatically.
Input-Required Workflow
Missing business data triggers explicit input request in the response. Nothing is assumed or injected.
Financial Field Blocking
Amounts, VAT totals, IBANs, and payment details are never modified. Enforced at engine level.
KoSIT Revalidation Loop
Every fixed invoice is revalidated before the response is returned. No separate call needed.
Every processed invoice generates a structured evidence pack — validation findings, fix diffs, blocked field confirmation, and revalidation proof.
Integrate in 3 Steps
Create your API key
Sign up, get a key, access the sandbox immediately.
Send your first invoice
POST to /v2/validate-and-fix with any UBL or CII invoice.
Deploy in your pipeline
Wire the endpoint between your ERP export and delivery. Done.
Typical integration time: less than one sprint.
Test the Engine
Run a real validation and auto-fix cycle. No signup required.
<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2">
<cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID>
<cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>
<cbc:ID>743617</cbc:ID>
<cbc:IssueDate>2007-02-08</cbc:IssueDate>
<cbc:DueDate>2007-04-08</cbc:DueDate>
<cbc:InvoiceTypeCode>380</cbc:InvoiceTypeCode>
<cbc:DocumentCurrencyCode >SEK</cbc:DocumentCurrencyCode>
<cbc:AccountingCost>BeSt/TJ/Office</cbc:AccountingCost>
<cbc:BuyerReference>Admin</cbc:BuyerReference>
<cac:ContractDocumentReference>
<cbc:ID>7231262</cbc:ID>
</cac:ContractDocumentReference>
<cac:AdditionalDocumentReference>
<cbc:ID schemeID="SE">Model30/S.nr35141</cbc:ID>
<cbc:DocumentTypeCode>130</cbc:DocumentTypeCode>
</cac:AdditionalDocumentReference>
<cac:AccountingSupplierParty>
<cac:Party>
<cbc:EndpointID schemeID="0088">7399887766677</cbc:EndpointID>
<cac:PostalAddress>
<cbc:StreetName>Solvägen 1</cbc:StreetName>
<cbc:CityName>Sollentuna</cbc:CityName>
<cbc:PostalZone>19127</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>SE</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>SE556677889901</cbc:CompanyID>
<cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyTaxScheme>
<cbc:CompanyID>Godkänd för F-skatt</cbc:CompanyID>
<cac:TaxScheme><cbc:ID>TAX</cbc:ID></cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Kopiering & Test AB</cbc:RegistrationName>
<cbc:CompanyID schemeID="0007">5566778899</cbc:CompanyID>
<cbc:CompanyLegalForm>Säte: Sollentuna</cbc:CompanyLegalForm>
</cac:PartyLegalEntity>
<cac:Contact>
<cbc:Name>Driftservice</cbc:Name>
</cac:Contact>
</cac:Party>
</cac:AccountingSupplierParty>
<cac:AccountingCustomerParty>
<cac:Party>
<cbc:EndpointID schemeID="0007">5432154321</cbc:EndpointID>
<cac:PartyName>
<cbc:Name>Skellefteå Sambruk AB</cbc:Name>
</cac:PartyName>
<cac:PostalAddress>
<cbc:AdditionalStreetName>Box 1</cbc:AdditionalStreetName>
<cbc:CityName>Skellefteå</cbc:CityName>
<cbc:PostalZone>93100</cbc:PostalZone>
<cac:Country>
<cbc:IdentificationCode>SE</cbc:IdentificationCode>
</cac:Country>
</cac:PostalAddress>
<cac:PartyLegalEntity>
<cbc:RegistrationName>Skellefteå Sambruk AB</cbc:RegistrationName>
<cbc:CompanyID schemeID="0007">5432154321</cbc:CompanyID>
</cac:PartyLegalEntity>
<cac:Contact>
<cbc:Name>B-E Ställman</cbc:Name>
</cac:Contact>
</cac:Party>
</cac:AccountingCustomerParty>
<cac:Delivery>
<cac:DeliveryLocation>
<cac:Address>
<cbc:StreetName>Skålvägen 1 B</cbc:StreetName>
<cbc:CityName>Skellefteå</cbc:CityName>
<cac:Country>
<cbc:IdentificationCode>SE</cbc:IdentificationCode>
</cac:Country>
</cac:Address>
</cac:DeliveryLocation>
</cac:Delivery>
<cac:PaymentTerms>
<cbc:Note>Enligt avtal</cbc:Note>
</cac:PaymentTerms>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="SEK">1253.11</cbc:TaxAmount>
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="SEK">5012.42</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="SEK">1253.11</cbc:TaxAmount>
<cac:TaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>25</cbc:Percent>
<cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal>
<cbc:LineExtensionAmount currencyID="SEK">5012.42</cbc:LineExtensionAmount>
<cbc:TaxExclusiveAmount currencyID="SEK">5012.42</cbc:TaxExclusiveAmount>
<cbc:TaxInclusiveAmount currencyID="SEK">6265.53</cbc:TaxInclusiveAmount>
<cbc:PayableRoundingAmount currencyID="SEK">0.47</cbc:PayableRoundingAmount>
<cbc:PayableAmount currencyID="SEK">6266</cbc:PayableAmount>
</cac:LegalMonetaryTotal>
<cac:InvoiceLine>
<cbc:ID>1</cbc:ID>
<cbc:Note>Januari 2008</cbc:Note>
<cbc:InvoicedQuantity unitCode="MON">1</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="SEK">2770</cbc:LineExtensionAmount>
<cac:Item>
<cbc:Name>Fast månadsavgift</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>25</cbc:Percent>
<cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="SEK">2770</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
<cac:InvoiceLine>
<cbc:ID>2</cbc:ID>
<cbc:Note>Avläsning 27 dec, uppskattat månaden ut.</cbc:Note>
<cbc:InvoicedQuantity unitCode="EA">1488</cbc:InvoicedQuantity>
<cbc:LineExtensionAmount currencyID="SEK">2242.42</cbc:LineExtensionAmount>
<cac:InvoicePeriod>
<cbc:StartDate>2006-12-01</cbc:StartDate>
<cbc:EndDate>2006-12-31</cbc:EndDate>
</cac:InvoicePeriod>
<cac:Item>
<cbc:Name>Rörlig avgift</cbc:Name>
<cac:ClassifiedTaxCategory>
<cbc:ID>S</cbc:ID>
<cbc:Percent>25</cbc:Percent>
<cac:TaxScheme><cbc:ID>VAT</cbc:ID></cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price>
<cbc:PriceAmount currencyID="SEK">1.507</cbc:PriceAmount>
</cac:Price>
</cac:InvoiceLine>
</Invoice>Click “Validate & Remediate” to run the engine
No signup required
Best experienced on desktop for the full interactive console.
Code Examples
const response = await fetch('https://api.invoicenavigator.eu/api/v1/validate', {
method: 'POST',
headers: {
'Authorization': 'Bearer sk_live_...',
'Content-Type': 'application/json'
},
body: JSON.stringify({
xml: invoiceXml,
fileName: 'invoice-001.xml'
})
});
const { data } = await response.json();
console.log(data.isValid, data.errors.length);View full API reference →import requests
response = requests.post(
"https://api.invoicenavigator.eu/api/v1/validate",
headers={
"Authorization": "Bearer sk_live_...",
"Content-Type": "application/json"
},
json={"xml": invoice_xml, "fileName": "invoice-001.xml"}
)
data = response.json()["data"]
print(data["isValid"], len(data["errors"]))View full API reference →curl -X POST https://api.invoicenavigator.eu/api/v1/validate \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d @- <<< "$(jq -n --rawfile xml invoice.xml '{xml: $xml}')"'View full API reference →Or use the TypeScript SDK: npm install @invoicenavigator/sdk
SDKs & Open Source
TypeScript SDK
npm install @invoicenavigator/sdkType-safe client for the Invoice Navigator API. Validate, auto-fix, and retrieve evidence packs.
Open-Source Validator
npm install @invoicenavigator/einvoice-validatorFree EU e-invoice validator. Detect formats and validate against EN 16931 core rules. No API key needed.
GitHub Action
invoicenavigator/validate-invoice@v1Validate e-invoices in your CI/CD pipeline. Catches compliance errors before deployment.
API Endpoints
Validation & Auto-Fix
| Method | Endpoint |
|---|---|
| POST | /v1/validate |
| POST | /v2/validate-and-fix |
| POST | /v1/validate/batch |
| POST | /v1/fixer/fix |
| POST | /v1/fixer/fix-with-input |
| POST | /v1/fixer/categorize |
Evidence Packs
| Method | Endpoint |
|---|---|
| POST | /v1/evidence-pack |
| GET | /v1/evidence-pack/{id} |
| GET | /v1/evidence-pack/{id}/download |
| GET | /v1/verify/{id} |
Compliance Data
| Method | Endpoint |
|---|---|
| GET | /v1/rules/{country} |
| GET | /v1/countries |
| GET | /v1/deadlines |
| GET | /v1/errors |
| GET | /v1/errors/{ruleId} |
Pricing
Free
€0/mo
Up to 500 invoices/mo
Try the full engine — 500 invoices/month
Pro
€99/mo
Up to 10,000 invoices/mo
For production API pipelines
Overage: €10 per additional 1,000 invoices. No service interruption.
Start with 500 free invoices/month. Full engine access. No credit card required.