Salta al contingut
Log in

DGFiP facturació electrònica i e-Reporting

A partir del setembre de 2026, totes les empreses franceses hauran d’encaminar les seves factures i dades d’IVA a través d’una plataforma certificada. B2Brouter ho simplifica: tu envies les dades de la factura amb una crida REST API, i B2Brouter s’encarrega del registre al PPF, la generació del document (UBL/CII/Factur-X), l’encaminament cap als teus clients i la declaració fiscal a la DGFiP, tot des d’una sola integració.

B2Brouter és una Plateforme Agréée (PA) certificada per a la reforma francesa de facturació electrònica de la DGFiP. Connecta’t via REST API i B2Brouter gestionarà per tu tota la capa de compliance:

Què fa B2Brouter per tuDetalls
Registre al PPFPublica automàticament el teu SIREN/SIRET a l’Annuaire quan actives el servei
Flux 1 — facturació electrònica B2BGenera UBL/CII/Factur-X, transmet al PPF i encaminа a la plataforma del comprador
Flux 6 — cicle de vida de la facturaGestiona els missatges d’estat CDAR (Déposée, Reçue, Approuvée, Refusée, Encaissée)
Flux 10 — e-ReportingAgrega operacions B2C i B2B transfrontereres (intra-UE i extra-UE) en Ledgers diaris enviats al PPF
Recepció Peppol 0225Rep factures de qualsevol plataforma francesa o connectada a Peppol
Generació de documentsTu envies dades de factura en JSON i B2Brouter genera el document UBL/CII/Factur-X compliant i el transmet al PPF. No cal que generis XML pel teu compte
Formats d’entradaJSON REST API, Factur-X PDF/A-3 (amb CII XML incrustat), UBL 2.1 XML, CII XML
Arxiu legalTots els documents transmesos (factures, tax reports, missatges CDAR) s’emmagatzemen a B2Brouter durant el període legal obligatori de 10 anys. No cal cap infraestructura addicional al teu costat

Per integrar-te necessites 4 passos: crear el teu compteactivar DGFiPcrear un contacteenviar la teva primera factura.


Context normatiu: La reforma francesa de facturació electrònica estableix que totes les empreses franceses han d’utilitzar una Plateforme Agréée (PA) certificada o el PPF (Portail Public de Facturation) de l’Estat per transmetre factures i declarar dades d’IVA a la DGFiP a partir del setembre de 2026. Com a PA certificada, B2Brouter gestiona completament la connexió amb el PPF en nom teu: sense SFTP, sense certificats electrònics i sense cap integració directa amb el PPF.

Hi ha dos casos d’ús principals per integrar-se amb B2Brouter per a la facturació electrònica a França:

eDocExchange: per a empreses o grups d’empreses que integren directament el seu programari de gestió (ERP, plataforma comptable) amb B2Brouter. El procés d’onboarding (creació del compte, configuració de Tax Report Settings) normalment es fa una vegada per empresa des de la interfície web. L’operativa del dia a dia, com emetre factures i seguir-ne el cicle de vida, es fa via API. Per afegir més comptes d’empresa al teu grup d’integració, només cal seguir el mateix assistent d’onboarding des del mateix usuari de B2Brouter; no cal cap crida API separada.

eDocSync: per a vendors de programari i proveïdors ERP que volen oferir compliment DGFiP als seus clients des del seu propi producte. És el model white-label / embedded / marque blanche de B2Brouter: B2Brouter opera completament en segon pla, els clients finals només interactuen amb la interfície del vendor i no saben que B2Brouter hi és al darrere. El vendor és responsable del provisionament de comptes, l’enviament de factures i el seguiment del cicle de vida via l’API de B2Brouter. Els clients finals no necessiten login ni subscripció a B2Brouter.

Per a eDocSync, el volum de provisionament de comptes determina el pla adequat:

  • Poques empreses (model reseller): afegeix cada empresa client com a compte dins del teu grup d’integració de B2Brouter des de la interfície web, seguint l’assistent estàndard. Funciona bé per a desenes d’empreses i comparteix una única API key.
  • 100+ empreses: contacta amb el nostre equip comercial o obre un ticket de suport per parlar d’un pla eDocSync dedicat amb provisionament massiu.

En tots dos casos, totes les funcionalitats de compliance específiques de França (registre a l’Annuaire, transmissió Flux 1/6/10, cicle de vida CDAR) funcionen igual.

B2Brouter és una Plateforme Agréée: t’integres amb B2Brouter; no és un relay ni un connector cap a una altra PA. Si el teu SIREN ja està registrat amb una altra PA, activar el Tax Report Setting sobre el compte SIREN (pas 2) transfereix automàticament l’entrada de l’Annuaire a B2Brouter. Per portar només un establiment i conservar aquell registre existent, vegeu l’Escenari 2 a Estructura del compte. No pots utilitzar B2Brouter com a passarel·la per enviar factures sota la certificació d’una altra PA.

Encaminament a destinataris d’altres PA: quan el comprador està registrat amb una PA diferent, B2Brouter encamina la factura utilitzant el model estàndard Peppol de quatre cantonades (C2 → C3): el punt d’accés Peppol de B2Brouter (C2) consulta l’adreça Peppol del destinatari a l’Annuaire i entrega el document al punt d’accés del comprador (C3), independentment de quina PA utilitzi. No cal cap configuració extra al teu costat.


Entorns de prova: utilitza sandbox per a les primeres proves d’API i validació de payloads. Els enviaments DGFiP es simulen al sandbox i no cal cap SIRET fictici. Per a proves completes end-to-end amb l’entorn QAS (qualification) de la DGFiP, utilitza l’entorn staging de B2Brouter, tal com s’explica a continuació.

EntornApp de B2BrouterAPI de B2BrouterPortal Chorus Pro
Produccióapp.b2brouter.nethttps://api.b2brouter.netchorus-pro.gouv.fr
Staging (proves)app-staging.b2brouter.nethttps://api-staging.b2brouter.netqualif.chorus-pro.gouv.fr

No barregis entorns. Producció utilitza números SIREN/SIRET reals i connecta amb l’Annuaire de producció de la DGFiP. Staging utilitza identificadors ficticis de prova i connecta amb l’entorn QAS de la DGFiP. API keys, comptes i contactes no es comparteixen entre entorns.

Registra’t a app.b2brouter.net per començar una integració en producció. Quan activis el DGFiP Tax Report Setting, el SIREN/SIRET de la teva empresa es publicarà a l’Annuaire real del PPF i serà visible per qualsevol plataforma de l’ecosistema francès de facturació electrònica.

Aquesta opció està pensada per a factures B2B reals a partir del setembre de 2026. Mentrestant, la DGFiP netejarà els registres del període QAS abans que la reforma entri en vigor, de manera que les factures que enviïs durant el pilot no generaran obligacions de compliment. És el millor punt de partida si ja has escollit B2Brouter i vols provar la integració completa amb dades reals de la teva empresa.

Opció B — Staging (recomanat per a avaluació)

Section titled “Opció B — Staging (recomanat per a avaluació)”

Registra’t a app-staging.b2brouter.net per utilitzar l’entorn de proves de B2Brouter, connectat a l’entorn QAS de la DGFiP.

És la millor opció si:

  • Estàs avaluant diverses plataformes abans de decidir-te
  • El teu SIREN/SIRET ja està publicat a l’Annuaire amb una altra PA i activar B2Brouter en producció en transferiria l’entrada
  • Prefereixes no associar l’identificador de la teva empresa amb activitat de proves

L’entorn staging és autoprovisionat: un cop tinguis identificadors de prova, pots començar proves end-to-end en menys de 24 hores.

Validació del SIRET a staging: a l’entorn staging, qualsevol número vàlid de 14 dígits s’accepta com a SIRET sense validar el checksum. Els identificadors ficticis del CSV QAS de Chorus Pro ja estan preregistrats a l’annuaire QAS de la DGFiP i funcionen end-to-end. En producció sí que es valida el format i checksum del SIRET.

Important: la DGFiP no permet SIREN ni SIRET reals al seu entorn QAS. Has d’utilitzar identificadors ficticis de prova. Pots obtenir-los tu mateix mitjançant el portal QAS de Chorus Pro (gratuït, procés d’uns 5 minuts) o demanar-ne un conjunt preassignat obrint un ticket de suport a l’app de staging.

