Skip to content
Log in

Verifactu

La loi antifraude (Loi 11/2021) impose aux entreprises de garantir que leurs systèmes de facturation et de comptabilité respectent des normes techniques strictes afin d’éviter toute manipulation des données. Le Décret royal 1007/2023 précise davantage les exigences techniques applicables aux systèmes de facturation numérique, en insistant sur la nécessité de formats de facture standardisés facilement accessibles pour l’administration fiscale.

Ces réglementations obligent les entreprises à adopter des systèmes capables de générer, stocker et transmettre de manière sécurisée les factures et les déclarations fiscales. L’API REST de B2Brouter est une solution technique qui permet à votre entreprise d’être facilement 100 % conforme en déléguant les complexités à B2Brouter et en vous laissant vous concentrer sur la logique métier de votre système.

Verifactu est un système de conformité conçu pour simplifier le respect des exigences de facturation prévues par la loi antifraude. Il garantit que toutes les factures générées par les entreprises sont transmises de manière sécurisée à l’administration fiscale afin que leur intégrité et leur authenticité puissent être vérifiées à la fois par l’administration fiscale et par le client. L’administration fiscale espagnole est l’AEAT (“Agencia Estatal de Administración Tributaria”).

Verifactu implique la soumission immédiate, en temps réel, des données de facture à l’AEAT dès l’émission de la facture. Cela garantit qu’aucune modification ne peut être effectuée après son émission, assurant ainsi sa sécurité. De plus, la facture contient un code QR qui permet au destinataire de vérifier sa conformité fiscale via la plateforme de l’AEAT.

En pratique, Verifactu exige :

  • La création d’un fichier XML de déclaration fiscale.
  • Le calcul d’une empreinte numérique pour chaque déclaration fiscale. Cela inclut une chaîne de hachage pour créer une piste inviolable.
  • L’assemblage d’un “Libro de Registro” ou registre pouvant contenir une ou plusieurs déclarations fiscales.
  • La soumission authentifiée du “Libro de Registro” à l’AEAT à l’aide d’un certificat électronique qualifié.
  • Le respect des limitations de fréquence définies par l’AEAT (max. 1 appel par minute, sauf en cas de soumission de plus de 1 000 factures).
  • La génération d’un code QR de vérification de facture, à inclure dans la facture émise.
  • Le traitement des réponses de l’AEAT pour chaque déclaration fiscale.

Avec B2Brouter, vous pouvez abstraire une grande partie de la complexité de ce processus et respecter la loi antifraude en effectuant seulement quelques appels REST à l’API. Vous n’aurez pas besoin de votre propre certificat électronique qualifié, car B2Brouter est un Collaborateur Social en Gestion Fiscale. Vous avez seulement besoin d’une clé API B2Brouter valide.

Environnements de test : utilisez le sandbox pour les premiers tests API et la validation des payloads. Le sandbox simule les soumissions Verifactu afin que vous puissiez tester le cycle de vie des factures sans atteindre l’AEAT. Pour des tests complets de bout en bout avec l’endpoint de test de l’AEAT, utilisez l’environnement staging (api-staging.b2brouter.net).

Configuration et utilisation de l’API B2Brouter

Section titled “Configuration et utilisation de l’API B2Brouter”

La première étape consiste à configurer Verifactu pour chacune des entreprises pour lesquelles vous souhaitez soumettre des déclarations fiscales. Vous pouvez consulter le guide Tax Report Settings pour une description complète du processus. L’appel pour configurer un compte est le suivant :

Exemple de requête

Terminal window
curl --request GET \
--url https://api-staging.b2brouter.net/accounts/{ACCOUNT_ID}/tax_report_settings \
--header 'X-B2B-API-Key: {YOUR_API_KEY}' \
--header 'X-B2B-API-Version: {YOUR_API_VERSION}' \
--header 'Content-Type: application/json' \
--data '{
"tax_report_setting": {
"code": "Verifactu",
"start_date": "2025-04-06",
"auto_generate": true,
"auto_send": true,
"reason_vat_exempt": "E1",
"special_regime_key": "01",
"reason_no_subject": "N1",
"credit_note_code": "R1"
}
}'

Si vous utilisez B2Brouter à la fois pour émettre les factures et les déclarer à l’administration fiscale, une fois votre compte correctement configuré, vous pouvez opérer comme vous le faites normalement pour l’émission de factures.

