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

SAT

Mexico

GA
format
CFDI 4.0 (PAC timbrado)
auth
mTLS client certificate
operations
validate · submit · query_status · issue
payload
<cfdi:Comprobante>
ES

AEAT

Spain

GA
format
Facturae 3.2 / VeriFactu / SII
auth
mTLS
operations
validate · submit · query_status
payload
<fe:Facturae>
EU

Peppol

European Union

GA
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

Agenzia delle Entrate

Italy

Connector ready
format
FatturaPA
auth
mTLS (SDI)
operations
validate · submit · query_status
payload
<p:FatturaElettronica>
BR

SEFAZ

Brazil

Roadmap
format
NF-e
auth
mTLS (A1 certificate)
operations
validate · submit · query_status
payload
<NFe>
FR/DE

DGFiP / CEN

France / Germany

Roadmap
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.