Factur-X Validator & Generator (2026 Mandate) avatar

Factur-X Validator & Generator (2026 Mandate)

Pricing

from $50.00 / 1,000 invoice validateds

Go to Apify Store
Factur-X Validator & Generator (2026 Mandate)

Factur-X Validator & Generator (2026 Mandate)

Validate a Factur-X invoice (PDF/A-3 or bare CII XML) against EN16931 and the French BR-FR business rules, or generate a compliant PDF/A-3 from invoice data. Totals are recalculated server-side and a mismatch is rejected, never silently corrected. Preflight for the 2026 mandate.

Pricing

from $50.00 / 1,000 invoice validateds

Rating

0.0

(0)

Developer

Comall Agency

Comall Agency

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Validate or generate Factur-X invoices (PDF/A-3 with an embedded EN16931/CII XML payload) ahead of France's B2B e-invoicing mandate — 1 September 2026 for large and medium companies, 2027 for small businesses.

This Actor is a thin, faithful wrapper around a production validation engine (veraPDF + Saxon under the hood). It does not reimplement any compliance logic, so its results match what that engine already produces in production.

Use cases

  • Compliance and finance teams — a real preflight check on outgoing or incoming Factur-X invoices before the deadline, instead of discovering the problem when a customer's system rejects the invoice.
  • ERP and invoicing software — validate your generated Factur-X output against EN16931/CII and the French BR-FR rules before shipping it.
  • Developers — generate a compliant Factur-X PDF/A-3 from structured invoice data, with server-side total recalculation and internal re-validation before you ever see the file.

What it does

validate — checks an existing PDF or XML invoice against the Factur-X / EN16931 (CII) rules and the French business rules (BR-FR-*), and returns a structured compliance report listing errors by rule code.

generate — builds a new, compliant Factur-X PDF from structured invoice data. Totals are always recalculated server-side from the line items, and the request is rejected rather than silently corrected if the totals you send do not match. The generated PDF is re-validated internally before being returned, so you never receive a non-compliant document.

Input — validate

{
"operation": "validate",
"fileUrl": "https://example.com/invoice.pdf"
}

Use fileUrl or fileBase64 (raw file content, base64-encoded), not both. The input form ships with a prefilled URL pointing at a real sample Factur-X invoice — run it as-is to see exactly what a validation report looks like, then replace it with your own file.

Input — generate

{
"operation": "generate",
"invoiceData": {
"numero": "FA-2026-0001",
"date_emission": "2026-08-26",
"type_code": "380",
"devise": "EUR",
"vendeur": {
"nom": "Ma Société SAS",
"siren_siret": "12345678900012",
"tva_intracom": "FR12345678900",
"adresse": { "ligne1": "1 rue Exemple", "code_postal": "75001", "ville": "Paris", "pays": "FR" }
},
"acheteur": {
"nom": "Client SARL",
"siren_siret": "98765432100019",
"adresse": { "ligne1": "2 avenue Client", "code_postal": "69001", "ville": "Lyon", "pays": "FR" }
},
"lignes": [
{ "designation": "Prestation de conseil", "quantite": 1, "prix_unitaire_ht": 1000, "taux_tva": 20, "categorie_tva": "S" }
],
"totaux": { "total_ht": 1000, "total_tva": 200, "total_ttc": 1200 }
}
}

The totaux block is checked against a server-side recalculation of the line items. A mismatch returns a TOTALS_MISMATCH rejection instead of a document — deliberately, because a compliance document built from inconsistent totals is worse than no document.

Output — validate

{
"operation": "validate",
"ok": true,
"result": { "...": "structured compliance report, errors listed by rule code" }
}

When the upstream engine returns an error for your file (for example a file that is too large, or empty), the row instead carries "ok": false together with httpStatus and the error payload, so you always get the real reason rather than a fabricated verdict.

Output — generate

{
"operation": "generate",
"ok": true,
"pdfKeyValueStoreKey": "invoice-FA-2026-0001.pdf",
"pdfUrl": "https://api.apify.com/v2/key-value-stores/.../records/invoice-FA-2026-0001.pdf"
}

The generated PDF is stored in the run's key-value store under pdfKeyValueStoreKey, and pdfUrl links straight to it.

Pricing (pay-per-event)

EventPriceCharged when
validation$0.05A validation check was performed and returned a real answer — whether the invoice passes or fails.
generation$0.08A compliant Factur-X PDF was actually produced and returned.

Charged for a failed check, to be explicit about it: if the engine rejects your file as too large or empty, the validation event is still charged, because the check was genuinely performed on the file you sent. You are paying for the answer, not for a "pass".

Never charged: the upstream service being unreachable, rate-limited or saturated (those abort the run rather than billing you), and — for generate — any rejected request where no PDF was produced, including a totals mismatch.

Limitations — read this before you buy

  • Covers the French mandate specifically: EN16931/CII plus the BR-FR-* business rules. Other countries' e-invoicing formats (FatturaPA, XRechnung profiles beyond CII, Peppol BIS variants) are out of scope.
  • This Actor calls a live external API it does not run itself, so its availability tracks that service's availability. When that service is down, the run fails loudly and unbilled rather than returning a guess.
  • Validation reports what the rules say. It is not tax advice, and passing validation is not a statement about the invoice's commercial or legal correctness.

FAQ

Can I validate an XML file without the PDF wrapper? Yes — validate accepts both a PDF/A-3 and a bare CII XML file.

What happens if my totals are off by a cent? generate rejects the request and tells you so, and you are not charged. Rounding differences between your system and the recalculation are the most common cause.