Les factures émises contiendront le code QR obligatoire, et la déclaration fiscale Verifactu sera envoyée automatiquement à l’AEAT. Voici un exemple d’appel pour créer et émettre une facture :

Exemple de requête :

Terminal window
curl --request POST \
--url https://api-staging.b2brouter.net/accounts/{ACCOUNT_ID}/invoices \
--header 'X-B2B-API-Key: {YOUR_API_KEY}' \
--header 'X-B2B-API-Version: {YOUR_API_VERSION}' \
--header 'content-type: application/json' \
--data '{
"send_after_import": true,
"invoice": {
"date": "2025-04-15",
"due_date": "2025-05-15",
"number": 48,
"payment_method": 1,
"contact": {
"name": "contact.name",
"address": "contact.address",
"city": "contact.city",
"province": "contact.province",
"postalcode": "28938",
"country": "es",
"email": "john.doe@example.com",
"language": "es",
"currency": "EUR",
"terms": "15",
"payment_method": 1,
"tin_scheme": 9920,
"tin_value": "ESA28388510"
},
"invoice_lines_attributes": [
{
"quantity": 10.0,
"description": "line.description",
"price": 11.0,
"unit": 9,
"taxes_attributes": [
{
"name": "IVA",
"percent": 21.0,
"category": "S"
}
]
}
]
}
}'

Dans la réponse du POST REST pour la création d’une facture, si send_after_import est défini sur true, vous trouverez une section tax_report_ids dans laquelle se trouve l’ID de la déclaration fiscale associée à la facture.

Vous pouvez accéder à la déclaration fiscale complète, y compris le code QR, son identifiant, son état et tous les autres champs, en appelant le endpoint get tax report avec l’ID de déclaration fiscale fourni dans la réponse de l’appel de création de facture.

L’état de la déclaration fiscale sera toujours processing dans la réponse du POST. Vous devez vérifier le cycle de vie de la déclaration fiscale. Deux options sont possibles :

  • La méthode recommandée consiste à utiliser le webhook tax report. États finaux : registered, error et registered_with_errors
  • Effectuer un polling de l’état de la déclaration fiscale avec l’endpoint get tax report jusqu’à ce que le champ state soit registered, error ou registered_with_errors.

Si vous n’utilisez pas B2Brouter pour émettre les factures, si vous avez besoin de plus de contrôle sur le processus de génération et de traitement des déclarations fiscales, ou si vous prévoyez un volume élevé de déclarations, vous pouvez utiliser la nouvelle API Tax Report.

Cette API est conçue pour un contrôle maximal par l’utilisateur et une haute disponibilité. Vous pouvez soumettre des déclarations fiscales soit sous forme de payload JSON, soit sous forme de XML Verifactu valide.

La structure du format JSON des déclarations fiscales B2Brouter s’appuie sur PEPPOL Continuous Transaction Control (CTC). L’API Tax Report de B2Brouter est une API universelle, pas seulement orientée Verifactu, mais conçue pour gérer le reporting fiscal à l’échelle mondiale.

Il est important de noter que les déclarations fiscales comportent des ventilations fiscales (“desglose” en espagnol), qui sont la somme des lignes de la facture d’origine ayant la même taxe. Il est de la responsabilité de votre système d’agréger les lignes de facture par type et catégorie de taxe et de fournir les ventilations fiscales nécessaires. Le modèle TaxReport n’effectue aucun calcul.

Pour créer une déclaration fiscale, vous devez appeler l’endpoint create tax report. Une déclaration fiscale minimale et valide :

Exemple de requête :

Terminal window
curl --request POST \
--url https://api-staging.b2brouter.net/accounts/{ACCOUNT_ID}/tax_reports \
--header 'X-B2B-API-Key: {YOUR_API_KEY}' \
--header 'X-B2B-API-Version: {YOUR_API_VERSION}' \
--header 'Content-Type: application/json' \
--data '{
"tax_report": {
"type": "Verifactu",
"invoice_date": "2025-04-03",
"invoice_number": "11",
"description": "Lorem ipsum...",
"customer_party_tax_id": "B12345678",
"customer_party_country": "es",
"customer_party_name": "Ejemplo S.L.",
"tax_inclusive_amount": 121.0,
"tax_amount": 21.0,
"invoice_type_code": "F1",
"currency": "EUR",
"tax_breakdowns": [
{
"name": "IVA",
"category": "S",
"non_exemption_code": "S1",
"percent": 21.0,
"taxable_base": 100.0,
"tax_amount": 21.0,
"special_regime_key": "01"
}
]
}
}'

