Connectors
Native connectors to tax authorities and e-invoicing networks
All connectors implement the same CountryConnector trait: validate, submit, query_status, issue. New jurisdictions are added as independent crates without touching the core.
MX
GASAT
Mexico
- format
- CFDI 4.0 (PAC timbrado)
- auth
- mTLS client certificate
- operations
- validate · submit · query_status · issue
- payload
- <cfdi:Comprobante>
ES
GAAEAT
Spain
- format
- Facturae 3.2 / VeriFactu / SII
- auth
- mTLS
- operations
- validate · submit · query_status
- payload
- <fe:Facturae>
EU
GAPeppol
European Union
- format
- UBL 2.1 / BIS 3.0
- auth
- mTLS via certified Access Point
- operations
- validate · submit · query_status
- payload
- <Invoice xmlns=urn:oasis:...:Invoice-2>
IT
Connector readyAgenzia delle Entrate
Italy
- format
- FatturaPA
- auth
- mTLS (SDI)
- operations
- validate · submit · query_status
- payload
- <p:FatturaElettronica>
BR
RoadmapSEFAZ
Brazil
- format
- NF-e
- auth
- mTLS (A1 certificate)
- operations
- validate · submit · query_status
- payload
- <NFe>
FR/DE
RoadmapDGFiP / CEN
France / Germany
- format
- Factur-X / ZUGFeRD
- auth
- Hybrid PDF/A-3 + XML
- operations
- validate · submit
- payload
- <rsm:CrossIndustryInvoice>
SAT (MX) returns the official SAT UUID stamp, sealed in the WAL atomically with the original document. AEAT (ES) returns the CSV code via Facturae / VeriFactu / SII. Peppol transports UBL 2.1 (BIS 3.0) via a certified Access Point.
Extensible
Bring your own jurisdiction
A new authority is a new crate implementing one trait. The core engine — WAL, hash chain, TSA, encryption — does not change.
country_connector.rsrust
#[async_trait]
pub trait CountryConnector: Send + Sync {
/// Schema + business-rule validation for the jurisdiction.
async fn validate(&self, doc: &Document) -> Result<Validation, ConnectorError>;
/// Submit to the authority / access point. Returns the official stamp.
async fn submit(&self, doc: &Document) -> Result<Stamp, ConnectorError>;
/// Poll the authority for the current acceptance status.
async fn query_status(&self, id: &ExternalId) -> Result<Status, ConnectorError>;
/// Issue a fully stamped, legally valid document, sealed into the WAL.
async fn issue(&self, draft: Draft) -> Result<Issued, ConnectorError>;
}Need a jurisdiction we haven't shipped yet?
Connector roadmaps move with regulatory mandates. Tell us yours.