API for Controlled Invoice Compliance
Validate, safely remediate, 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 remediated 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-Remediation
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 remediated invoice is revalidated before the response is returned. No separate call needed.
Every processed invoice generates a structured evidence pack — validation findings, remediation 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 remediation 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 →TypeScript and Python SDKs are in development. Contact us for early access.
API Endpoints
Validation & Remediation
| 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
Starter
€249/mo
Up to 1,000 invoices/mo
1,000 invoices/mo · 30-day retention · Email support
Pro
€499/mo
Up to 5,000 invoices/mo
5,000 invoices/mo · Batch processing · 90-day retention · Rule alerts
Scale
€999/mo
Up to 25,000 invoices/mo
25,000 invoices/mo · 1-year retention · Dedicated support · SLA targets
Overage: €50 per additional 1,000 invoices. No service interruption.
Start with 100 free invoices. Full engine access. No credit card required.