La réponse de ce POST contiendra déjà le champ qr avec le code QR (encodé en base64) que vous devez inclure sur la facture destinée à votre client. Le contenu de ce code QR est une URL qui permettra à votre client de vérifier que l’AEAT a reçu et traité la déclaration fiscale issue de sa facture.

Importer une déclaration fiscale à partir d’un fichier XML Verifactu

Section titled “Importer une déclaration fiscale à partir d’un fichier XML Verifactu”

Si votre système est capable de générer des fichiers XML Verifactu (un RegistroAlta ou un RegistroAnulacion de l’espace de noms SuministroInformacion), vous pouvez les importer directement via l’API en utilisant l’endpoint d’import.

Si la création de la déclaration fiscale réussit, la réponse contiendra déjà le code QR et l’identifiant de la déclaration fiscale. Notez que B2Brouter effectuera le processus d’enchaînement indépendamment de toute information d’enchaînement présente dans le XML importé.

Vérifier l’état d’une déclaration fiscale

Section titled “Vérifier l’état d’une déclaration fiscale”

Le champ state de la déclaration fiscale sera toujours processing après une création réussie. Vérifiez le cycle de vie via :

  • Le webhook tax report. États finaux : registered, error, annulled et registered_with_errors
  • Le polling de l’endpoint get tax report jusqu’à ce que le champ state soit l’un des suivants : registered, error, annulled ou registered_with_errors.

Obtenir la représentation XML de la déclaration fiscale

Section titled “Obtenir la représentation XML de la déclaration fiscale”

Utilisez le endpoint download tax report. B2Brouter inclut également un champ nommé xml_base64 dans la réponse du GET. Notez que le XML ne peut être généré qu’après l’enchaînement de la déclaration fiscale.

B2Brouter a mis en œuvre un ensemble exhaustif de validations des déclarations fiscales Verifactu basées sur les spécifications publiées par l’AEAT. En cas d’erreur de validation, la déclaration fiscale ne sera pas créée. Vous recevrez une réponse 422: Unprocessable Entity avec toutes les erreurs au format JSON.

Pour annuler une déclaration fiscale (“anulación” en espagnol), utilisez le verbe DELETE en appelant l’endpoint d’annulation.

Pour corriger une déclaration fiscale (“subsanación” en espagnol), utilisez les verbes PATCH ou PUT en appelant l’endpoint de correction.

Les déclarations fiscales Verifactu ne sont pas envoyées individuellement à l’AEAT ; elles sont regroupées dans un “Libro de Registro” (Ledger dans la terminologie B2Brouter), qui contient jusqu’à 1000 déclarations fiscales. Chaque déclaration fiscale possède un champ ledger_id qui identifie l’ID interne du ledger. Avec cet ID, vous pouvez :

Équivalence entre les champs internes de déclaration fiscale B2Brouter et les nœuds XML Verifactu