Un compte per SIREN: B2Brouter crea un compte per SIREN i la clau del VAT number es deriva del SIREN. Si proporciones un SIRET, se n’extreu el SIREN. Dos SIRET diferents de la mateixa empresa (mateix SIREN) es resolen com un mateix compte. Si la teva empresa opera des de diversos establiments (SIRET diferents), aquests es modelen com a unitats organitzatives dins del mateix compte de B2Brouter, no com a comptes separats. Contacta amb Support si necessites configurar facturació multiestabliment. Tingues-ho present quan seleccionis files del CSV: tria SIRET amb SIREN diferents (els primers 9 dígits) per a cada empresa independent que vulguis provar.

Obtenir identificadors de prova via Chorus Pro QAS

Section titled “Obtenir identificadors de prova via Chorus Pro QAS”

El portal Chorus Pro QAS et permet generar un “Matelas de données” (joc de dades), és a dir, un fitxer CSV amb identificadors ficticis SIREN/SIRET preregistrats a l’entorn de proves de la DGFiP. Segueix aquests passos:

  1. Ves a qualif.chorus-pro.gouv.fr → pestanya EntrepriseCréer mon compte.
    • Pots utilitzar una adreça de correu temporal, com ara temp-mail.io.
    • Pots posar qualsevol nom; aquest compte només serveix per obtenir identificadors de prova.
  2. Revisa la teva safata d’entrada per trobar el correu “Initialisation de mot de passe Chorus Pro” i defineix la teva contrasenya. L’enllaç és vàlid durant 60 minuts.
  3. Inicia sessió → ves a DomainesMatelas de données → fes clic a Générer un matelas de données i confirma.
  4. Ves a Consultation du matelas de données. Espera fins que tots dos estats mostrin “Disponible”:
    • Statut pour Chorus Pro: Disponible
    • Statut pour l’annuaire de facturation PPF: Disponible
    • La generació acostuma a trigar pocs minuts. Refresca la pàgina per comprovar-ho.
  5. Fes clic a “Générer et télécharger le fichier CSV du matelas structures et utilisateurs” per descarregar els teus identificadors de prova.

El CSV conté diversos números ficticis SIREN/SIRET en files etiquetades com “Privé” i “Public”. Utilitza només les files de la secció “Privé” per als teus comptes de prova. Les entitats del sector públic (SIREN 'Public') són rebutjades per l’annuaire QAS de la DGFiP; si intentes activar l’e-Reporting en un compte del sector públic rebràs un HTTP 422. És el comportament correcte: les entitats públiques utilitzen Chorus Pro directament, no una PA.

Utilitza un SIREN del sector privat per al compte emissor i un altre per al contacte de prova.

Un cop tinguis els identificadors de prova:

  1. Registra’t a app-staging.b2brouter.net i activa el teu compte.
  2. Crea el compte de la teva empresa utilitzant un SIREN del CSV (vegeu Pas 1).
  3. Subscriu-te a un pla eDocExchange. Les subscripcions a staging són simulades i no tenen cost.
  4. Activa els DGFiP Tax Report Settings (vegeu Pas 2).
    • ⚠️ Després d’activar el DGFiP Tax Report Setting, el registre de la teva empresa a l’Annuaire pot trigar fins a 24 hores a propagar-se, tant a staging com a producció. És una limitació de la infraestructura DGFiP, no un retard de B2Brouter. No podràs enviar factures fins l’endemà.
  5. L’endemà, crea un contacte de prova amb un segon SIREN del CSV (vegeu Pas 3).
  6. Envia la teva primera factura (vegeu Emissió de factures).

L’autenticació utilitza una API key estàtica enviada a la capçalera HTTP X-B2B-API-Key. No hi ha cap flux OAuth2: genera la teva API key des de la interfície de B2Brouter a Settings → API Keys. Guarda-la de manera confidencial i no la incloguis mai en codi client-side. A més, estableix X-B2B-API-Version a cada petició.

Base URL: tots els exemples següents utilitzen https://api-staging.b2brouter.net. Per a producció, substitueix-lo per https://api.b2brouter.net.


Estructura del compte: matriu i unitats organitzatives

Section titled “Estructura del compte: matriu i unitats organitzatives”

Una empresa francesa amb diversos establiments o serveis es modela a B2Brouter com un compte matriu (l’entitat principal) i, opcionalment, una o més unitats organitzatives (UOs) penjades del matriu. La factura sempre s’emet des d’una matriu o d’una UO concreta, però el grup d’integració és comú.

El compte matriu sempre és a nivell de SIREN (cin_scheme="0002", l’entitat legal). Un SIRET no és mai matriu: crear una matriu francesa amb cin_scheme="0009" retorna 422 parameter_matriu_must_be_siren. Els establiments (SIRET) i serveis es modelen sempre com a UOs sota aquest matriu SIREN.

El que canvia segons la teva situació no és el nivell del matriu sinó on actives el Tax Report Setting de la DGFiP:

  • Si el SIREN encara no està registrat a cap altra Plateforme Agréée (PA): activa el Tax Report Setting sobre el matriu SIREN. Les UOs sense Tax Report Setting propi declaren a través del matriu automàticament. És el flux estàndard (Escenari 1).
  • Si el SIREN ja està registrat a una altra PA i només vols portar a B2Brouter un establiment concret: mantén el matriu a SIREN però no activis el Tax Report Setting sobre ell (transvasaria l’entrada existent de l’Annuaire). En comptes d’això, crea l’establiment com a UO SIRET i activa el Tax Report Setting sobre aquella UO, de manera que el registre existent del SIREN quedi intacte (Escenari 2).

Aquesta decisió determina on s’activa la declaració, no l’identificador del matriu (que sempre és SIREN). Si dubtes si el teu SIREN ja està registrat, consulta primer l’Annuaire amb el Directory lookup.

Comptes legacy (normalització): fins al juny de 2026, la plataforma permetia crear un compte matriu amb un SIRET. Si tens comptes creats així, cal normalitzar-los: substituir l’identificador del matriu pel SIREN (cin_scheme="0002", cin_value = el SIREN de 9 dígits) i crear el SIRET corresponent com a UO sota aquell matriu SIREN.

A B2Brouter, un compte o contacte francès es defineix amb un identificador principal (cin_scheme + cin_value) i, opcionalment, un sub-identificador (routing_codes.cin1_scheme + routing_codes.cin1_value) quan cal apuntar a un servei concret dins d’un establiment.

Identificador principal del compte / UO (cin_scheme + cin_value):

cin_schemeIdentificadorFormatExemple
0002 (2)SIREN — entitat legal9 dígits + Luhn123456789
0009 (9)SIRET — establiment14 dígits (SIREN + 5 dígits) + Luhn12345678900012
8040Suffix — UO sense SIRET propiAlfanumèric [A-Za-z0-9_\-\/]+SUF01, ADMIN

Sub-identificador (routing code) — només per a UOs SIRET amb diversos serveis interns:

routing_codes.cin1_schemeIdentificadorFormatExemple
224Code Routage — servei dins un SIRETAlfanumèric [A-Za-z0-9_\-\/]+ (mínim 1 caràcter alfanumèric)COMPTA, SERV01, A123

EAS Peppol del participant FR: l’identificador electrònic a la xarxa Peppol és sempre 0225 (FRCTC Electronic Address). Els schemes 224 (Code Routage) i 8040 (Suffix) són sub-identificadors interns del directori i no es publiquen com a EAS Peppol propi.

Suffix vs Code Routage — El Suffix (8040) és el cin_scheme principal d’una UO sense SIRET propi. El Code Routage (224), en canvi, sempre va a routing_codes.cin1_scheme="224" d’una UO amb SIRET — mai com a cin_scheme principal.

Important: un SIRET sol (sense SIREN davant) no és vàlid com a identificador complet publicat. Un SIRET viu sempre en una UO sota el matriu SIREN; la composició publicada és SIREN_SIRET, on el SIREN prové del compte matriu.

Veure els 4 formats d'identificador final a l'Annuaire
Composició AnnuaireQuè representa
SIRENEntitat sencera (matriu)
SIREN_SIRETEstabliment (Cas 1 / Cas 4)
SIREN_SIRET_<CR>Servei dins un establiment (Cas 2 / Cas 5)
SIREN_<SUFFIX>UO sense SIRET propi (Cas 3 / Cas 6)

