Resolve402 / services

E-invoice readiness (Peppol)

GET /api/einvoice-readiness · $0.005 per call (USDC on Base or Solana, x402)

Check whether a European company can receive an electronic invoice today, through which Peppol participants and formats, and which national e-invoicing mandate applies to it from which date. Give a French SIREN or SIRET, an intra-EU VAT number, a national company number with its country (BE KBO, NL KvK, IT P.IVA, DE), or a company name and country. The Peppol Directory is queried by free text AND by exact participant on every scheme plausible for the country (FR 0002, 0009, 0225 SIREN_routing, 9957; BE 0208, 9925; NL 0106, 0190, 9944; DE 0204, 9930; IT 0211, 0210, 9906...), results are merged and unrelated hits dropped; document types are mapped to stable capabilities (Peppol BIS Billing invoice and credit note, CII, Factur-X, PINT, order) with a can_receive_einvoice verdict. Identity from Sirene/RNE (France) or VIES; obligation calendar per country with its official source. Charged only if the company is found (a company found but not on Peppol is a 200, registered:false). 20 free calls/day per IP with header X-Free-Trial: 1.

Problem solved

Before sending an e-invoice (or onboarding a supplier) you need to know if the counterparty is reachable on Peppol and in which format, and a naive directory lookup by 0002:SIREN says no while the company is registered under 0225; you also need the mandate date that applies to that company, not a generic calendar.

Use cases

Input

GET /api/einvoice-readiness?siren=<9 digits or 14-digit SIRET> | ?vat=<EU VAT, e.g. BE0417497106> | ?company_id=<national id>&country=<ISO-2> | ?company=<name>&country=<ISO-2>

ParameterWhereTypeDescription
sirenquerystringFrench SIREN (9 digits, Luhn-checked) or SIRET (14 digits). Sets country=FR.
vatquerystringIntra-EU VAT number with country prefix, e.g. FR27552032534, BE0417497106, NL810433941B01, DE811569869
company_idquerystringNational company number, with country: BE KBO/BCE (0417497106), NL KvK (24330087), IT Partita IVA, DE Leitweg-ID...
companyquerystringCompany name, with country (used when no identifier is given; the closest Peppol entity name is kept)
countryquerystringISO-2 country (EU/EEA), required with company_id and company: FR, BE, NL, DE, IT, ES, PL, LU, AT, DK, SE, FI, NO...

Output

company {name, country, identifiers {siren, siret, vat, national_id}, status (FR), category (FR: GE/ETI/PME), vat_check {valid, status, name} (VIES, non-FR)}, peppol {registered, participants [{id, scheme, scheme_name, name, country, doc_types_raw[], capabilities {peppol_bis_billing_invoice, peppol_bis_billing_credit_note, cii_cross_industry_invoice, en16931_invoice, pint, pint_invoice, order, other[]}, accepted_formats[], registration_date, entity_identifiers[], found_by[]}], can_receive_einvoice, accepted_formats[]}, obligation {country, regime, receive {mandatory, since, scope}, issue {mandatory, from, scope}, source, applied}, provenance {identity, directory_queries [{kind, query, url, matches}], participants_dropped}, meta {source, licence, sources, checked_at, notes}. 404 = company not found anywhere, not charged.

Price

$0.005 per call. Charged only if the company is found: 404 not_found (unknown in the registers and no Peppol participant), 400 invalid input and 502 source_unavailable are not charged. A company found but not registered on Peppol is a 200 (registered:false) and is charged.

Free tier: 20 free calls per day per client IP (UTC day, shared with the other free-tier services), no wallet needed. Opt in with the header X-Free-Trial: 1 (or free_trial=1 in the query) and no payment header: the answer carries X-Free-Quota-Remaining, X-Free-Quota-Limit and "billing": {"free_tier": true, "remaining": N}. Without the opt-in, or past the quota, the usual 402. Paid calls never use the free quota.

Example

GET https://resolve402.dev/api/einvoice-readiness?siren=552032534
{
  "company": {
    "name": "DANONE",
    "country": "FR",
    "identifiers": {
      "siren": "552032534",
      "siret": "55203253400703",
      "vat": "FR27552032534"
    },
    "status": "active",
    "category": "GE",
    "vat_check": null
  },
  "peppol": {
    "registered": true,
    "participants": [
      {
        "id": "0225:552032534_interco",
        "scheme": "0225",
        "scheme_name": "FR:SIREN_ROUTING",
        "name": "DANONE",
        "country": "FR",
        "capabilities": {
          "peppol_bis_billing_invoice": true,
          "peppol_bis_billing_credit_note": true,
          "cii_cross_industry_invoice": true,
          "en16931_invoice": true,
          "pint": false,
          "pint_invoice": false,
          "order": false
        },
        "accepted_formats": [
          "Peppol BIS Billing 3.0 Invoice (UBL)",
          "Peppol BIS Billing 3.0 Credit Note (UBL)",
          "UN/CEFACT CII D16B, Peppol BIS Billing 3.0 (EN 16931)",
          "Factur-X 1.0 (PDF + CII, EN 16931)"
        ],
        "registration_date": "2026-08-11",
        "found_by": [
          "q=552032534&country=FR"
        ]
      }
    ],
    "can_receive_einvoice": true,
    "accepted_formats": [
      "Peppol BIS Billing 3.0 Invoice (UBL)",
      "Peppol BIS Billing 3.0 Credit Note (UBL)",
      "Factur-X 1.0 (PDF + CII, EN 16931)",
      "France CIUS 1.0 Invoice (UBL, EN 16931)",
      "UN/CEFACT CII D16B, Peppol BIS Billing 3.0 (EN 16931)"
    ]
  },
  "obligation": {
    "country": "FR",
    "receive": {
      "mandatory": true,
      "since": "2026-09-01",
      "scope": "All VAT-registered businesses established in France must be able to receive electronic invoices from 1 September 2026, whatever their size."
    },
    "issue": {
      "mandatory": true,
      "from": "2026-09-01",
      "scope": "Large companies (GE) and mid-caps (ETI) issue electronically from 1 September 2026; SMEs and micro-enterprises (PME, TPE, auto-entrepreneurs) from 1 September 2027. E-reporting follows the same calendar."
    },
    "source": "https://www.impots.gouv.fr/professionnel/la-facturation-electronique-quest-ce-que-cest",
    "applied": "Issuing date set from the company's INSEE category GE: 1 September 2026."
  },
  "provenance": {
    "directory_queries": [
      {
        "kind": "free_text",
        "query": "q=552032534&country=FR",
        "matches": 5
      },
      {
        "kind": "participant",
        "query": "participant=iso6523-actorid-upis%3A%3A0002%3A552032534",
        "matches": 0
      },
      {
        "kind": "participant",
        "query": "participant=iso6523-actorid-upis%3A%3A0225%3A552032534",
        "matches": 0
      }
    ],
    "participants_dropped": 0
  }
}

Real output of lib/einvoice.ts on 2026-10-20 against directory.peppol.eu and recherche-entreprises.api.gouv.fr (abridged: 1 of the 5 participants shown, doc_types_raw and part of provenance and meta removed).

Sources

Limits

Use it

All services