Section titled “Équivalence entre les champs internes de déclaration fiscale B2Brouter et les nœuds XML Verifactu”
Champ B2Brouter (basé sur PEPPOL CTC)Nœud XML Verifactu
invoice_dateIDFactura > FechaExpedicionFactura
invoice_numberIDFactura > NumSerieFactura
invoice_series_codeIDFactura > NumSerieFactura
supplier_party_nameNombreRazonEmisor
external_referenceRefExterna
correctionSubsanacion
annullationAnulación
previously_refusedRechazoPrevio
invoice_type_codeTipoFactura
amend_typeTipoFactura
amended_numberFacturasRectificadas > IDFacturaRectificada > NumSerieFactura
amended_series_codeFacturasRectificadas > IDFacturaRectificada > NumSerieFactura
amended_dateFacturasRectificadas > IDFacturaRectificada > FechaExpedicionFactura
amended_tax_exclusiveImporteRectificacion > BaseRectificada
amended_tax_amountImporteRectificacion > CuotaRectificada
tax_point_dateFechaOperacion
descriptionDescripcionOperacion
simplified_art7273FacturaSimplificadaArt7273
ticketFacturaSinIdentifDestinatarioArt61d
macrodataMacrodato
issued_by_third_party_or_receiverEmitidaPorTerceroODestinatario
third_party_nameTercero > NombreRazon
third_party_tax_idTercero > NIF
customer_party_nameDestinatarios > IDDestinatario > NombreRazon
customer_party_tax_idDestinatarios > IDDestinatario > NIF or IDOtro > IDType
customer_party_countryDestinatarios > IDDestinatario > IDOtro > CodigoPais
customer_party_tax_schemeDestinatarios > IDDestinatario > IDOtro > IDType
tax_breakdowns[].nameDesglose > DetalleDesglose > Impuesto
tax_breakdowns[].special_regime_keyDesglose > DetalleDesglose > ClaveRegimen
tax_breakdowns[].non_exemption_codeDesglose > DetalleDesglose > CalificacionOperacion
tax_breakdowns[].exemption_codeDesglose > DetalleDesglose > OperacionExenta
tax_breakdowns[].percentDesglose > DetalleDesglose > TipoImpositivo
tax_breakdowns[].taxable_baseDesglose > DetalleDesglose > BaseImponibleOimporteNoSujeto
tax_breakdowns[].taxable_base_at_costDesglose > DetalleDesglose > BaseImponibleACoste
tax_breakdowns[].tax_amountDesglose > DetalleDesglose > CuotaRepercutida
tax_amountCuotaTotal
tax_inclusive_amountImporteTotal
previous_idEncadenamiento > RegistroAnterior > NumSerieFactura
Fichier XSDDescription
SuministroLR.xsdOpérations d’enregistrement et d’annulation des systèmes Verifactu et non Verifactu
RespuestaSuministro.xsdRéponse aux opérations des systèmes Verifactu et non Verifactu
ConsultaLR.xsdOpération de consultation des registres de facturation Verifactu
RespuestaConsultaLR.xsdRéponse à l’opération de consultation des registres de facturation Verifactu
SuministroInformacion.xsdDéfinition des types communs

Description des codes pour des champs spécifiques

Section titled “Description des codes pour des champs spécifiques”

Paramètre : invoice_type_code

CodeDescription
F1Facture (art. 6, 7.2 et 7.3 du RD 1619/2012)
F2Facture simplifiée et factures sans identification du destinataire (art. 6.1.d) RD 1619/2012
F3Facture émise en remplacement de factures simplifiées facturées et déclarées
R1Facture rectificative (Erreur fondée en droit et art. 80 Un, Deux et Six LIVA)
R2Facture rectificative (art. 80.3)
R3Facture rectificative (art. 80.4)
R4Facture rectificative (autres cas)
R5Facture rectificative sur factures simplifiées

Paramètre : special_regime_key

CodeDescription
01Opération de régime général.
02Exportation.
03Opérations relevant du régime spécial des biens d’occasion, objets d’art, antiquités et objets de collection.
04Régime spécial de l’or d’investissement.
05Régime spécial des agences de voyages.
06Régime spécial de groupe d’entités en TVA (niveau avancé)
07Régime spécial du critère de caisse.
08Opérations soumises à l’IPSI / IGIC.
17Opération relevant de l’un des régimes prévus au chapitre XI du titre IX (OSS et IOSS)
18Recargo de equivalencia.
19Opérations d’activités incluses dans le Régime spécial d’agriculture, élevage et pêche (REAGYP)
20Régime simplifié

Paramètre : non_exemption_code

CodeDescription
S1Opération soumise et non exonérée, sans inversion du redevable.
S2Opération soumise et non exonérée, avec inversion du redevable.

Paramètre : no_subject_code

CodeDescription
N1Opération non soumise, article 7, 14, autres.
N2Opération non soumise en raison des règles de localisation.

Paramètre : exemption_code

CodeDescription
E1Exonérée par l’article 20
E2Exonérée par l’article 21
E3Exonérée par l’article 22
E4Exonérée par les articles 23 et 24
E5Exonérée par l’article 25
E6Exonérée pour d’autres motifs

Paramètre : customer_party_tax_scheme

CodeDescription
02N° de TVA intracommunautaire (NIF-IVA)
03Passeport
04Pièce d’identité officielle émise par le pays de résidence
05Certificat de résidence
06Autre document justificatif
07Non enregistré