Cap d’aquestes composicions és issue-only per si mateixa — tampoc la fila SIREN sola. Que una adreça també rebi factures (que es publiqui un transport 0225 per a ella) depèn únicament de la flag issue_only d’aquell Tax Report Setting, no de la composició utilitzada. Vegeu la nota sobre issue_only a l’Escenari 3 més avall.

Per veure els camps API exactes que generen cada format, consulta la taula Casos i topologies més avall.

L’estructura depèn de dos factors: si el SIREN està lliure d’altres PA, i si vols emetre o també rebre. Tres escenaris cobreixen totes les configuracions habituals.

Escenari 1 — SIREN principal (flux recomanat)

Section titled “Escenari 1 — SIREN principal (flux recomanat)”

Si el SIREN encara no està registrat a cap altra PA, el matriu sempre és a nivell de SIREN. La resta es modela com a UOs.

#CasCompte matriuUnitat organitzativa (office)Adreçament Annuaire
1A — Établissementcin_scheme="0002" (SIREN)cin_scheme="0009" (SIRET)SIREN_SIRET
2A — Servicecin_scheme="0002" (SIREN)cin_scheme="0009" (SIRET) + routing_codes.cin1_scheme="224"SIREN_SIRET_<CR>
6Suffix UOcin_scheme="0002" (SIREN)cin_scheme="8040" (Suffix)SIREN_<SUFFIX>
  • Cas 1 (A Établissement) — Modela establiments concrets per separat (matriu SIREN + N UOs SIRET).
  • Cas 2 (A Service) — Com el cas 1, més serveis interns dins un establiment identificats per Code Routage.
  • Cas 6 (Suffix UO) — UOs internes (departaments, unitats administratives) que no corresponen a establiments legals amb SIRET propi.

Escenari 2: Matriu SIREN, declaració sobre la UO de l’establiment (SIREN ja a una altra PA, portes un establiment concret)

Section titled “Escenari 2: Matriu SIREN, declaració sobre la UO de l’establiment (SIREN ja a una altra PA, portes un establiment concret)”

Si el SIREN ja està registrat a una altra PA i vols portar a B2Brouter un establiment concret sense alterar aquell registre existent, el matriu segueix sent a nivell de SIREN (un SIRET no és mai matriu). La diferència respecte a l’Escenari 1 és només on s’activa el Tax Report Setting: no sobre el matriu SIREN (que transvasaria l’entrada existent de l’Annuaire), sinó sobre la UO SIRET. La UO publica de manera independent (vegeu unitats organitzatives amb Tax Report Setting propi), de manera que el registre del SIREN amb l’altra PA queda intacte.

La topologia és la mateixa que els Casos 1 i 2 (matriu SIREN + UO SIRET, opcionalment amb un servei per Code Routage):

#CasCompte matriuUO que porta el Tax Report SettingAdreçament Annuaire
4C — Établissement-onlycin_scheme="0002" (SIREN), sense TRScin_scheme="0009" (SIRET) + Tax Report Setting propiSIREN_SIRET
5C — + Servicecin_scheme="0002" (SIREN), sense TRScin_scheme="0009" (SIRET) + routing_codes.cin1_scheme="224" + Tax Report Setting propiSIREN_SIRET_<CR>
  • Cas 4 (C Établissement-only) — Una única UO SIRET porta el Tax Report Setting; el matriu SIREN no en té cap.
  • Cas 5 (C + Service) — Com el Cas 4, més serveis interns d’aquell establiment adreçats per un Code Routage (routing_codes.cin1_scheme="224" a la UO SIRET).

Escenari 3 — Issue-only (només emissió, sense publicar transport 0225)

Section titled “Escenari 3 — Issue-only (només emissió, sense publicar transport 0225)”

Si el SIREN ja està a una altra PA i només vols emetre des de B2Brouter (sense publicar un transport 0225 que entraria en conflicte amb el de l’altra PA), usa la flag issue_only=true al compte matriu. B2Brouter no registrarà cap transport 0225 al PPF.

Cas pur — només issue_only=true (sense suffix):

  • cin_scheme="0002" (SIREN) + issue_only=true
  • Sense UOs, sense suffix
  • Adreçament Annuaire: SIREN (resta gestionat per l’altra PA)

Sub-cas amb suffix: quan a més cal adreçament intern SIREN_<SUFFIX>, crea el suffix com a Suffix UO (Cas 6), no a la matriu:

  • parent_id = matriu SIREN, cin_scheme="8040", cin_value="<SUFFIX>", amb issue_only=true en aquella UO
  • Un suffix (com qualsevol SIRET o Code Routage) és sempre una UO, mai col·locat a la matriu mateixa
  • Adreçament Annuaire: SIREN_<SUFFIX>

issue_only és independent del suffix: pots posar issue_only=true a la matriu SIREN sense cap suffix (només emissió). Un suffix, quan en cal un, és una Suffix UO a part (Cas 6).

Un suffix no vol dir issue-only. El suffix (SIREN_<SUFFIX>) és només un detall d’adreçament — que aquella adreça també rebi factures depèn exclusivament d’issue_only, no de la presència del suffix:

  • issue_only=true + suffix → es crea la Ligne SIREN_<SUFFIX> a l’Annuaire, però no es publica transport 0225 per a ella → només emissió, sense recepció. Fes servir això quan la recepció d’aquella adreça ja la gestiona una altra PA.
  • Sense issue_only (per defecte) + suffix → es publica el transport 0225 per a SIREN_<SUFFIX> → emissió i recepció a la mateixa adreça amb suffix, igual que qualsevol altra adreça.

Si vols emetre i rebre a una adreça amb suffix, no posis issue_only en aquell Tax Report Setting.

Contactes: mateix model, regla d’or més estricta

Section titled “Contactes: mateix model, regla d’or més estricta”

Els contactes a B2Brouter (clients i proveïdors francesos) segueixen exactament la mateixa jerarquia (matriu + UOs) i els mateixos cin_scheme (SIREN / SIRET / Code Routage / Suffix). Gestiona els contactes exactament igual que els teus comptes: el contacte matriu ha de ser el SIREN, i qualsevol SIRET, Code Routage o Suffix ha de ser una UO. Encara que el sistema admet tècnicament un contacte matriu a un altre nivell, fer-ho pot provocar trencaments quan més endavant afegeixis UOs del mateix client, així que mantén sempre el SIREN com a matriu.

Regla d’or per a contactes: el matriu és sempre el SIREN; modela qualsevol SIRET, Code Routage o Suffix com a UOs, igual que amb els comptes.

Amb el matriu a SIREN, els casos dels 3 escenaris són aplicables a contactes (les UOs poden ser SIRET, Code Routage o Suffix segons l’estructura del client).

Per crear una UO de contacte, fes servir el mateix endpoint que per a un contacte normal — POST /accounts/{ACCOUNT_ID}/contacts — afegint parent_id apuntant al contacte matriu. tin_value i tin_scheme són heretats del matriu i no es poden divergir.

Contactes legacy (normalització): igual que amb els comptes, fins al juny de 2026 un contacte es podia crear amb un SIRET com a matriu. Si tens contactes creats així, cal normalitzar-los: substituir l’identificador del contacte matriu pel SIREN (cin_scheme="0002") i crear el SIRET corresponent com a UO sota aquell contacte SIREN.


Pas 1: recupera o crea el compte de la teva empresa

Section titled “Pas 1: recupera o crea el compte de la teva empresa”

Recordatori d’estructura: el compte matriu és sempre cin_scheme="0002" (SIREN) — vegeu Estructura del compte. El que canvia entre escenaris no és l’identificador del matriu sinó on actives el Tax Report Setting (sobre el matriu SIREN a l’Escenari 1, sobre la UO SIRET a l’Escenari 2). Els establiments es creen sempre com a UOs al Pas 1b.

Si ja tens un compte de B2Brouter per a la teva empresa, recupera el seu id amb l’endpoint List Accounts i salta’t el pas de creació.

Si encara no l’has creat, utilitza l’endpoint Create Account (camí eDocSync/API) o l’assistent d’onboarding de la interfície web (camí eDocExchange). Tots dos produeixen el mateix resultat.

