Documentation

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.
POST/v1/exports/datevPro

L'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 parameterTypeObligatoireDescription
fromdateOuiDate de début, YYYY-MM-DD
todateOuiDate 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 DATEVSource
Umsatz (ohne Soll/Haben-Kz)invoice.total_amount.amount
Soll/Haben-KennzeichenToujours S
WKZ Umsatzinvoice.total_amount.currency
Konto1600
Gegenkonto (ohne BU-Schlüssel)70000
Belegdatuminvoice.issue_date formaté DDMM
Leistungsdatuminvoice.issue_date formaté DDMMYYYY
Belegfeld 1invoice.invoice_number
Buchungstextinvoice.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.

StatutCodeTraitement
401invalid_api_keyVérifier la clé ou utiliser une clé sk_live_ active
402feature_not_in_planMasquer le bouton d'export ou proposer une mise à niveau
409datev_export_blockedAu moins une facture de la période est un doublon potentiel non tranché
409datev_reference_too_longAu moins une référence de facture dépasse ce que Belegfeld 1 accepte
409datev_reference_collisionPlusieurs factures de la période aboutissent à la même référence DATEV
422validation_errorEnvoyer 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 :

ChampSignification
blocking_invoice_countCombien de factures bloquent l'export
blocking_invoice_idsLes 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 :

ChampSignification
max_lengthLongueur de référence maximale acceptée par l'exporteur (12)
invoice_countNombre de factures qui la dépassent
invoice_idsID 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_ids renvoyés avec GET /v1/invoices/datev-export-reference-remediation, définissez une valeur avec PUT /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 :

ChampSignification
invoice_countNombre de factures distinctes concernées
invoice_idsID de ces factures, aplatis et dédupliqués, uniquement celles de votre workspace
collision_groupsUn 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.

PUT/v1/invoices/{invoice_id}/datev-export-reference-override

Envoyez 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.

DELETE/v1/invoices/{invoice_id}/datev-export-reference-override

Supprime 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"
GET/v1/invoices/datev-export-reference-remediation

Lit le contexte de référence des invoice_ids renvoyés par un export bloqué, pour décider quoi remplacer.

Query parameterTypeObligatoireDescription
idsstringOuiID 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
    }
  ]
}
ChampSignification
invoice_idLa facture décrite par la ligne
invoice_numberLa référence extraite d'origine, inchangée
reference_overrideLa référence d'export DATEV actuellement définie, ou null
normalized_invoice_numberCe que donne la référence d'origine une fois normalisée pour Belegfeld 1
max_lengthLongueur 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

StatutCodeTraitement
404not_foundLa facture n'est pas dans votre workspace
422validation_errorreference est vide ou trop longue une fois normalisée
422invalid_invoice_idsids 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.