Skip to main content

Workflow

This page describes the end-to-end workflow for submitting e-reporting data (flows 10.1 - 10.4) and for tracking the resulting report through to its submission to the Portail Public de Facturation (PPF).

Prerequisite: VAT regime configuration​

Before any transaction can be reported, the VAT regime of the legal entity (SIREN) must be configured. The reporting frequency (monthly, bimonthly, etc.) and the submission deadlines to the PPF are derived from this setting.

The VAT regime can be set in either of two ways:

  • through the guided KYC/KYB onboarding procedure on the web dashboard;
  • through the API:

PUT /legal-entities/{legalEntityUuid}/vat-regime

{
"vatRegime": "MONTHLY"
}

1. Submit a transaction​

Each transaction (or transaction payment) is submitted individually through the endpoint matching its flow:

FlowContentEndpoint
10.1B2B international invoice dataPOST /legal-entities/{legalEntityUuid}/b2b-transactions
10.2Payment of a B2B international invoicePOST /legal-entities/{legalEntityUuid}/b2b-payments
10.3B2C transaction dataPOST /legal-entities/{legalEntityUuid}/b2c-transactions
10.4Payment of a B2C transactionPOST /legal-entities/{legalEntityUuid}/b2c-payments

Example - submit a B2C transaction​

POST /legal-entities/{legalEntityUuid}/b2c-transactions

{
"transactionDate": "2023-01-01",
"transactions": [
{
"categoryCode": "TPS1",
"taxableTotalAmount": "100.00",
"taxTotalAmount": "20.00",
"taxDetails": [
{
"taxableAmount": "string",
"taxAmount": "string",
"percent": "20.0",
"taxCategoryCode": "S"
}
],
"currency": "EUR",
"taxPaymentOption": "invoice"
}
],
"registerId": "REG123",
"storeId": "STORE456",
"closureId": "CLOSURE789"
}

The call returns 202 Accepted with the identifier of the submitted transaction and its initial status:

{
"uuid": "019e7384-4322-7359-83ef-8e14833a7142",
"status": "WAITING",
"siren": "123456789",
"transactionDate": "2026-07-21",
"transactionCount": 5,
"registerId": "REG01",
"storeId": "STORE01",
"closureId": "CLO01",
"cancelledAt": null,
"reportUuid": null,
"rejectionReason": null,
"rejectionMessage": null
}

From this point, the transaction status evolves asynchronously.

2. Update or cancel a transaction​

A submitted transaction or payment can be corrected or cancelled through the same resource:

OperationEndpointResponse
UpdatePUT /legal-entities/{legalEntityUuid}/{flow}/{uuid}202 Accepted
CancelDELETE /legal-entities/{legalEntityUuid}/{flow}/{uuid}204 No Content

{flow} is one of b2b-transactions, b2b-payments, b2c-transactions, b2c-payments. The update payload has the same shape as the creation payload and replaces the entry as a whole. When a cancelation happens, the entry is not removed and stays readable with cancelledAt set.

Both operations are applied only once the e-reporting service accepts them:

  • until then, the entry keeps its previous values and status, and any further update or cancellation is refused with 409 Conflict;
  • an accepted update replaces the entry's values and its status becomes ACCEPTED;
  • an accepted cancellation sets cancelledAt and the status becomes CANCELLED. A cancelled entry can no longer be updated or cancelled (409);
  • a refused update leaves the previous values in place and the status becomes CORRECTION_REJECTED;
  • a refused cancellation leaves the entry reported and the status becomes CANCELLATION_REJECTED.

After a refusal the entry is unlocked, so the update or cancellation can be sent again. rejectionReason and rejectionMessage on the entry explain the refusal:

{
"uuid": "019e7384-4322-7359-83ef-8e14833a7142",
"status": "CORRECTION_REJECTED",
"reportUuid": "019e7384-2243-7359-83ef-8e14833a7142",
"rejectionReason": "CORRECTION_REJECTED",
"rejectionMessage": "The correction was rejected, the previous version still applies."
}

409 is also returned while the report containing the entry is being transmitted to the PPF. A 503 means the e-reporting service is temporarily unavailable: nothing is changed and the request can be retried.

Entry statuses​