En crear un compte d’empresa francesa:

  • cin_scheme: sempre "0002" (SIREN, 9 dígits) per al compte matriu. Un SIRET no s’accepta com a identificador de matriu: crear una matriu francesa amb cin_scheme "0009" retorna 422 parameter_matriu_must_be_siren. Els establiments (SIRET) es creen com a unitats organitzatives sota el matriu SIREN (vegeu el Pas 1b).
  • cin_value: el SIREN de la teva empresa (9 dígits).
  • tin_value: número d’IVA francès en format FR{kk}{siren}, on kk és el checksum de dos dígits (p.ex. FR32123456789). És obligatori per a la facturació DGFiP; no cal que calculis el checksum tu. Si només informes el SIREN o només el número d’IVA, B2Brouter deriva l’altre automàticament quan actives el DGFiP Tax Report Setting. Aquesta derivació només passa en activar: si no informes el número d’IVA ni actives el Tax Report Setting, queda buit i la facturació fallarà, així que activa el setting per evitar problemes.
  • country: "fr".

Exemple de petició:

Finestra del terminal
curl --request POST \
--url https://api-staging.b2brouter.net/accounts \
--header 'X-B2B-API-Key: {YOUR_API_KEY}' \
--header 'X-B2B-API-Version: {YOUR_API_VERSION}' \
--header 'Content-Type: application/json' \
--data '{
"account": {
"country": "fr",
"name": "Exemplar SAS",
"address": "10 Rue Imaginaire",
"city": "Paris",
"postalcode": "75001",
"province": "Île-de-France",
"email": "john.doe@example.com",
"tin_value": "FR32123456789",
"tin_scheme": 9957,
"cin_scheme": "0002",
"cin_value": "123456789",
"rounding_method": "half_up"
}
}'

Resposta d’exemple:

{
"account": {
"id": 83428,
"name": "Exemplar SAS",
"tin_value": "FR32123456789",
"tin_scheme": 9957,
"cin_scheme": "0002",
"cin_value": "123456789",
"address": "10 Rue Imaginaire",
"city": "Paris",
"postalcode": "75001",
"province": "Île-de-France",
"country": "fr",
"currency": "EUR",
"email": "john.doe@example.com",
"rounding_method": "half_up",
"created_at": "2026-06-10T09:54:38.000Z",
"updated_at": "2026-06-10T09:54:38.000Z"
}
}

POST Account - API Reference

Pas 1b — Crear unitats organitzatives (opcional)

Section titled “Pas 1b — Crear unitats organitzatives (opcional)”

Si l’estructura de la teva empresa requereix UOs (vegeu casos 1, 2, 4, 5 i 6 a Topologies), crea cada UO amb POST /accounts afegint parent_id (l’ID del compte matriu creat al Pas 1a).

Aquesta funcionalitat requereix una versió de l’API que admeti UOs amb parent_id. Consulta el changelog de l’API per saber-ne la versió mínima.

Restriccions:

  • parent_id és obligatori per crear una UO.
  • Una UO no pot contenir tin_value ni tin_scheme (els hereta del matriu).
  • Una UO no pot ser parent d’una altra UO (només un nivell de profunditat).

Mapping UO ↔ resultat a l’Annuaire:

Tipus de UOCamps a enviar a POST /accountsResultat a l’Annuaire
Établissement (cas 1)parent_id (matriu SIREN) + cin_scheme="0009" + cin_value=<SIRET>SIREN_SIRET
Service (cas 2)parent_id (matriu SIREN) + cin_scheme="0009" + cin_value=<SIRET> + routing_codes.cin1_scheme="224" + routing_codes.cin1_value=<CR>SIREN_SIRET_<CR>
UO d’establiment que porta el seu propi TRS (Escenari 2, casos 4/5)Mateixos camps que el cas 1 (o el cas 2 per a un servei): parent_id (matriu SIREN) + cin_scheme="0009" + cin_value=<SIRET> [+ routing_codes.cin1_scheme="224" + routing_codes.cin1_value=<CR> per a un servei]. La diferència és que aquesta UO té el seu propi Tax Report Setting mentre que el matriu SIREN no en té cap.SIREN_SIRET / SIREN_SIRET_<CR>
Suffix (cas 6)parent_id (matriu SIREN) + cin_scheme="8040" + cin_value=<SUFFIX>SIREN_<SUFFIX>

Camps obligatoris en tots els payloads UO: a banda de parent_id i cin_*, has d’incloure country, email, address, city, postalcode i province. Sense aquests camps, la creació retorna HTTP 422 (“Region/Province/Country can’t be blank”). El tin_value i tin_scheme s’hereten del matriu i no s’han de repetir.

El SIRET d’una UO Établissement comença sempre pels 9 dígits del SIREN matriu (definició INSEE). Si el matriu té SIREN 123456789, els seus SIRETs vàlids tenen la forma 123456789XXXXX.

Exemple — UO de tipus Établissement amb Service opcional (Casos 1 i 2):

Finestra del terminal
curl --request POST \
--url https://api-staging.b2brouter.net/accounts \
--header 'X-B2B-API-Key: {YOUR_API_KEY}' \
--header 'X-B2B-API-Version: {YOUR_API_VERSION}' \
--header 'Content-Type: application/json' \
--data '{
"account": {
"name": "Exemplar SAS — Sucursal Paris",
"parent_id": {PARENT_ACCOUNT_ID},
"cin_scheme": "0009",
"cin_value": "12345678900012",
"routing_codes": { "cin1_scheme": "224", "cin1_value": "COMPTA" },
"country": "fr",
"email": "sucursal-paris@example.com",
"address": "1 Rue de la Paix",
"city": "Paris",
"postalcode": "75001",
"province": "Île-de-France"
}
}'

Per a un establiment sense Code Routage (Cas 1 pur), omet el bloc routing_codes.

Exemple — UO d’establiment que porta el seu propi Tax Report Setting (Escenari 2, casos 4/5):

La UO es crea exactament com al Cas 1/2 (a sota, una variant de servei amb Code Routage). La diferència a l’Escenari 2 és que després actives un Tax Report Setting sobre aquesta UO (no sobre el matriu SIREN), de manera que el registre existent del SIREN a l’Annuaire amb una altra PA es preserva (vegeu el Pas 2).

Finestra del terminal
curl --request POST \
--url https://api-staging.b2brouter.net/accounts \
--header 'X-B2B-API-Key: {YOUR_API_KEY}' \
--header 'X-B2B-API-Version: {YOUR_API_VERSION}' \
--header 'Content-Type: application/json' \
--data '{
"account": {
"name": "Exemplar SAS — Servei Comptabilitat",
"parent_id": {PARENT_ACCOUNT_ID},
"cin_scheme": "0009",
"cin_value": "12345678900012",
"routing_codes": { "cin1_scheme": "224", "cin1_value": "COMPTA" },
"country": "fr",
"email": "comptabilitat@example.com",
"address": "1 Rue de la Paix",
"city": "Paris",
"postalcode": "75001",
"province": "Île-de-France"
}
}'

La UO porta el SIRET com a cin_scheme="0009" principal i, per a un servei, l’identifica via routing_codes.cin1_value. El Code Routage mai va com a cin_scheme principal. Per a una UO només d’establiment (Cas 4), omet el bloc routing_codes.

Exemple — UO de tipus Suffix (Cas 6):

Finestra del terminal
curl --request POST \
--url https://api-staging.b2brouter.net/accounts \
--header 'X-B2B-API-Key: {YOUR_API_KEY}' \
--header 'X-B2B-API-Version: {YOUR_API_VERSION}' \
--header 'Content-Type: application/json' \
--data '{
"account": {
"name": "Exemplar SAS — Unitat Administrativa",
"parent_id": {PARENT_ACCOUNT_ID},
"cin_scheme": "8040",
"cin_value": "SUF01",
"country": "fr",
"email": "admin-unit@example.com",
"address": "1 Rue de la Paix",
"city": "Paris",
"postalcode": "75001",
"province": "Île-de-France"
}
}'

Els casos d’Issue-only (Escenari 3) no es creen com a UO — són el mateix matriu SIREN, definit al Pas 1a amb cin_scheme="0002" (i issue_only=true, més un suffix 8040 opcional). Els casos 4 i 5 (Escenari 2), en canvi, que són UOs: un matriu SIREN més una UO SIRET que porta el seu propi Tax Report Setting.


Pas 2: activa Tax Report Settings per a DGFiP

Section titled “Pas 2: activa Tax Report Settings per a DGFiP”

