E-Reporting TVA France 2026 : Guide Complet des Flux 10.1 à 10.4
C'est quoi le E-Reporting ?
Le e-reporting est l'obligation de transmettre à l'administration fiscale les données de transactions qui ne passent pas par la facturation électronique (e-invoicing). Concrètement, c'est déclarer au PPF (Portail Public de Facturation) :
- Vos ventes à l'international (clients hors France)
- Vos ventes aux particuliers (B2C)
- Les paiements reçus sur ces transactions
Les 4 flux e-reporting
L'e-reporting se décompose en 4 types de flux, organisés logiquement en deux catégories.
Transactions B2B internationales
| Flux | Quoi ? | Quand ? |
|---|---|---|
| 10.1 | Factures émises/reçues avec des entreprises étrangères | À chaque facture internationale |
| 10.2 | Paiements reçus sur ces factures internationales | À chaque encaissement |
Le flux 10.1 couvre trois scénarios selon qui est français :
| Scénario | Vendeur | Acheteur | Qui déclare ? |
|---|---|---|---|
| B2Bi | Français | Étranger | Vendeur (roleCode=SE) |
| Bi2B | Étranger | Français | Acheteur (roleCode=BY) |
| Bi2Bi | Étranger | Étranger | Le français impliqué |
Exemple B2Bi : Vous vendez des marchandises à un client allemand. Vous (vendeur FR) déclarez la facture.
Exemple Bi2B : Vous achetez des services à un prestataire espagnol. Vous (acheteur FR) déclarez la facture.
Exemple flux 10.2 : Le client paie sa facture. Vous déclarez le paiement.
Transactions B2C (ventes aux particuliers)
| Flux | Quoi ? | Quand ? |
|---|---|---|
| 10.3 | Ventes aux particuliers agrégées | Par période (totaux quotidiens par catégorie) |
| 10.4 | Paiements reçus sur ces ventes B2C | Par période (totaux quotidiens par taux TVA) |
Exemple flux 10.3 : Vous êtes commerçant. Vous avez fait 150 ventes de biens (10 000€ HT) et 80 prestations de services (5 000€ HT) le 15 janvier. Vous déclarez ces deux totaux agrégés pour cette journée.
Exemple flux 10.4 : Vous avez encaissé 12 000€ TTC le 15 janvier sur vos ventes B2C. Vous déclarez ce paiement agrégé.
Différence clé : unitaire vs agrégé
| Type | Flux | Granularité |
|---|---|---|
| Unitaire | 10.1, 10.2 | Une ligne par facture/paiement |
| Agrégé | 10.3, 10.4 | Totaux quotidiens par catégorie |
Périodicité de transmission
La fréquence de transmission dépend de votre régime de TVA (source: Spécifications externes PPF v3.1) :
Données de facture et transaction (10.1, 10.3)
| Régime TVA | Période | Délai de transmission |
|---|---|---|
| Réel normal mensuel | Décade (1-10, 11-20, 21-fin du mois) | 10 jours après fin de période |
| Réel normal trimestriel | Mensuelle | Le 10 du mois suivant |
| Régime simplifié | Mensuelle | Entre le 25 et 30 du mois suivant |
| Franchise en base | Bimestrielle | Entre le 25 et 30 du mois suivant |
Données de paiement (10.2, 10.4)
| Régime TVA | Période | Délai de transmission |
|---|---|---|
| Réel normal mensuel | Mensuelle | Le 10 du mois suivant |
| Réel normal trimestriel | Mensuelle | Le 10 du mois suivant |
| Régime simplifié | Mensuelle | Entre le 25 et 30 du mois suivant |
| Franchise en base | Bimestrielle | 1er du deuxième mois à venir |
Bimestres civils : janvier-février, mars-avril, mai-juin, juillet-août, septembre-octobre, novembre-décembre.
Les données de flux 10.3/10.4 sont agrégées par jour d'activité au sein de la période de transmission.
Comment transmettre : le fichier unique PPF
Le PPF attend un seul fichier XML contenant tous vos flux de la période. C'est ce qu'on appelle le dépôt agrégé.
┌─────────────────────────────────────────────┐
│ Dépôt e-reporting (période) │
├─────────────────────────────────────────────┤
│ 📄 Factures B2B internationales (10.1) │
│ 💳 Paiements B2B internationaux (10.2) │
│ 🛒 Transactions B2C agrégées (10.3) │
│ 💰 Paiements B2C agrégés (10.4) │
└─────────────────────────────────────────────┘
↓
Fichier XML unique
↓
PPF
Les catégories de transactions (flux 10.3)
Pour le flux 10.3, vous devez catégoriser vos ventes B2C :
| Code | Type de vente | Exemple |
|---|---|---|
TLB1 |
Livraisons de biens | Vente de produits en magasin |
TPS1 |
Prestations de services | Coiffeur, réparation, conseil |
TNT1 |
Transactions exonérées | Ventes hors champ TVA |
TMA1 |
Transactions mixtes | Biens + services (à éviter) |
Ce que FactPulse vous apporte
Validation automatique conforme PPF
FactPulse valide vos données selon les spécifications v3.1 de l'Annexe 6 :
- REJ_SEMAN : Format des identifiants (SIREN, codes TVA)
- REJ_COH : Cohérence des montants (TVA = somme des ventilations)
- REJ_PER : Dates dans la période déclarée
→ Vous détectez les erreurs avant d'envoyer au PPF.
Enrichissement intelligent
FactPulse remplit automatiquement les champs optionnels :
- SchemeID déduit du format SIREN/SIRET
- Devise EUR par défaut
- Pays vendeur FR par défaut
- Code exigibilité TVA selon la catégorie (services vs biens)
→ Vous envoyez le minimum, FactPulse complète.
Génération et transmission
FactPulse gère deux aspects distincts :
Format du flux (Spécifications PPF v3.1) :
- Structure XML conforme au XSD e-reporting
- Codes de catégorie normalisés (TLB1, TPS1, TNT1, TMA1)
- Calcul automatique du SHA256 pour l'intégrité
Protocole de transmission (AFNOR XP Z12-013) :
- API standardisée pour l'envoi aux plateformes (PA/PPF)
- Gestion des accusés de réception
- Suivi du cycle de vie des flux
→ Vous n'avez qu'une seule API à appeler, FactPulse gère le reste.
Utiliser l'API FactPulse
Endpoint principal : dépôt agrégé
Pour un dépôt de période complet, utilisez /generate-aggregated :
POST /api/v1/ereporting/generate-aggregated
Exemple complet : dépôt de période
import requests
BASE_URL = "https://factpulse.fr/api/v1"
headers = {"Authorization": "Bearer VOTRE_TOKEN", "Content-Type": "application/json"}
depot_periode = {
"reportId": "EREPORT-2025-01",
"reportName": "E-Reporting Janvier 2025",
"transmissionType": "IN", # Initial (RE pour rectificatif)
"sender": {
"siren": "123456789",
"name": "Ma Société SARL"
},
"issuer": { # Optionnel : déclarant avec son rôle
"siren": "123456789",
"roleCode": "SE" # SE=vendeur (B2Bi), BY=acheteur (Bi2B)
},
"period": {
"startDate": "2025-01-01",
"endDate": "2025-01-31"
},
# Flux 10.1 - Facture B2Bi (vendeur FR → acheteur DE)
"invoices": [
{
"invoiceId": "FAC-2025-INT-001",
"issueDate": "2025-01-10",
"typeCode": "380",
"sellerId": "123456789", # SIREN vendeur FR
"sellerCountry": "FR",
"buyerCountry": "DE",
"buyerVatId": "DE123456789",
"taxExclusiveAmount": "50000.00",
"taxAmount": "0.00",
"taxBreakdown": [
{"rate": "0.00", "taxableAmount": "50000.00", "taxAmount": "0.00"}
]
}
],
# Flux 10.2 - Paiement reçu sur cette facture
"invoicePayments": [
{
"invoiceId": "FAC-2025-INT-001",
"paymentDate": "2025-01-25",
"amount": "50000.00"
}
],
# Flux 10.3 - Ventes B2C du mois (agrégées par catégorie)
"transactions": [
{
"date": "2025-01-31",
"categoryCode": "TLB1", # Ventes de biens
"taxExclusiveAmount": "10000.00",
"taxAmount": "2000.00",
"taxBreakdown": [
{"rate": "20.00", "taxableAmount": "10000.00", "taxAmount": "2000.00"}
],
"transactionCount": 150
},
{
"date": "2025-01-31",
"categoryCode": "TPS1", # Prestations de services
"taxExclusiveAmount": "5000.00",
"taxAmount": "1000.00",
"taxBreakdown": [
{"rate": "20.00", "taxableAmount": "5000.00", "taxAmount": "1000.00"}
],
"transactionCount": 80
}
],
# Flux 10.4 - Encaissements B2C du mois
"transactionPayments": [
{
"paymentDate": "2025-01-31",
"amountsByRate": [
{"rate": "20.00", "amount": "15000.00"}
]
}
]
}
# Générer le XML
response = requests.post(f"{BASE_URL}/ereporting/generate-aggregated", headers=headers, json=depot_janvier)
if response.status_code == 200:
result = response.json()
print(f"XML généré ({len(result['xml'])} bytes)")
print(f"Type: {result['flowType']}") # MultiFlowReport
print(f"Contenu: {result['contentSummary']}")
# Sauvegarder
with open("ereporting_janvier.xml", "w") as f:
f.write(result["xml"])
Exemple flux 10.3 seul : commerce de détail
Si vous n'avez que des ventes B2C :
depot_b2c = {
"reportId": "EREPORT-2025-01-B2C",
"transmissionType": "IN",
"sender": {"siren": "123456789", "name": "Boutique SARL"},
"period": {"startDate": "2025-01-01", "endDate": "2025-01-31"},
"transactions": [
{
"date": "2025-01-31",
"categoryCode": "TLB1",
"taxExclusiveAmount": "25000.00",
"taxAmount": "5000.00",
"taxBreakdown": [
{"rate": "20.00", "taxableAmount": "25000.00", "taxAmount": "5000.00"}
],
"transactionCount": 500
}
]
}
response = requests.post(f"{BASE_URL}/ereporting/generate-aggregated", headers=headers, json=depot_b2c)
# flowType sera "AggregatedCustomerTransactionReport"
Exemple flux 10.1 : export international (B2Bi)
Cas où vous vendez à un client étranger (vendeur FR → acheteur étranger) :
depot_export = {
"reportId": "EREPORT-2025-01-EXPORT",
"transmissionType": "IN",
"sender": {"siren": "123456789", "name": "Exportateur SA"},
"issuer": {"siren": "123456789", "roleCode": "SE"}, # SE = Seller
"period": {"startDate": "2025-01-01", "endDate": "2025-01-31"},
"invoices": [
{
"invoiceId": "FAC-2025-001",
"issueDate": "2025-01-10",
"typeCode": "380",
"sellerId": "123456789", # SIREN vendeur FR
"sellerCountry": "FR",
"buyerCountry": "US",
"taxExclusiveAmount": "100000.00",
"taxAmount": "0.00",
"taxBreakdown": [
{"rate": "0.00", "taxableAmount": "100000.00", "taxAmount": "0.00"}
]
}
]
}
response = requests.post(f"{BASE_URL}/ereporting/generate-aggregated", headers=headers, json=depot_export)
# flowType sera "UnitaryCustomerTransactionReport"
Exemple flux 10.1 : import international (Bi2B)
Cas où vous achetez à un fournisseur étranger (vendeur étranger → acheteur FR) :
depot_import = {
"reportId": "EREPORT-2025-01-IMPORT",
"transmissionType": "IN",
"sender": {"siren": "987654321", "name": "Importateur SARL"},
"issuer": {"siren": "987654321", "roleCode": "BY"}, # BY = Buyer (acheteur)
"period": {"startDate": "2025-01-01", "endDate": "2025-01-31"},
"invoices": [
{
"invoiceId": "INV-ES-2025-001",
"issueDate": "2025-01-15",
"typeCode": "380",
"sellerCountry": "ES", # Vendeur espagnol
"sellerVatId": "ESB12345678", # TVA intracommunautaire du vendeur
"buyerId": "987654321", # SIREN acheteur FR
"buyerCountry": "FR",
"taxExclusiveAmount": "75000.00",
"taxAmount": "0.00", # TVA autoliquidée
"taxBreakdown": [
{"rate": "0.00", "taxableAmount": "75000.00", "taxAmount": "0.00"}
]
}
]
}
response = requests.post(f"{BASE_URL}/ereporting/generate-aggregated", headers=headers, json=depot_import)
# flowType sera "UnitaryCustomerTransactionReport"
Workflow recommandé
1. Valider vos données
Avant de générer, vérifiez que tout est correct :
response = requests.post(
f"{BASE_URL}/ereporting/validate-aggregated",
headers=headers,
json=depot_janvier
)
result = response.json()
if result["valid"]:
print("Données conformes PPF")
else:
for error in result["errors"]:
print(f"Erreur {error['code']}: {error['message']}")
2. Générer et vérifier le XML
response = requests.post(
f"{BASE_URL}/ereporting/generate-aggregated",
headers=headers,
json=depot_janvier
)
result = response.json()
with open("preview.xml", "w") as f:
f.write(result["xml"])
# Vérifier manuellement si besoin
3. Soumettre à la PA
response = requests.post(
f"{BASE_URL}/ereporting/submit-aggregated",
headers=headers,
json={**depot_janvier, "trackingId": "TRACK-2025-01"}
)
if response.status_code == 200:
result = response.json()
print(f"Soumis! Flow ID: {result['flowId']}")
4. Suivre le statut
flow_id = result["flowId"]
response = requests.post(
f"{BASE_URL}/afnor/flows/search",
headers=headers,
json={"flowId": flow_id}
)
for flow in response.json().get("results", []):
print(f"Statut: {flow['acknowledgmentStatus']}")
Endpoints disponibles
Génération et validation
| Endpoint | Description |
|---|---|
POST /ereporting/generate-aggregated |
Générer un XML multi-flux |
POST /ereporting/validate-aggregated |
Valider sans générer |
POST /ereporting/submit-aggregated |
Soumettre à la PA |
GET /ereporting/category-codes |
Lister les codes de catégorie |
Mono-flux (cas simples)
| Endpoint | Description |
|---|---|
POST /ereporting/generate |
Générer un XML mono-flux |
POST /ereporting/validate |
Valider un flux unique |
POST /ereporting/generate/download |
Télécharger directement le XML |
XML pré-généré
| Endpoint | Description |
|---|---|
POST /ereporting/validate-xml |
Valider un XML contre les XSD |
POST /ereporting/submit-xml |
Soumettre un XML existant |
Référence : structure des données
Sender (émetteur)
{
"siren": "123456789", // SIREN 9 chiffres ou SIRET 14 chiffres
"name": "Ma Société SARL", // Raison sociale
"vatId": "FR12345678901" // Optionnel
}
Issuer (déclarant) - Optionnel
{
"siren": "123456789", // SIREN du déclarant français
"name": "Ma Société SARL", // Optionnel
"roleCode": "SE" // SE=vendeur (B2Bi), BY=acheteur (Bi2B)
}
Period (période)
{
"startDate": "2025-01-01", // Début de période
"endDate": "2025-01-31" // Fin de période
}
Transaction (flux 10.3)
{
"date": "2025-01-31",
"categoryCode": "TLB1", // TLB1, TPS1, TNT1, TMA1
"taxExclusiveAmount": "10000.00",
"taxAmount": "2000.00",
"taxBreakdown": [
{ "rate": "20.00", "taxableAmount": "10000.00", "taxAmount": "2000.00" }
],
"transactionCount": 150, // Optionnel
"taxDueDateTypeCode": "29" // Optionnel: 5=débits, 29=encaissements
}
Invoice (flux 10.1)
B2Bi (vendeur FR → acheteur étranger) :
{
"invoiceId": "FAC-2025-001",
"issueDate": "2025-01-10",
"typeCode": "380", // 380=facture, 381=avoir
"sellerId": "123456789", // SIREN vendeur FR
"sellerCountry": "FR",
"buyerCountry": "DE", // Code pays ISO
"buyerVatId": "DE123456789", // Optionnel
"taxExclusiveAmount": "50000.00",
"taxAmount": "0.00",
"taxBreakdown": [
{ "rate": "0.00", "taxableAmount": "50000.00", "taxAmount": "0.00" }
]
}
Bi2B (vendeur étranger → acheteur FR) :
{
"invoiceId": "INV-ES-2025-001",
"issueDate": "2025-01-15",
"typeCode": "380",
"sellerCountry": "ES", // Vendeur étranger
"sellerVatId": "ESB12345678", // TVA du vendeur (obligatoire)
"buyerId": "987654321", // SIREN acheteur FR
"buyerCountry": "FR",
"taxExclusiveAmount": "75000.00",
"taxAmount": "0.00",
"taxBreakdown": [
{ "rate": "0.00", "taxableAmount": "75000.00", "taxAmount": "0.00" }
]
}
InvoicePayment (flux 10.2)
{
"invoiceId": "FAC-2025-001",
"paymentDate": "2025-01-25",
"amount": "50000.00"
}
TransactionPayment (flux 10.4)
{
"paymentDate": "2025-01-31",
"amountsByRate": [
{ "rate": "20.00", "amount": "12000.00" },
{ "rate": "5.50", "amount": "550.00" }
]
}
Codes d'erreur
| Code | Signification |
|---|---|
INVALID_SIREN |
SIREN/SIRET mal formaté |
TAX_MISMATCH |
Montant TVA ≠ somme des ventilations |
DATE_OUT_OF_PERIOD |
Date hors de la période déclarée |
MISSING_TRANSACTIONS |
Flux 10.3 sans transactions |
MISSING_INVOICES |
Flux 10.1 sans factures |
MISSING_PAYMENTS |
Flux 10.2/10.4 sans paiements |
Questions fréquentes sur l'e-reporting
Quelle est la différence entre e-invoicing et e-reporting ?
L'e-invoicing (facturation électronique) concerne les factures B2B entre entreprises françaises, transmises via une plateforme (PDP ou PPF). L'e-reporting concerne toutes les autres transactions : ventes B2C aux particuliers, ventes et achats B2B internationaux. Ces données sont déclarées au PPF sans passer par le circuit de facturation électronique.
Quand l'e-reporting devient-il obligatoire ?
L'obligation d'e-reporting entre en vigueur le 1er septembre 2026 pour les grandes entreprises et ETI, puis le 1er septembre 2027 pour les PME et micro-entreprises. Ces dates sont alignées avec l'obligation de facturation électronique.
Qui doit faire de l'e-reporting ?
Toute entreprise assujettie à la TVA en France doit déclarer :
- Ses ventes aux particuliers (B2C)
- Ses factures émises vers des clients étrangers (B2Bi)
- Ses factures reçues de fournisseurs étrangers (Bi2B)
- Les paiements associés à ces transactions
Quelle est la périodicité de l'e-reporting ?
La fréquence dépend de votre régime de TVA. En régime réel normal mensuel, les transactions (flux 10.1/10.3) sont déclarées par décade (tous les 10 jours) et les paiements (flux 10.2/10.4) sont déclarés mensuellement. En régime simplifié, tout est déclaré mensuellement.
Quel format pour l'e-reporting ?
L'e-reporting utilise un format XML conforme au XSD défini par le PPF (spécifications v3.1). Ce fichier unique peut contenir les 4 types de flux (10.1 à 10.4) pour une même période.
Comment transmettre l'e-reporting au PPF ?
Vous pouvez passer par une Plateforme agréée (PA) qui se charge de la transmission, ou envoyer directement au Portail Public de Facturation (PPF) via son API. FactPulse gère les deux cas.
Besoin d'aide ?
- Documentation OpenAPI : factpulse.fr/api/facturation/scalar
- Support : contact@factpulse.fr
- Sandbox : Testez gratuitement en mode bac à sable
Dernière mise à jour : Janvier 2026 - Conforme spécifications PPF v3.1