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:
| Flow | Content | Endpoint |
|---|---|---|
| 10.1 | B2B international invoice data | POST /legal-entities/{legalEntityUuid}/b2b-transactions |
| 10.2 | Payment of a B2B international invoice | POST /legal-entities/{legalEntityUuid}/b2b-payments |
| 10.3 | B2C transaction data | POST /legal-entities/{legalEntityUuid}/b2c-transactions |
| 10.4 | Payment of a B2C transaction | POST /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:
| Operation | Endpoint | Response |
|---|---|---|
| Update | PUT /legal-entities/{legalEntityUuid}/{flow}/{uuid} | 202 Accepted |
| Cancel | DELETE /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
cancelledAtand the status becomesCANCELLED. 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
| Status | Meaning |
|---|---|
WAITING | Submitted, not yet processed by the e-reporting service. |
ACCEPTED | Accepted and assigned to a report (reportUuid). |
REJECTED | Found invalid; the entry is not part of any report. |
CORRECTION_REJECTED | The last update was refused; the previous version still applies. |
CANCELLATION_REJECTED | The last cancellation was refused; the entry is still reported. |
CANCELLED | Cancelled; 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,ACCEPTEDorREJECTED.declarationType:INITIALfor the first declaration of the period,CORRECTIVEfor a declaration that corrects one already sent.rejectionReasonandrejectionMessage: 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:
| Content | Endpoint |
|---|---|
| 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.