Aquest és el pas clau de l’onboarding. Quan crees un Tax Report Setting amb code: "dgfip", B2Brouter:

  1. Registra la teva empresa a l’Annuaire del PPF: el teu SIREN/SIRET passa a ser visible per a qualsevol plataforma de l’ecosistema francès de facturació electrònica.
  2. Crea un transport Peppol 0225: això permet que la teva empresa rebi factures electròniques de qualsevol plataforma francesa connectada a Peppol.

⚠️ Substitució del transport: Si el compte sobre el qual actives ja té un transport Peppol, es substituirà pel nou transport 0225 (FRCTC Electronic Address) durant l’activació. Si el SIREN sobre el qual actives estava registrat prèviament amb una altra PA, B2Brouter tancarà l’entrada existent a l’Annuaire i n’obrirà una de nova. Si necessites conservar aquell registre existent, no activis sobre el SIREN; activa sobre una UO SIRET (vegeu “On activar” més avall). Actualitza qualsevol integració existent que faci referència a l’identificador de l’antic transport.

On activar el Tax Report Setting: {ACCOUNT_ID} pot ser el matriu SIREN, una UO SIRET, o tots dos. Cada compte (matriu o UO) que té Tax Report Setting propi es publica a l’Annuaire amb la seva pròpia adreça; una UO sense TRS declara a través del matriu. Tres configuracions:

  1. TRS només al SIREN: l’empresa es publica com a SIREN i els establiments declaren a través seu (cas estàndard, Escenari 1).
  2. TRS al SIREN i a una o més UOs SIRET: l’empresa es publica alhora com a SIREN i com a cada SIREN_SIRET (una adreça d’Annuaire per compte activat), de manera que l’entitat sencera i els establiments concrets són adreçables cadascun.
  3. TRS només a una UO SIRET, no al SIREN: només es publica aquell establiment (SIREN_SIRET); el SIREN no (Escenari 2). Usa-ho quan el SIREN ja està registrat amb una altra PA i vols conservar aquell registre.

Vegeu Estructura del compte per al model complet.

El start_date determina quan comença la declaració fiscal. A partir d’aquesta data, les factures que emetis generaran tax reports i es transmetran al PPF.

Exemple de petició:

Finestra del terminal
curl --request POST \
--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": "dgfip",
"start_date": "2026-09-01",
"type_operation": "services",
"naf_code": "62",
"enterprise_size": "eti",
"email": "jane.doe@example.com"
}
}'

Resposta d’exemple:

{
"tax_report_setting": {
"code": "dgfip",
"start_date": "2026-09-01",
"auto_generate": true,
"auto_send": true,
"enabled": true,
"type_operation": "services",
"naf_code": "62",
"enterprise_size": "eti",
"email": "jane.doe@example.com",
"locked": false,
"created_at": "2026-06-10T10:15:22.000Z",
"updated_at": "2026-06-10T10:15:22.000Z"
}
}
CampTipusObligatoriDescripció
codestringHa de ser "dgfip".
start_datedateQuan comença la declaració fiscal. Ha de ser avui o una data futura. Si s’omet, el valor per defecte és demà.
type_operationstringTipus d’operació per defecte per a aquesta empresa: "services", "goods" o "mixed". Determina el codi de procés DGFiP (S1/B1, etc.) utilitzat als tax reports. Tria "mixed" si l’empresa ven tant béns com serveis. En una factura mixta, el tax report del Flux 1 s’emet amb el codi de procés de serveis (S1/S2/S4/S7) i només reporta els breakdowns de serveis; la DGFiP no té cap cadre “M” propi per al Flux 1 (vegeu Codis de procés). Aquest ajust es pot modificar després de l’activació.
naf_codestringEl codi NAF/APE de l’empresa. És el codi de secció de 2 dígits assignat per l’INSEE que identifica l’activitat econòmica principal de l’empresa. La DGFiP l’utilitza per classificar la declaració fiscal.
enterprise_sizestringLa categoria de mida de l’empresa definida per l’INSEE. Valors admesos: "micro", "pme", "eti" o "ge".
reason_vat_exemptstringNoCodi per defecte del motiu d’exempció d’IVA per a l’empresa. Per defecte és "VATEX-FR-FRANCHISE".
emailstringNoCorreu de contacte per a notificacions fiscals.
auto_generatebooleanNoSempre true per a DGFiP per obligació legal. No es pot canviar.
auto_sendbooleanNoTransmet automàticament els tax reports al PPF. Per defecte és true.
enabledbooleanNoIndica si la configuració està activa. Per defecte és true. El registre a l’Annuaire només es produeix quan és true.
annuaire_onlybooleanNoQuan és true, el compte només es registra a l’Annuaire del PPF per a recepció. No es generen tax reports Flux 1 ni missatges CDAR; enterprise_size i naf_code són opcionals. Per defecte és false. Vegeu Mode reception-only.

Si el registre a l’Annuaire falla, per exemple per SIREN/SIRET invàlid o per una caiguda temporal dels serveis DGFiP, la creació del Tax Report Setting es desfà i es retorna un error. Corregeix el problema i torna-ho a provar.

Tax Report Settings - API Reference

Si el teu compte només necessita rebre factures electròniques (no emetre’n) — per exemple, una empresa que encara no està obligada a emetre però vol estar registrada a l’Annuaire perquè els seus proveïdors li puguin enviar factures via Peppol — pots activar el DGFiP Tax Report Setting amb annuaire_only: true.

Què activa:

  • Registra la teva empresa a l’Annuaire del PPF (visible per als emissors).
  • Crea el transport Peppol 0225 per a la recepció.

Què suprimeix respecte a un activament complet:

  • No es generen tax reports Flux 1 al moment d’emetre factures.
  • No s’envien missatges CDAR (cicle Déposée → Reçue → Approuvée…).
  • Els camps enterprise_size i naf_code no són obligatoris.

Aquest mode és útil per a empreses receptores en fase d’avaluació, o per a entitats que tenen un proveïdor de facturació diferent però volen recepcionar via B2Brouter. Quan vulguis emetre, actualitza el Tax Report Setting a mode complet amb un PATCH (vegeu Tax Report Settings Guide).

Exemple — activació reception-only:

Finestra del terminal
curl --request POST \
--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": "dgfip",
"start_date": "2026-09-01",
"annuaire_only": true,
"email": "jane.doe@example.com"
}
}'

Un contacte B2B francès necessita identificadors d’encaminament i identificació fiscal.

CampValorFinalitat
cin_scheme"0009" (SIRET) o "0002" (SIREN)Identificador de l’organització, utilitzat per cercar el destinatari a l’Annuaire
cin_valueSIRET o SIRENIdentificador registrat a l’Annuaire
tin_scheme9957Tax ID, codi ISO 6523 per a l’identificador fiscal francès
tin_valueFR{kk}{siren}Número d’IVA francès que apareix a l’UBL XML
pin_scheme"0225"EAS Peppol del participant FR (FRCTC Electronic Address) — obligatori per a contactes francesos
pin_valueComposició Annuaire del destinatariIdentificador Peppol del contacte; segueix la mateixa composició que la matriu a l’Annuaire (SIREN, SIREN_SIRET, SIREN_SIRET_<CR> o SIREN_<SUFFIX> — vegeu Nivells d’identificador)
country"fr"Obligatori per a la lògica d’encaminament DGFiP
currency"EUR"Moneda per defecte per a les factures d’aquest contacte
transport_type_code"peppol"Recomanat per garantir l’entrega via xarxa Peppol
document_type_code"xml.ubl.invoice.frcius.v1"Recomanat: format de factura UBL France CIUS

Transport i tipus de document: per a contactes francesos registrats a l’Annuaire, recomanem establir explícitament transport_type_code: "peppol" i document_type_code: "xml.ubl.invoice.frcius.v1". Sense pin_value la creació retorna HTTP 422 (“Peppol Endpoint ID can’t be blank”). Pots verificar abans si un contacte està registrat a l’Annuaire fent servir el Directory lookup o el Peppol Directory oficial.

Contactes a Bèlgica, Alemanya i altres països de la UE: per a factures B2B a empreses no franceses, utilitza l’esquema nacional corresponent i el country adequat. Si el destinatari té un access point Peppol actiu, B2Brouter encaminarà la factura via Peppol BIS 3.0. Per a qualsevol transacció amb un contacte amb country diferent de "fr", es generarà automàticament Flux 10 d’e-Reporting transfronterer.

Exemple de petició:

Finestra del terminal
curl --request POST \
--url https://api-staging.b2brouter.net/accounts/{ACCOUNT_ID}/contacts \
--header 'X-B2B-API-Key: {YOUR_API_KEY}' \
--header 'X-B2B-API-Version: {YOUR_API_VERSION}' \
--header 'Content-Type: application/json' \
--data '{
"contact": {
"name": "Client Exemple SARL",
"address": "25 Avenue de la République",
"city": "Lyon",
"postalcode": "69001",
"country": "fr",
"currency": "EUR",
"language": "fr",
"is_client": true,
"cin_scheme": "0009",
"cin_value": "98765432100011",
"tin_scheme": 9957,
"tin_value": "FR05987654321",
"pin_scheme": "0225",
"pin_value": "987654321_98765432100011",
"transport_type_code": "peppol",
"document_type_code": "xml.ubl.invoice.frcius.v1"
}
}'

POST Contact - API Reference

Contactes amb estructura multinivell: si el teu client té diversos establiments o serveis que cal identificar per separat, crea primer el contacte matriu a nivell SIREN i després afegeix UOs amb parent_id. Vegeu Estructura del compte per a la regla d’or i les topologies aplicables.

Opcional: verifica l’encaminament del destinatari (consulta al directori)

Section titled “Opcional: verifica l’encaminament del destinatari (consulta al directori)”

B2Brouter encamina les factures automàticament. Si vols inspeccionar com s’encaminarà un destinatari abans d’enviar, per exemple per confirmar si està registrat a l’Annuaire, utilitza la consulta al directori (Flux 11):

Finestra del terminal
curl --request GET \
--url https://api-staging.b2brouter.net/directory/fr/0009/98765432100011 \
--header 'X-B2B-API-Key: {YOUR_API_KEY}' \
--header 'X-B2B-API-Version: {YOUR_API_VERSION}'

Resposta resolta — exemple:

{
"external_company": {
"country": "fr",
"cin_scheme": "0009",
"cin_value": "98765432100011",
"information_flags": ["FR_ASSUJETTI_ACTIVE"],
"source": ["peppol", "annuaire"]
}
}

Camps específics de França:

CampValorsSignificat
information_flagsFR_ASSUJETTI_ACTIVEDestinatari registrat i actiu a l’Annuaire del PPF
FR_ASSUJETTI_INACTIVEDestinatari amb registre fora de vigència o sense PA assignada
FR_ASSUJETTI_UNKNOWNEl PPF no té informació concloent (per exemple, 404)
sourcearray de "peppol", "annuaire"Orígens consultats. Si apareixen tots dos, B2Brouter ha trobat el destinatari a ambdós directoris

Aquesta consulta és informativa: B2Brouter ja resol l’encaminament automàticament en crear la factura (vegeu Verificació a l’Annuaire i generació de tax reports). Fes-la servir per inspeccionar abans d’enviar o per pintar l’estat del destinatari a la teva UI.

GET Lookup Directory - API Reference

Verificació a l’Annuaire i generació de tax reports

Section titled “Verificació a l’Annuaire i generació de tax reports”

B2Brouter verifica automàticament si els contactes francesos (country: "fr") estan registrats a l’Annuaire de la DGFiP. Aquesta verificació determina el flux de declaració fiscal:

  • Contacte registrat a l’Annuaire (in_dgfip_annuaire: true o encara no verificat): la factura genera un tax report de Flux 1.
  • Contacte NO registrat a l’Annuaire (in_dgfip_annuaire: false): la factura no genera tax report. Això evita enviaments Flux 1 invàlids a destinataris que el PPF no pot encaminar.
  • Contacte encara no verificat (in_dgfip_annuaire: nil): B2Brouter és permissiu; la factura continua i genera tax report. La verificació es fa de manera asíncrona en segon pla.

Si crees un contacte francès i immediatament hi envies una factura, és possible que la verificació de l’Annuaire encara no hagi acabat. És intencionat: B2Brouter no bloqueja la creació de factures mentre la verificació està pendent. Si després resulta que el contacte no està registrat, les futures factures cap a aquest contacte no generaran tax reports Flux 1 fins que el contacte es registri en una PA.

La comprovació de l’Annuaire només s’aplica a contactes francesos domèstics (country: "fr"). Els contactes no francesos sempre segueixen el camí d’e-Reporting Flux 10 independentment de l’estat de l’Annuaire.

Important — ambdues empreses a l’Annuaire DGFiP: per a un enviament FR → FR amb tax report Flux 1, tant l’emissor com el receptor han d’estar registrats a l’Annuaire de la DGFiP. Si una de les dues no hi és, el tax report no es pot completar i la factura s’envia sense declaració.

Com comprovar la inscripció a l’Annuaire DGFiP:

⚠️ La web annuaire-entreprises.data.gouv.fr és per a dades fiscals generals; no garanteix la inscripció a l’Annuaire DGFiP — són bases diferents.

A partir de setembre de 2026 aquest comportament permissiu deixarà d’aplicar-se: les declaracions simplement fallaran si l’identificador no consta com a activable a la DGFiP, encara que el SIREN/SIRET sigui vàlid.


Un cop la teva empresa ha completat l’onboarding i el DGFiP Tax Report Setting està activat, la creació de factures funciona mitjançant l’Invoice API estàndard. B2Brouter gestiona automàticament tots els requisits específics de França: generació de tax reports, format UBL/CII/Factur-X i transmissió al PPF via Flux 1.

Utilitza send_after_import: true per crear i transmetre en un sol pas. Estableix-lo a false si vols crear la factura primer i revisar-la abans d’enviar-la; en aquest cas, la factura quedarà en estat new fins que en desencadenis la transmissió amb una crida separada o des de la interfície de B2Brouter.

Data de la factura: per a comptes amb DGFiP Tax Report Setting actiu, la date de la factura no pot ser una data futura. Si es passa una data posterior a avui, l’enviament retorna HTTP 422 (“Only invoices with today’s date are allowed”). Els exemples d’aquesta guia usen dates fictícies; substitueix-les per la data actual quan facis proves.

Número de factura: el number de la factura està limitat a 20 caràcters com a màxim. Un número més llarg es rebutja amb HTTP 422 (number massa llarg).

Facturació seqüencial: l’API processa una factura per petició. En escenaris batch o massius, itera sobre la llista de factures i crida l’endpoint per a cada document. L’API admet peticions concurrents, de manera que pots paral·lelitzar múltiples POSTs.

El cas més habitual: una factura B2B domèstica francesa amb TVA estàndard del 20%.

Finestra del terminal
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": {
"type": "IssuedInvoice",
"contact_id": 1313228381,
"number": "FA-2026-0048",
"date": "2026-09-15",
"due_date": "2026-10-15",
"currency": "EUR",
"payment_method": 4,
"bank_account_id": {YOUR_BANK_ACCOUNT_ID},
"remittance_information": "FA-2026-0048 — Exemplar SAS, SAS au capital de 50 000 EUR, RCS Paris 123 456 789",
"payment_method_text": "Virement bancaire",
"payment_terms": "Net 30 jours à compter de la date de facture. Pénalité de retard : 12% annuel.",
"invoice_lines_attributes": [
{
"quantity": 10.0,
"description": "Consulting services — architecture review",
"price": 150.0,
"unit": 9,
"taxes_attributes": [
{ "name": "TVA", "percent": 20.0, "category": "S" }
]
},
{
"quantity": 5.0,
"description": "Training sessions — API integration",
"price": 200.0,
"unit": 9,
"taxes_attributes": [
{ "name": "TVA", "percent": 20.0, "category": "S" }
]
}
]
}
}'

L’array tax_report_ids de la resposta conté l’ID del tax report generat. Fes-lo servir per seguir el cicle de vida de l’enviament.

POST Invoice - API Reference

Camps específics de França a les factures

Section titled “Camps específics de França a les factures”

Informació de pagament (camps nadius obligatoris)

Section titled “Informació de pagament (camps nadius obligatoris)”

Tres camps de pagament són obligatoris per a les factures electròniques B2B franceses (IssuedInvoice). Proporciona’ls com a camps directes de l’API:

CampCamp DGFiPDescripcióObligatori
remittance_informationPMDReferència de pagament i mencions legalsSí, per a B2B domèstic i transfronterer
payment_method_textPMTDescripció textual del mètode de pagamentSí, per a B2B domèstic i transfronterer
payment_termsAABData de venciment, penalitzacions per retard i condicions de descompteSí, per a B2B domèstic i transfronterer
bank_account_idId del compte bancari associat al teu compte de B2Brouter. Obligatori quan payment_method és transferència bancària (codi 4)Sí, si pagament per transferència