StatusMeaning
WAITINGSubmitted, not yet processed by the e-reporting service.
ACCEPTEDAccepted and assigned to a report (reportUuid).
REJECTEDFound invalid; the entry is not part of any report.
CORRECTION_REJECTEDThe last update was refused; the previous version still applies.
CANCELLATION_REJECTEDThe last cancellation was refused; the entry is still reported.
CANCELLEDCancelled; cancelledAt holds the cancellation date.

3. Webhook events​

Two webhook event types are available to track e-reporting activity end to end. Both are configured as usual through the event-destinations resource:

POST /event-destinations

{
"event": "ereporting.report.status",
"target": "https://example.com/webhooks/e-reporting",
"delivery": "webhook",
"status": "active",
"authType": "header",
"authKey": "X-Auth",
"authToken": "mysecret"
}

ereporting.entry.status​

Tracks the status of each submitted transaction or payment (an "entry") and its association with a report. It fires both when an entry is accepted and assigned to a report, and when an entry is found invalid.

{
"eventId": "019e91c2-1a3f-7ab0-9c21-5824b2656b1a",
"eventType": "ereporting.entry.status",
"legalEntityUuid": "01990000-0000-7000-8000-000000000001",
"type": "b2b-transaction",
"entryUuid": "019e7384-03ca-75fe-a830-bbea235853b1",
"reportUuid": "019e7384-2243-7359-83ef-8e14833a7142",
"status": "ACCEPTED"
}

The type field identifies the kind of entry (b2b-transaction, b2b-payment, b2c-transaction, b2c-payment). When an entry is rejected as invalid, reportUuid is omitted and status reflects the rejection (REJECTED).

The event also fires when an update or cancellation is accepted or refused, with status set to ACCEPTED, CANCELLED, CORRECTION_REJECTED or CANCELLATION_REJECTED (see Entry statuses).

ereporting.report.status​

Tracks the lifecycle of a report as a whole, from its creation up to its outcome at the PPF: CREATED, SUBMITTED, ACCEPTED, REJECTED. The event also carries the report's data when it is first created.

{
"eventId": "019e91b7-f799-7df7-a469-4824b2656b0e",
"eventType": "ereporting.report.status",
"legalEntityUuid": "01990000-0000-7000-8000-000000000001",
"reportUuid": "019e7384-2243-7359-83ef-8e14833a7142",
"status": "CREATED"
}

4. Read endpoints​

Independently of the webhooks above, the reports and their content can be retrieved on demand at any time.

List reports​

GET /legal-entities/{legalEntityUuid}/reports returns the reports of a legal entity, most recent period first:

[
{
"uuid": "019e7384-2243-7359-83ef-8e14833a7142",
"periodStart": "2026-01-01",
"periodEnd": "2026-01-31",
"status": "CREATED",
"submissionDeadline": "2026-02-10T08:00:00Z",
"declarationType": "INITIAL",
"rejectionReason": null,
"rejectionMessage": null
},
{
"uuid": "019c33ac-98a0-7239-985a-96e6c33ac8fa",
"periodStart": "2025-12-01",
"periodEnd": "2025-12-31",
"status": "REJECTED",
"submissionDeadline": "2026-01-10T08:00:00Z",
"declarationType": "INITIAL",
"rejectionReason": "VALIDATION_FAILURE",
"rejectionMessage": "rejected by the PPF"
}
]
  • status: CREATED, SUBMITTED, ACCEPTED or REJECTED.
  • declarationType: INITIAL for the first declaration of the period, CORRECTIVE for a declaration that corrects one already sent.
  • rejectionReason and rejectionMessage: filled in when the PPF rejects the report.

The list can be filtered by status and declarationType.

GET /reports returns the reports of all your legal entities in the same format, with the legalEntityUuid of each report.

API reference: list for a legal entity · get one · list all

Download the transmitted XML​

The XML files transmitted to the PPF for a report can be downloaded byte for byte, with Accept: application/xml:

ContentEndpoint
Transactions (flows 10.1 and 10.3)GET /legal-entities/{legalEntityUuid}/reports/{uuid}/transactions
Payments (flows 10.2 and 10.4)GET /legal-entities/{legalEntityUuid}/reports/{uuid}/payments

Both answer 404 while the report has no transmission of that kind.

API reference: transactions · payments

Filter the entries of a report​

It's possible to retrieve the content of a report by filtering the collection endpoints by reportUuid, the identifier returned in the ereporting.entry.status webhook or in the entries themselves.

To reconstruct the full content of a report, the four endpoints must be queried separately (one per entry type) with the same reportUuid.