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
- Accounts payable agent: before onboarding a French supplier, check it can receive a Factur-X or BIS invoice through Peppol and which issuing date applies to it (GE/ETI 2026, PME 2027).
- Invoicing agent: for each customer in a billing run (FR, BE, NL, DE), decide e-invoice via Peppol vs PDF fallback from can_receive_einvoice and accepted_formats.
- Compliance check: list the Peppol endpoints and document types a Belgian company declares, with the KBO and VAT participants merged.
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>
| Parameter | Where | Type | Description |
|---|---|---|---|
siren | query | string | French SIREN (9 digits, Luhn-checked) or SIRET (14 digits). Sets country=FR. |
vat | query | string | Intra-EU VAT number with country prefix, e.g. FR27552032534, BE0417497106, NL810433941B01, DE811569869 |
company_id | query | string | National company number, with country: BE KBO/BCE (0417497106), NL KvK (24330087), IT Partita IVA, DE Leitweg-ID... |
company | query | string | Company name, with country (used when no identifier is given; the closest Peppol entity name is kept) |
country | query | string | ISO-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
- Peppol Directory (directory.peppol.eu), public search API of OpenPeppol: participants, identifier schemes and supported document types
- France: Sirene (INSEE) and RNE (INPI) via recherche-entreprises.api.gouv.fr, Licence Ouverte 2.0 (name, status, company category)
- VIES VAT number validation, European Commission (identity of non-French companies when a VAT number is known or derivable)
- Obligation calendar: official pages per country cited in obligation.source (impots.gouv.fr, finances.belgium.be, agenziaentrate.gov.it, logius.nl, ksef.podatki.gov.pl, boe.es); null when no official page could be verified
Limits
- Peppol only: an Italian company invoiced through SdI, or a French company reachable only through its plateforme agréée's national directory, can be registered:false here while it receives e-invoices by another channel (a note says so for IT and FR).
- The Peppol Directory lists what access points publish; a participant registered without directory publication (business card) is not visible. Capabilities are read from the published document types, not tested.
- Identity: France has name, status and INSEE category (which fixes the issuing date); other countries get VIES validity and name when a VAT number is known, otherwise the directory entity name. VIES saturation (MS_MAX_CONCURRENT_REQ) gives vat_check unavailable within 8 s and never a 502 on its own.
- company + country resolves to the closest entity name in the directory (France: in Sirene); give an identifier for an exact answer.
- obligation is the published national rule applied to the company's category where known (FR); thresholds this service does not check (DE turnover, PL sales) are stated in obligation.applied. Not legal advice.
- Directory contacts (persons) are never returned. Nothing stored.
Use it
- HTTP + x402: call the URL, pay the 402 with any x402 v2 client, retry with the PAYMENT-SIGNATURE header.
- OpenAPI: /openapi.json (operation
einvoiceReadiness) - MCP server: coming soon
- Agent guide: /llms.txt · skill: /SKILL.md