Si falta algun dels camps obligatoris, la petició retorna HTTP 422 amb errors explícits per a cada camp absent. La factura no es crea.

Bank account: crea primer un bank account associat al teu compte (des de la interfície web o via API) i referencia el seu id a la factura amb bank_account_id. El bank account inclou IBAN i BIC i és la font canònica d’aquesta informació — no els passis com a text lliure dins payment_method_text.

Les factures B2C (IssuedSimplifiedInvoice) no requereixen aquests camps.

Importació des d’altres formats (UBL, CII, Factur-X): per a aquestes integracions, utilitza el camp extra_info amb etiquetes estructurades:

#PMD# FA-2026-0048 — Exemplar SAS, RCS Paris 123 456 789
#PMT# Credit Transfer, IBAN FR00 0000 0000 0000 0000 0000 000, BIC XXXXFRPP
#AAB# Net 30 jours. Pénalité de retard : 12% annuel.

B2Brouter extreu aquestes etiquetes i les mapeja automàticament als camps nadius corresponents.

Quan una línia té category: "E" (exempta d’IVA), també has de proporcionar un comment amb el codi d’exempció VATEX-FR-CGI261-* aplicable.

⚠️ Bloqueig silenciós: si s’omet comment en una línia de categoria E, la factura es crea però mai no es transmet al PPF. La resposta contindrà un array errors no buit, així que cal revisar-lo fins i tot en respostes exitoses.

Codis d’exempció d’IVA DGFiP

CodiReferència legalCategoriaDescripció
VATEX-FR-FRANCHISEArt. 293 B CGIZFranchise en base de TVA
VATEX-FR-CNWVATENo establert a França
VATEX-FR-AEEAutoliquidació
VATEX-FR-CGI261-1Art. 261-1° CGIECures i serveis mèdics
VATEX-FR-CGI261-2Art. 261-2° CGIEServeis paramèdics
VATEX-FR-CGI261-3Art. 261-3° CGIEEnsenyament escolar, universitari i formació professional
VATEX-EU-F / -I / -JERègim de la marge (margin scheme)

Codis d’exempció de nivell UE: a més dels codis nacionals VATEX-FR-* de dalt, la DGFiP també accepta la llista VATEX-EU-* (extensions UNCL5305 / EN16931). El règim de la marge utilitza VATEX-EU-F, VATEX-EU-I o VATEX-EU-J en una línia de categoria E. Indica el codi aplicable al comment de la línia.

Franchise en base de TVA (VATEX-FR-FRANCHISE)

Section titled “Franchise en base de TVA (VATEX-FR-FRANCHISE)”

Les empreses sota el règim franchise en base de TVA operen a tipus zero (categoria Z), no com a exemptes (E). Per a aquestes factures, estableix percent: 0.0, category: "E" i comment: "VATEX-FR-FRANCHISE" a cada línia d’impost; B2Brouter transcodificarà automàticament la categoria a Z.

{
"taxes_attributes": [
{
"name": "TVA",
"percent": 0.0,
"category": "E",
"comment": "VATEX-FR-FRANCHISE"
}
]
}

Operacions fora del camp de l’IVA (categoria O)

Section titled “Operacions fora del camp de l’IVA (categoria O)”

Algunes operacions queden fora del camp d’aplicació de l’IVA i han de portar la categoria O amb percent: 0.0, no la categoria E (exempta) ni Z (tipus zero). Dos casos habituals:

  • Détaxe (operacions fora del camp de l’IVA): la línia no porta IVA.
  • Débours (despeses reembossables avançades en nom del client): es traspassen sense IVA.
{
"taxes_attributes": [
{ "name": "TVA", "percent": 0.0, "category": "O" }
]
}

El tax report del Flux 1 sintetitza automàticament el TaxSubtotal de categoria O corresponent. La categoria NS també s’accepta i es transcodifica a O.

Per emetre una nota de crèdit, estableix is_amend: true i referencia la factura original amb amended_number i amended_date. B2Brouter generarà un UBL CreditNote amb codi de tipus 381 i inclourà la referència de facturació.

Finestra del terminal
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": {
"type": "IssuedInvoice",
"contact_id": 1313228381,
"number": "NC-2026-001",
"date": "2026-09-25",
"due_date": "2026-10-25",
"is_credit_note": true,
"is_amend": true,
"amended_number": "FA-2026-0048",
"amended_date": "2026-09-15",
"currency": "EUR",
"payment_method": 4,
"bank_account_id": {YOUR_BANK_ACCOUNT_ID},
"remittance_information": "NC-2026-001 — annule et remplace FA-2026-0048. Exemplar SAS",
"payment_method_text": "Virement bancaire",
"payment_terms": "Remboursement sous 30 jours.",
"invoice_lines_attributes": [
{
"quantity": -1.0,
"description": "Annulation partielle — Consulting services",
"price": 500.0,
"unit": 9,
"taxes_attributes": [
{ "name": "TVA", "percent": 20.0, "category": "S" }
]
}
]
}
}'

El codi de procés determina el flux cadre del PPF. B2Brouter l’assigna automàticament segons type_operation del Tax Report Setting i les característiques de la factura.

Codi de procésTipus d’operacióDescripció
S1ServicesFactura estàndard de serveis
B1GoodsFactura estàndard de béns
M1MixedFactura estàndard d’operacions mixtes
S2ServicesFactura pagada de serveis
B2GoodsFactura pagada de béns
M2MixedFactura pagada d’operacions mixtes
S4ServicesFactura amb bestretes (serveis)
B4GoodsFactura amb bestretes (béns)
M4MixedFactura amb bestretes (mixt)
S7ServicesRectificació d’una factura registrada (serveis)
B7GoodsRectificació d’una factura registrada (béns)

Cap cadre “M” al Flux 1: encara que type_operation accepta "mixed", el tax report del Flux 1 mai porta un codi de procés de la sèrie M. Una factura mixta es resol amb el codi de serveis corresponent (S1/S2/S4/S7) i només reporta els seus breakdowns de serveis. Les files M de dalt es llisten com a referència, però el Flux 1 no les produeix.

Document Type CodeFormatDescripció
xml.ubl.invoice.frcius.v1UBL XMLFactura Peppol France CIUS (Flux 1 / Annuaire)
xml.cii.cross_industry_invoice.frcius.v1CII XMLFactura France CIUS CII
xml.cii.cross_industry_invoice.facturx.fr.all_profiles.v1Factur-X (CII XML)Factura France CIUS Factur-X (tots els perfils)

Si el teu sistema ja genera factures Factur-X o UBL XML, pots enviar-les directament amb l’endpoint d’importació:

POST /accounts/{id}/invoices/import

Estableix Content-Type a:

  • application/pdf per a Factur-X
  • application/xml per a UBL 2.1 o CII XML independents

França fa servir un model en Y (5 cantonades), no de clearance. La factura es transmet al comprador independentment que es registri un informe fiscal Flux 1; el PPF no valida prèviament les factures abans que arribin al comprador. La Factura i l’Informe fiscal són cicles de vida separats que només coincideixen en el lliurament del Flux 1. Un error en l’informe fiscal no desfà una factura que ja ha arribat al comprador.

EstatCDV DGFiPDescripció
sendingLa factura s’ha creat i està en cua per transmetre’s al PPF
sent200 — DéposéeLa factura s’ha dipositat al PPF correctament
registered202 — ReçueEl PPF l’ha validat i lliurat al comprador
accepted205 — ApprouvéeEl comprador ha aprovat la factura
refused210 — RefuséeEl comprador ha rebutjat la factura
paid212 — EncaisséeEl pagament de la factura s’ha confirmat
errorS’ha produït un error durant la transmissió o la validació al PPF. El camp errors conté el motiu del rebuig. Si la factura s’ha rebutjat abans del registre (estat sending o sent), elimina-la, corregeix el problema i envia’n una de nova; les factures amb error no es poden retransmetre directament. Una factura registrada (CDV 202 o posterior) no es pot eliminar ni tornar a enviar: ja és dins el cicle de vida del comprador. Corregeix-la amb un abonament o una rectificació (codi de procés S7/B7), o anul·la-la.

