Export CSV DATEV
Exportez les factures enregistrées d'une période sous forme de fichier CSV compatible DATEV.
Statut : bêta — validation d'import DATEV externe en attente.
L'export est couvert par des tests automatisés et produit un CSV au format DATEV, mais il n'a pas encore été validé par un import dans un véritable environnement DATEV Rechnungswesen. Ne vous y fiez pas pour la comptabilité de production sans faire vérifier le fichier généré par un comptable qualifié ou votre propre environnement DATEV.
Limitations connues :
- CSV uniquement ; DATEV XML n'est pas pris en charge.
- Les références de facture dépassant la limite de 12 caractères de l'ancien format bloquent l'export au lieu d'être raccourcies, afin qu'une référence ne devienne jamais ambiguë.
- Les factures aboutissant à la même référence DATEV bloquent l'export tant que l'une d'elles ne reçoit pas une référence d'export différente.
- Les factures potentiellement en double doivent être examinées avant l'export.
- Un test d'import DATEV réel reste à effectuer.
/v1/exports/datevProL'export DATEV est disponible sur Pro et Business. Il génère un CSV encodé Windows-1252 à partir des factures enregistrées dans votre workspace et visibles dans la fenêtre de rétention de votre offre.
Requête
Utilisez POST /v1/exports/datev avec les query parameters from et to.
| Query parameter | Type | Obligatoire | Description |
|---|---|---|---|
from | date | Oui | Date de début, YYYY-MM-DD |
to | date | Oui | Date de fin, YYYY-MM-DD |
curl -X POST "https://api.parsurai.com/v1/exports/datev?from=2026-06-01&to=2026-06-30" \
-H "X-API-Key: $PARSURAI_API_KEY" \
-o datev_export.csv
import httpx
response = httpx.post(
"https://api.parsurai.com/v1/exports/datev",
headers={"X-API-Key": api_key},
params={"from": "2026-06-01", "to": "2026-06-30"},
)
with open("datev_export.csv", "wb") as file_obj:
file_obj.write(response.content)
Réponse
En cas de succès, l'endpoint renvoie un flux binaire CSV:
HTTP/1.1 200 OK
Content-Type: application/octet-stream
Content-Disposition: attachment; filename=datev_export.csv
Les octets CSV sont encodés en windows-1252.
Champs exportés
L'exporteur écrit une ligne de métadonnées DATEV, l'en-tête DATEV, puis une ligne par facture. Les champs actuellement mappés incluent:
| Colonne DATEV | Source |
|---|---|
Umsatz (ohne Soll/Haben-Kz) | invoice.total_amount.amount |
Soll/Haben-Kennzeichen | Toujours S |
WKZ Umsatz | invoice.total_amount.currency |
Konto | 1600 |
Gegenkonto (ohne BU-Schlüssel) | 70000 |
Belegdatum | invoice.issue_date formaté DDMM |
Leistungsdatum | invoice.issue_date formaté DDMMYYYY |
Belegfeld 1 | invoice.invoice_number |
Buchungstext | invoice.vendor.name |
Les numéros consultant et client sont configurés côté serveur, pas transmis dans la requête API publique.
Gestion des erreurs
L'export DATEV est disponible uniquement sur Pro et Business. En dessous de Pro, POST /v1/exports/datev renvoie le code feature_not_in_plan.
| Statut | Code | Traitement |
|---|---|---|
401 | invalid_api_key | Vérifier la clé ou utiliser une clé sk_live_ active |
402 | feature_not_in_plan | Masquer le bouton d'export ou proposer une mise à niveau |
409 | datev_export_blocked | Au moins une facture de la période est un doublon potentiel non tranché |
409 | datev_reference_too_long | Au moins une référence de facture dépasse ce que Belegfeld 1 accepte |
409 | datev_reference_collision | Plusieurs factures de la période aboutissent à la même référence DATEV |
422 | validation_error | Envoyer from et to au format YYYY-MM-DD |
Doublons potentiels non tranchés
Une facture notée 0.85 ou plus par la détection de doublons
arrête l'export entier tant qu'une personne n'a pas tranché. Aucun CSV partiel n'est produit —
comptabiliser un doublon dans DATEV le comptabilise deux fois, l'export échoue donc entièrement
plutôt que d'écarter discrètement une ligne.
La réponse nomme les factures qui font obstacle, et rien d'autre :
| Champ | Signification |
|---|---|
blocking_invoice_count | Combien de factures bloquent l'export |
blocking_invoice_ids | Les identifiants de ces factures, issus de votre workspace uniquement |
Les noms de fournisseurs, les montants et les numéros de facture ne sont délibérément jamais renvoyés.
Pour résoudre le problème, enregistrez une décision sur chaque facture listée avec
PATCH /v1/invoices/{invoice_id}/duplicate-review, puis relancez l'export. Les statuts possibles et
leur effet sur le lot exporté sont décrits dans
Révision des doublons. La file de révision côte à côte derrière
ces identifiants se trouve dans le tableau de bord, pas dans l'API publique.
Référence de facture trop longue
Belegfeld 1 contient 12 caractères dans la version de format DATEV que cet exporteur écrit. Si une
référence de facture est plus longue, l'export entier est refusé avec 409 datev_reference_too_long. Les références ne sont jamais raccourcies : deux références partageant
les 12 mêmes premiers caractères se confondraient en une seule valeur exportée, rompant
silencieusement le lien entre une ligne d'écriture et son document. L'export échoue pour que cela
n'arrive jamais.
La longueur est mesurée après suppression des caractères que DATEV refuse dans Belegfeld 1 : une
référence peut donc dépasser 12 caractères dans l'application et s'exporter quand même.
La réponse ne transporte que ce qui est nécessaire pour localiser le problème :
| Champ | Signification |
|---|---|
max_length | Longueur de référence maximale acceptée par l'exporteur (12) |
invoice_count | Nombre de factures qui la dépassent |
invoice_ids | ID de ces factures, uniquement celles de votre workspace |
Les références elles-mêmes ne sont délibérément jamais renvoyées.
{
"error": {
"code": "datev_reference_too_long",
"message": "L'export DATEV est bloqué car une ou plusieurs références de facture dépassent la limite de 12 caractères du format DATEV sélectionné. Corrigez la référence ou exportez avec une version de format DATEV délibérément mise à niveau.",
"max_length": 12,
"invoice_count": 2,
"invoice_ids": [
"6f1c2b8e-0f2a-4a1d-9c47-7b4e1f2a3d55",
"b3d9a1c4-52e7-4f08-8c3b-1a9d6e5f0c22"
]
}
}
Pour résoudre le problème :
- L'application ouvre une boîte de dialogue de correction qui liste chaque facture concernée avec sa référence extraite, la valeur qui serait exportée aujourd'hui et la longueur maximale autorisée. Les listes longues sont paginées, et le pagineur indique combien de factures attendent encore une référence.
- Vous pouvez définir une référence d'export DATEV distincte sans modifier la référence de facture extraite d'origine. La référence extraite reste exactement telle qu'elle a été trouvée sur le document, et n'est toujours jamais raccourcie.
- Lisez le contexte des
invoice_idsrenvoyés avecGET /v1/invoices/datev-export-reference-remediation, définissez une valeur avecPUT /v1/invoices/{invoice_id}/datev-export-reference-override, puis relancez l'export. - Exporter une période qui exclut les factures concernées fonctionne également, et reste l'option la plus rapide lorsque ces factures relèvent de toute façon d'une autre période.
Le message évoque une version de format DATEV plus récente, mais l'exporteur n'écrit aujourd'hui qu'une seule version de format : changer de format n'est donc pas une option actuellement.
Référence DATEV en double
Deux factures d'un même export peuvent aboutir à une seule et même valeur de Belegfeld 1 : soit
parce que leurs références deviennent identiques une fois les caractères refusés par DATEV
supprimés, soit parce qu'une référence d'export DATEV a été définie sur une valeur qu'une autre
facture de la période produit déjà.
L'export entier est alors refusé avec 409 datev_reference_collision. Aucun CSV n'est produit, pas
même un CSV partiel contenant les factures non concernées : deux lignes d'écriture partageant une
référence rompraient le lien entre une ligne et son document exactement comme le ferait un
raccourcissement.
La réponse ne transporte que ce qui est nécessaire pour localiser le problème :
| Champ | Signification |
|---|---|
invoice_count | Nombre de factures distinctes concernées |
invoice_ids | ID de ces factures, aplatis et dédupliqués, uniquement celles de votre workspace |
collision_groups | Un tableau d'ID de factures par groupe partageant une même référence |
La valeur en conflit elle-même n'est délibérément jamais renvoyée.
{
"error": {
"code": "datev_reference_collision",
"message": "L'export DATEV est bloqué car plusieurs factures aboutissent à la même référence DATEV. Définissez une référence d'export DATEV différente sur les factures concernées, puis relancez l'export.",
"invoice_count": 4,
"invoice_ids": [
"6f1c2b8e-0f2a-4a1d-9c47-7b4e1f2a3d55",
"b3d9a1c4-52e7-4f08-8c3b-1a9d6e5f0c22",
"1d7f4a90-8c31-4b6e-a0f5-2c8b9e4d7a10",
"9a5e0c73-4d18-4f2b-b7c6-3e1a8d0f5b44"
],
"collision_groups": [
[
"6f1c2b8e-0f2a-4a1d-9c47-7b4e1f2a3d55",
"b3d9a1c4-52e7-4f08-8c3b-1a9d6e5f0c22"
],
[
"1d7f4a90-8c31-4b6e-a0f5-2c8b9e4d7a10",
"9a5e0c73-4d18-4f2b-b7c6-3e1a8d0f5b44"
]
]
}
}
Pour résoudre le problème, donnez à toutes les factures d'un groupe sauf une une référence d'export
DATEV distincte, puis relancez l'export. collision_groups indique quelles factures sont en conflit
entre elles.
Référence d'export DATEV distincte
Une référence d'export DATEV distincte est une valeur séparée, utilisée uniquement lors de la
production de la sortie DATEV. Elle ne modifie jamais invoice.invoice_number : la référence
extraite est préservée à l'identique, et tous les autres exports et réponses d'API continuent de la
renvoyer inchangée.
Ces endpoints ne sont pas soumis à l'offre. L'export DATEV lui-même est une fonctionnalité Pro et Business, mais tout propriétaire authentifié peut débloquer un export.
Chaque modification est consignée dans une piste d'audit, avec l'utilisateur à l'origine du changement et l'indication qu'il provient d'une clé API ou de l'application hébergée. La piste est inaltérable et totalement ordonnée : la base de données rejette elle-même toute tentative de modifier ou de supprimer un événement enregistré. Les événements ne disparaissent que lorsque la facture correspondante est supprimée.
/v1/invoices/{invoice_id}/datev-export-reference-overrideEnvoyez la référence à exporter. Le serveur la normalise — les caractères refusés par DATEV dans
Belegfeld 1 sont supprimés — et enregistre le résultat, qui doit compter entre 1 et 12 caractères
une fois normalisé.
curl -X PUT "https://api.parsurai.com/v1/invoices/6f1c2b8e-0f2a-4a1d-9c47-7b4e1f2a3d55/datev-export-reference-override" \
-H "X-API-Key: $PARSURAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"reference": "RE 2026/0042"}'
{
"invoice_id": "6f1c2b8e-0f2a-4a1d-9c47-7b4e1f2a3d55",
"reference_override": "RE2026/0042"
}
reference_override est la valeur normalisée qui sera réellement exportée : elle peut donc différer
de ce que vous avez envoyé. Faites foi de la réponse, pas de votre corps de requête.
L'appel est idempotent : une valeur qui se normalise vers celle déjà enregistrée renvoie 200 et
n'enregistre aucun événement d'audit.
Une valeur inutilisable — vide après normalisation, ou plus longue que 12 caractères — renvoie
422 :
{
"error": {
"code": "validation_error",
"field": "reference",
"message": "reference is not a usable DATEV export reference."
}
}
La valeur envoyée n'est délibérément jamais renvoyée en écho.
/v1/invoices/{invoice_id}/datev-export-reference-overrideSupprime la référence distincte, de sorte que la facture revient à sa référence extraite. L'endpoint
renvoie 204, qu'une référence distincte ait existé ou non.
curl -X DELETE "https://api.parsurai.com/v1/invoices/6f1c2b8e-0f2a-4a1d-9c47-7b4e1f2a3d55/datev-export-reference-override" \
-H "X-API-Key: $PARSURAI_API_KEY"
/v1/invoices/datev-export-reference-remediationLit le contexte de référence des invoice_ids renvoyés par un export bloqué, pour décider quoi
remplacer.
| Query parameter | Type | Obligatoire | Description |
|---|---|---|---|
ids | string | Oui | ID de factures séparés par des virgules, dédupliqués, 50 au maximum, ordre préservé |
curl "https://api.parsurai.com/v1/invoices/datev-export-reference-remediation?ids=6f1c2b8e-0f2a-4a1d-9c47-7b4e1f2a3d55,b3d9a1c4-52e7-4f08-8c3b-1a9d6e5f0c22" \
-H "X-API-Key: $PARSURAI_API_KEY"
{
"items": [
{
"invoice_id": "6f1c2b8e-0f2a-4a1d-9c47-7b4e1f2a3d55",
"invoice_number": "RE 2026/ACCOUNTING 0042",
"reference_override": "RE2026/0042",
"normalized_invoice_number": "RE2026/ACCOUNTING0042",
"max_length": 12
},
{
"invoice_id": "b3d9a1c4-52e7-4f08-8c3b-1a9d6e5f0c22",
"invoice_number": "RE 2026/0043",
"reference_override": null,
"normalized_invoice_number": "RE2026/0043",
"max_length": 12
}
]
}
| Champ | Signification |
|---|---|
invoice_id | La facture décrite par la ligne |
invoice_number | La référence extraite d'origine, inchangée |
reference_override | La référence d'export DATEV actuellement définie, ou null |
normalized_invoice_number | Ce que donne la référence d'origine une fois normalisée pour Belegfeld 1 |
max_length | Longueur de référence maximale acceptée par l'exporteur (12) |
Les éléments sont renvoyés dans l'ordre des ID demandés. Les ID qui ne vous appartiennent pas sont
simplement absents de items au lieu d'être rejetés : la réponse ne confirme donc jamais l'existence
de la facture d'un autre workspace.
Gestion des erreurs de la référence distincte
| Statut | Code | Traitement |
|---|---|---|
404 | not_found | La facture n'est pas dans votre workspace |
422 | validation_error | reference est vide ou trop longue une fois normalisée |
422 | invalid_invoice_ids | ids est vide, contient autre chose qu'un UUID, ou dépasse 50 ID |
404 traite de façon identique une facture absente et une facture appartenant à un autre workspace.
Les deux cas ne sont jamais distinguables : l'API ne peut donc pas servir à confirmer l'existence de
l'ID de facture d'un tiers.
Générez les exports DATEV une fois les workflows d'extraction et de révision terminés. L'exporteur lit les factures enregistrées ; les extractions non enregistrées ou échouées ne sont pas incluses.