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.

First call

The test key needs no account. It allows 10 requests and expires after one hour.

1 · POST /api/developers/instant-key
curl -X POST https://www.invoicenavigator.eu/api/developers/instant-key
2 · POST /v2/validate-and-fix
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.

Try it without a key

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.

Peppol BIS 3.0 · UBL
<?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 &amp; 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.

Ready
What the engine does

Three kinds of finding

In the responseMeaning
fixesAppliedStructural edits the engine made: syntax, code lists, ordering, identifiers. The patched file is re-validated before it is returned.
fixSummary.needsInputBusiness data only you have, such as a buyer reference. The response carries _links.fixWithInput; send the values there. Nothing is guessed.
remainingIssuesWhat still fails after patching. Amounts, VAT totals and payment details are never changed; if they are wrong, the file must be re-exported.
Endpoints

Base URL https://www.invoicenavigator.eu/api

EndpointDoesKey
Validation
POST /v1/validateValidate an e-invoiceany key
POST /v1/validate/batchValidate multiple invoicesTeam
POST /v2/validateValidate an invoice (v2, fixability-enriched)any key
Fixer
POST /v1/fixer/categorizeCategorize validation errorsany key
POST /v1/fixer/fixAuto-fix invoice errorsany key
POST /v1/fixer/fix-with-inputApply user-provided input fixesany key
GET /v1/fixer/usageGet fix quota usageany key
GET /v1/fixer/downloadDownload fixed or original invoice XMLany key
Evidence Packs
POST /v1/evidence-packGenerate Evidence PackTeam
GET /v1/evidence-packsList Evidence Packsany key
GET /v1/verify/{id}Verify an Evidence Packno key
Conversion
POST /v1/convertConvert invoice formatTeam
Countries
GET /v1/countriesList all supported countriesany key
GET /v1/countries/{code}Get country detailsany key
GET /v1/rules/{country}Get validation rules for a countryany key
Regulatory Intelligence
GET /v1/deadlinesGet compliance deadlinesany key
GET /v1/requirementsGet trade lane requirementsany key
POST /v1/compliance-scoreCalculate compliance readiness scoreany key
GET /v1/changesGet regulatory changesany key
Reference Data
GET /v1/errorsList validation error codesno key
GET /v1/errors/{ruleId}Get error code detailsno key
GET /v1/facts/searchSearch compliance factsno key
GET /v1/facts/{country}Get country compliance factsno key
Account
GET /v1/usageCurrent usage of the calling keyany key
Remediation
POST /v2/validate-and-fixValidate, surgically fix, re-validate — one callany key

Generated from openapi.json. Team-only endpoints answer a Free key with 403 INSUFFICIENT_TIER.

Prices

Two plans, one engine

PlanPer monthIncluded
Free€0100 requests a month · 60 an hour · every endpoint except the three Team-only onesCreate a key
Team€495,000 requests a month · 100 an hour · batch, evidence packs and conversionStart 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.

Tools

SDK, validator, CI

  • TypeScript SDK
    npm install @invoicenavigator/sdk

    Typed client for the API. npm

  • Open-source validator
    npm install @invoicenavigator/einvoice-validator

    Format detection and EN 16931 core rules, offline, no key. npmGitHub

  • GitHub Action
    uses: invoicenavigator/validate-invoice@v1

    Validates invoice XML in CI. GitHubWorkflow file

  • CLI script
    curl -fsSL https://www.invoicenavigator.eu/cli/invoice-navigator.sh -o invoice-navigator

    Bash; validate, verify, test-key. Download

  • Postman collection
    /api/postman-collection.json

    Every endpoint, ready to import. Download

  • OpenAPI
    /openapi.json

    Version 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.
Documentation