Configura endpoints de webhook des de la interfície de B2Brouter a Settings → Webhooks. Un cop configurats, B2Brouter enviarà un HTTP POST al teu endpoint cada vegada que la factura arribi a un nou estat.

Invoice Status WebHooks - API Reference

Finestra del terminal
curl --request GET \
--url https://api-staging.b2brouter.net/invoices/{INVOICE_ID} \
--header 'X-B2B-API-Key: {YOUR_API_KEY}' \
--header 'X-B2B-API-Version: {YOUR_API_VERSION}' \
--header 'Accept: application/json'

GET Invoice - API Reference

Descarregar el document original de la factura

Section titled “Descarregar el document original de la factura”

Quan una factura arriba a l’estat sent, la resposta de GET /invoices/{id} inclou el camp download_legal_url. Fes-lo servir per descarregar el document de factura que s’ha transmès.

Finestra del terminal
curl --request GET \
--url https://api-staging.b2brouter.net{download_legal_url} \
--header 'X-B2B-API-Key: {YOUR_API_KEY}' \
--header 'X-B2B-API-Version: {YOUR_API_VERSION}'

Com a alternativa en un sol pas, pots cridar directament GET /invoices/{id}/as/legal, sense haver d’obtenir primer download_legal_url del payload de la factura. Retorna el document legal arxivat tal com està emmagatzemat i no genera cap transacció facturable — consulta Descarregar factures i Transaction: View_as.

Estat Encaissée — confirmació de pagament

Section titled “Estat Encaissée — confirmació de pagament”

Encaissée és l’últim estat del cicle CDV d’una factura B2B francesa, just després de l’aprovació pel comprador. Indica que el pagament s’ha confirmat (vegeu el mapping CDV complet a la taula Estats de factura).

B2Brouter propaga la confirmació de pagament al PPF per una de dues vies, segons la naturalesa de la factura:

CasBrancaMecanisme
Domèstic FR → FR (B2Brouter detecta company.country == "fr" i contact.country == "fr")CDAREnvia un missatge CDV 212 (transició d’estat) sense generar tax report addicional
Cross-border (B2B intra-UE / extra-UE) o B2C (IssuedSimplifiedInvoice)Flux 10 fitxer CGenera un tax report al Ledger C — payments (vegeu Model de 3 ledgers)

Quan el cobrament està confirmat, marca la factura al PPF amb una crida al mark_as:

Finestra del terminal
curl --request POST \
--url https://api-staging.b2brouter.net/invoices/{INVOICE_ID}/mark_as \
--header 'X-B2B-API-Key: {YOUR_API_KEY}' \
--header 'X-B2B-API-Version: {YOUR_API_VERSION}' \
--header 'Content-Type: application/json' \
--data '{"state":"paid"}'

Properament gestionables per API. De moment, l’API només permet marcar la factura quan estigui completament pagada (state: "paid").

Si gestiones els pagaments des d’un ERP, mantén el control intern dels parcials i no marquis l’estat al PPF fins que el total estigui cobert. Alternativament, pots gestionar els parcials des de l’app de B2Brouter: obre la factura → Crear cobrament → defineix l’import pagat.


El tax report segueix el cicle de vida tècnic de l’enviament al PPF. Tant la generació de l’XML com la transmissió al PPF són asíncrones.

Flux 1 — Factures B2B domèstiques

EstatDescripció
newTax report creat i en cua per a transmissió
sentDocument dipositat al PPF via SFTP
acknowledgedEl PPF ha rebut i validat el fitxer
registeredEstat terminal: factura acceptada i registrada per la DGFiP
refusedEstat terminal: rebutjada per la DGFiP
errorEstat terminal: error de transmissió o processament
annulledLa factura ha estat anul·lada després del registre

Flux 10 — Factures B2B transfrontereres i B2C (e-Reporting)

EstatDescripció
newTax report creat i acumulat per al batch diari de ledger
sentLedger dipositat al PPF via SFTP
acknowledgedEl PPF ha rebut el ledger
registeredEstat terminal: ledger acceptat i registrat per la DGFiP
refusedEstat terminal: ledger rebutjat per la DGFiP
errorEstat terminal: error de transmissió o processament

Consulta l’estat utilitzant el tax report ID obtingut a tax_report_ids a la resposta de la factura:

Finestra del terminal
curl --request GET \
--url https://api-staging.b2brouter.net/tax_reports/{TAX_REPORT_ID} \
--header 'X-B2B-API-Key: {YOUR_API_KEY}' \
--header 'X-B2B-API-Version: {YOUR_API_VERSION}'

GET Tax Report - API Reference


El Flux 10 cobreix transaccions fora de l’obligació de facturació electrònica B2B domèstica però que igualment s’han d’informar a la DGFiP. B2Brouter gestiona el Flux 10 automàticament.

Si ja generes el teu propi <Report> F10 i només necessites un canal acreditat per dipositar-lo, consulta Submissió d’un fitxer de Flux 10.

Vendes a particulars no registrats a l’IVA a França. Utilitza "type": "IssuedSimplifiedInvoice". El contact_id i els camps de pagament no són obligatoris per a factures B2C.

Operacions transfrontereres (B2B intra-UE i extra-UE)

Section titled “Operacions transfrontereres (B2B intra-UE i extra-UE)”

Les vendes o compres amb empreses establertes fora de França s’han d’informar via Flux 10. Utilitza el tipus estàndard IssuedInvoice o ReceivedInvoice i estableix el country de la contraparte a un valor diferent de "fr". B2Brouter detectarà automàticament la naturalesa transfronterera.

Territoris francesos d’ultramar: els departaments DROM Guadalupe (gp), Martinica (mq) i La Reunió (re) es tracten com a França domèstica. Les factures a contactes d’aquests territoris generen un tax report del Flux 1 i porten IdentificationCode FR, exactament igual que la França metropolitana. La resta de territoris d’ultramar (Guaiana gf, Mayotte yt, Polinèsia Francesa pf, Nova Caledònia nc, TAAF tf, Saint-Pierre-et-Miquelon pm) queden fora del territori de l’IVA francès i segueixen el camí d’e-Reporting del Flux 10.

B2Brouter agrupa tots els tax reports Flux 10 d’un dia natural en Ledgers enviats al PPF una vegada al dia. Pots identificar-los perquè tenen ledger_id no nul a la resposta del tax report.

Cada ledger s’identifica per dues dimensions internes:

  • Rol DGFiP (SE o BY):
    • SE (Seller / émission) — per a les vendes que emets.
    • BY (Buyer / réception) — per a les compres intracomunitàries que has de declarar com a comprador.
  • Mode (transactions o payments):
    • transactions — ledgers de factures (codis de procés S1 / B1 / M1) — document type xml.ledger.dgfip.transactions.
    • payments — ledgers de pagaments (codis de procés S2 / B2 / M2, TVA sobre serveis es merita al cobrament) — document type xml.ledger.dgfip.payments.

La combinació de rols i modes dóna fins a 3 ledgers diaris per compte:

LedgerRolModeContingut
A — EmissióSEtransactionsFactures emeses (B2C i cross-border B2B)
B — RecepcióBYtransactionsCompres intracomunitàries / extra-UE que has de declarar com a comprador
C — PagamentsSEpaymentsPagaments confirmats de les teves factures emeses (cas Encaissée cross-border / B2C)

El parell (BY, payments) no existeix: la informació de pagament de les teves compres la genera el venedor des de la seva banda; no la declares tu.

Cada tax report es vincula a un únic ledger_id (no pertany a més d’un ledger alhora). L’agrupació es fa per compte + dia + (rol, mode) sota lock per evitar duplicats.


Com a empresa francesa registrada a l’Annuaire amb transport Peppol 0225, rebràs automàticament factures electròniques d’altres plataformes franceses i connectades a Peppol.

Actualitzar l’estat d’una factura rebuda

Section titled “Actualitzar l’estat d’una factura rebuda”

Quan rebis una factura, informa’n l’estat al PPF actualitzant l’estat de la factura:

Finestra del terminal
curl --request POST \
--url https://api-staging.b2brouter.net/invoices/{INVOICE_ID}/mark_as \
--header 'X-B2B-API-Key: {YOUR_API_KEY}' \
--header 'X-B2B-API-Version: {YOUR_API_VERSION}' \
--header 'accept: application/json' \
--header 'content-type: application/json' \
--data '{"state":"accepted"}'

Estats de destí vàlids per a factures rebudes: accepted i refused.

Switch invoice state - API Reference