Developers · REST API
Validate, patch and re-validate e-invoices from your own code.
One POST. The response says whether the file passed, what was changed, and what is still missing. Same engine as the web tool; the official validators decide.
The test key needs no account. It allows 10 requests and expires after one hour.
curl -X POST https://www.invoicenavigator.eu/api/developers/instant-key
curl -X POST https://www.invoicenavigator.eu/api/v2/validate-and-fix \
-H "Authorization: Bearer sk_test_…" \
-H "Content-Type: application/json" \
-d "$(jq -n --rawfile xml invoice.xml '{xml: $xml, autoFix: true}')"Read data.originalValid, data.fixedValid, data.fixesApplied and data.remainingIssues. When the XML changed, data.fixedXml is the patched file. Full field list in the API reference.
The same pipeline, in the browser
Runs the engine behind POST /v2/validate-and-fix on a sample invoice or on XML you paste. Five runs a day per address.
<?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>Nothing checked yet. Run the engine to see the protocol here.
Three kinds of finding
| In the response | Meaning |
|---|---|
| fixesApplied | Structural edits the engine made: syntax, code lists, ordering, identifiers. The patched file is re-validated before it is returned. |
| fixSummary.needsInput | Business data only you have, such as a buyer reference. The response carries _links.fixWithInput; send the values there. Nothing is guessed. |
| remainingIssues | What still fails after patching. Amounts, VAT totals and payment details are never changed; if they are wrong, the file must be re-exported. |
Base URL https://www.invoicenavigator.eu/api
| Endpoint | Does | Key |
|---|---|---|
| Validation | ||
| POST /v1/validate | Validate an e-invoice | any key |
| POST /v1/validate/batch | Validate multiple invoices | Team |
| POST /v2/validate | Validate an invoice (v2, fixability-enriched) | any key |
| Fixer | ||
| POST /v1/fixer/categorize | Categorize validation errors | any key |
| POST /v1/fixer/fix | Auto-fix invoice errors | any key |
| POST /v1/fixer/fix-with-input | Apply user-provided input fixes | any key |
| GET /v1/fixer/usage | Get fix quota usage | any key |
| GET /v1/fixer/download | Download fixed or original invoice XML | any key |
| Evidence Packs | ||
| POST /v1/evidence-pack | Generate Evidence Pack | Team |
| GET /v1/evidence-packs | List Evidence Packs | any key |
| GET /v1/verify/{id} | Verify an Evidence Pack | no key |
| Conversion | ||
| POST /v1/convert | Convert invoice format | Team |
| Countries | ||
| GET /v1/countries | List all supported countries | any key |
| GET /v1/countries/{code} | Get country details | any key |
| GET /v1/rules/{country} | Get validation rules for a country | any key |
| Regulatory Intelligence | ||
| GET /v1/deadlines | Get compliance deadlines | any key |
| GET /v1/requirements | Get trade lane requirements | any key |
| POST /v1/compliance-score | Calculate compliance readiness score | any key |
| GET /v1/changes | Get regulatory changes | any key |
| Reference Data | ||
| GET /v1/errors | List validation error codes | no key |
| GET /v1/errors/{ruleId} | Get error code details | no key |
| GET /v1/facts/search | Search compliance facts | no key |
| GET /v1/facts/{country} | Get country compliance facts | no key |
| Account | ||
| GET /v1/usage | Current usage of the calling key | any key |
| Remediation | ||
| POST /v2/validate-and-fix | Validate, surgically fix, re-validate — one call | any key |
Generated from openapi.json. Team-only endpoints answer a Free key with 403 INSUFFICIENT_TIER.
Two plans, one engine
| Plan | Per month | Included | |
|---|---|---|---|
| Free | €0 | 100 requests a month · 60 an hour · every endpoint except the three Team-only ones | Create a key |
| Team | €49 | 5,000 requests a month · 100 an hour · batch, evidence packs and conversion | Start Team |
POST /v2/validate-and-fix counts as 2 requests. Test keys are not metered; the instant key stops after 10 requests. Your counter: GET /v1/usage. The web tool's per-invoice prices are on the pricing page.
SDK, validator, CI
- TypeScript SDK
npm install @invoicenavigator/sdkTyped client for the API. npm
- Open-source validator
- GitHub Action
uses: invoicenavigator/validate-invoice@v1Validates invoice XML in CI. GitHubWorkflow file
- CLI script
curl -fsSL https://www.invoicenavigator.eu/cli/invoice-navigator.sh -o invoice-navigatorBash; validate, verify, test-key. Download
- Postman collection
/api/postman-collection.jsonEvery endpoint, ready to import. Download
- OpenAPI
/openapi.jsonVersion 2.0.0. The reference on this site is generated from it. openapi.json
Questions
- How do I validate an e-invoice?
- E-invoice validation checks a document against three layers of rules: (1) XML schema validation (is the document well-formed?), (2) EN 16931 business rules (are required fields present and correct?), and (3) country-specific CIUS rules (does it meet national requirements like XRechnung or Factur-X?). Invoice Navigator validates against all three layers via API in under 500ms, auto-fixes structural errors, and provides a timestamped Evidence Pack for audit compliance.
- How do I integrate Invoice Navigator's validation API?
- Invoice Navigator offers a REST API with TypeScript and Python SDKs. To validate an invoice: (1) authenticate with your API key, (2) POST the invoice XML to /api/v1/validate with the target format (e.g., xrechnung, peppol-bis), (3) receive a JSON response with validation status, errors found, auto-remediated fields, and a link to the Evidence Pack. The sandbox environment lets you test with sample invoices before going live. Average response time is under 500ms.
- What is auto-remediation and how does it work?
- Auto-remediation is Invoice Navigator's ability to automatically fix structural errors in e-invoices during validation. When the validator detects fixable issues (like missing optional fields, incorrect date formats, or XML structure problems), it corrects them while strictly preserving financial fields — amounts, VAT rates, IBANs, and tax IDs are never modified. Every change is logged in the Evidence Pack with before/after comparisons. This saves developers from building complex error-handling logic.
- What is an Evidence Pack?
- An Evidence Pack is Invoice Navigator's audit-ready validation report. For every invoice processed, it includes: the original invoice, the validated/remediated output, a detailed list of all validation rules checked with pass/fail results, any auto-remediation changes with before/after comparisons, timestamps, and a digital signature. Evidence Packs provide the audit trail required by tax authorities to prove invoices were validated before submission.
- Is Invoice Navigator GDPR compliant?
- Yes. Invoice Navigator is built and hosted entirely within the EU. No invoice data leaves European infrastructure. The platform processes invoices in-memory for validation and remediation, generates Evidence Packs with cryptographic integrity hashes, and does not store invoice content beyond the processing session unless explicitly requested via the API.
- How does Invoice Navigator work?
- Send an e-invoice XML to the API (or upload via the web validator). Invoice Navigator validates it against three layers: XML schema, EN 16931 business rules, and country-specific CIUS rules. If errors are found, the auto-remediation engine fixes structural issues (missing fields, format problems) while never modifying financial fields (amounts, VAT, IBANs). The fixed invoice is revalidated through KoSIT, and a timestamped Evidence Pack documents every change.
- What programming languages does Invoice Navigator support?
- Invoice Navigator provides a REST API that works with any programming language. Official SDKs are available for TypeScript/JavaScript and Python. The API accepts invoice XML via POST request and returns JSON responses with validation results, remediation details, and Evidence Pack references. Average response time is under 500ms.
- Can I validate multiple invoices at once?
- Yes. The batch validation endpoint (/v1/validate/batch) accepts up to 100 invoices per request. Each invoice is validated independently and results are returned as an array. Higher-volume plans include priority queue access with guaranteed throughput. Batch validation is also available through the TypeScript and Python SDKs.