Litige (dispute)

Un dispute est un dossier de litige commercial persistant. Il décrit ce qui est contesté, qui est concerné et quelle conclusion métier a été prise, tandis qu'un processus Ormuz orchestre les échanges, contrôles, décisions et actions de remédiation.

Rôle

Le dossier n'est pas limité à une facture ni à un chargeback PSP. Il peut couvrir une ou plusieurs factures, des commandes, ou des lignes précisément contextualisées. Il conserve l'état métier stable du litige, indépendamment de la manière dont le processus le traite.

Statut du processus ≠ conclusion commerciale La fin, l'échec ou l'arrêt du processus ne résout pas automatiquement le dossier. La résolution est écrite explicitement par les nodes de cycle de vie du litige.

Structure

HTTP
GET /v1/disputes/dis_4a7b
"dispute":{19 items
"id":"dis_4a7b"
"object":"dispute"
"merchant_id":"mer_1a2b"
"buyer_id":"cmp_9c3d"
"buyer_contact_id":"ctc_5e6f"
"reference":"DSP-2026-0042"
"subjects":[1 item
0:{...}4 items
]
"currency":"eur"
"amount_disputed":12000
"amount_accepted":null
"status":"open"
"resolution_status":"pending"
"related_objects":[]0 items
"process_definition_id":"prd_1b2c"
"process_instance_id":"pci_3d4e"
"process_status":"waiting"
"url":"https://…"
"opened_at":"2026-08-24T14:00:00.000Z"
"closed_at":null
}
{
  "id": "dis_4a7b",
  "object": "dispute",
  "merchant_id": "mer_1a2b",
  "buyer_id": "cmp_9c3d",
  "buyer_contact_id": "ctc_5e6f",
  "reference": "DSP-2026-0042",
  "subjects": [
    {
      "type": "invoice",
      "invoice_id": "inv_7a8b",
      "amount": 12000,
      "reason": "incorrect_amount"
    }
  ],
  "currency": "eur",
  "amount_disputed": 12000,
  "amount_accepted": null,
  "status": "open",
  "resolution_status": "pending",
  "related_objects": [],
  "process_definition_id": "prd_1b2c",
  "process_instance_id": "pci_3d4e",
  "process_status": "waiting",
  "url": "https://…",
  "opened_at": "2026-08-24T14:00:00.000Z",
  "closed_at": null
}
ChampTypeDescription
idstringIdentifiant du dossier (dis_…).
merchant_idstringMarchand propriétaire du dossier.
buyer_idstringCompany acheteur concernée par tous les subjects.
buyer_contact_idstring | nullContact acheteur optionnel associé au dossier.
source_referencestring | nullIdentité et provenance du dossier dans le système source.
referencestring | nullNuméro ou référence métier lisible du litige.
metadataobjectMap plate de scalaires `string | number | boolean`, selon la convention metadata de l’API.
subjectsarrayFactures, commandes ou lignes contextualisées effectivement contestées.
currencystring | nullDevise unique des subjects monétaires.
amount_disputedinteger | nullMontant contesté agrégé optionnel, en plus petite unité de devise.
amount_acceptedinteger | nullMontant retenu par la résolution finale, si applicable.
statusenumCycle de vie du dossier : open, resolved ou cancelled.
resolution_statusenumConclusion commerciale : pending, accepted, partially_accepted, rejected ou withdrawn.
resolution_detailstring | nullDétail optionnel de la conclusion commerciale.
related_objectsarrayObjets métier significatifs liés au traitement ou produits par la résolution.
process_definition_idstring | nullDéfinition de processus choisie pour traiter le dossier.
process_instance_idstring | nullInstance de processus courante propriétaire du dossier.
process_statusstring | nullStatut d’exécution courant du processus associé.
urlurl | nullURL d’expérience utilisateur lorsque le processus en expose une.
return_urlurl | nullURL de retour optionnelle après le parcours utilisateur.
opened_atdatetimeDate d’ouverture du dossier.
closed_atdatetime | nullDate de résolution ou d’annulation.
created_atdatetimeDate de création.
updated_atdatetimeDate de dernière mise à jour.

Subjects

subjects contient uniquement les éléments effectivement contestés. Les types supportés sont invoice, order et line_item. Chaque subject porte son propre reason et peut porter un montant.

JSON
[2 items
0:{4 items
"type":"invoice"
"invoice_id":"inv_7a8b"
"amount":12000
"reason":"incorrect_amount"
}
1:{7 items
"type":"line_item"
"line_item_id":"li_2f3a"
"invoice_id":"inv_7a8b"
"order_id":"ord_6c7d"
"quantity":2
"amount":4000
"reason":"product_unacceptable"
}
]
[
  {
    "type": "invoice",
    "invoice_id": "inv_7a8b",
    "amount": 12000,
    "reason": "incorrect_amount"
  },
  {
    "type": "line_item",
    "line_item_id": "li_2f3a",
    "invoice_id": "inv_7a8b",
    "order_id": "ord_6c7d",
    "quantity": 2,
    "amount": 4000,
    "reason": "product_unacceptable"
  }
]

Un line_item n'est jamais contesté sans contexte : il doit référencer au moins une invoice ou une order, et peut référencer les deux lorsque les relations sont cohérentes. Tous les subjects monétaires d'un même dossier utilisent la même devise.

Cycle de vie

StatusDescription
openLe dossier est en cours de traitement. La résolution commerciale reste pending.
resolvedLe traitement métier est terminé avec une résolution explicite.
cancelledLe dossier a été annulé sans résolution commerciale.

status décrit le cycle de vie du dossier. resolution_statusdécrit séparément la conclusion commerciale.

Resolution statusDescription
pendingAucune conclusion commerciale finale.
acceptedLa contestation est acceptée.
partially_acceptedLa contestation est acceptée partiellement.
rejectedLa contestation est rejetée.
withdrawnLa contestation a été retirée.

Processus associé

La création d'un dispute sélectionne un processus compatible avec un input typé platform.dispute. Vous pouvez fournir explicitement process_definition_id ou utiliser le launcher système disputeconfiguré pour le marchand.

Les retries, replays ou forks correctifs transfèrent la propriété du dossier à la nouvelle instance. Seule l'instance courante peut ensuite modifier ou finaliser le litige avec les nodes dédiés.

Résolution

Le processus décide explicitement des actions à effectuer avant de finaliser le dossier : créer un avoir, initier un remboursement, annuler une commande, créer un retour ou toute autre action métier. Le node Finalize dispute ne crée aucun de ces objets automatiquement.

Les objets importants produits pendant le traitement peuvent être référencés dans related_objects avec un rôle métier, par exemple resolution_credit_note, resolution_refund ou resolution_return.

Impact sur les factures

Lorsqu'un litige open couvre une invoice ou une ligne contextualisée par cette invoice, la facture expose disputed = true. La projection reste vraie tant qu'au moins un dossier ouvert couvre encore la facture.

Le receivable expose séparément les balances contestées et non contestées. Le Payment Commitment ne porte aucune notion de montant contesté ou collectable.

API

HTTP
POST /v1/disputes
{5 items
"merchant_id":"mer_1a2b"
"buyer_id":"cmp_9c3d"
"reference":"DSP-2026-0042"
"subjects":[1 item
0:{...}4 items
]
"amount_disputed":12000
}
{
  "merchant_id": "mer_1a2b",
  "buyer_id": "cmp_9c3d",
  "reference": "DSP-2026-0042",
  "subjects": [
    {
      "type": "invoice",
      "invoice_id": "inv_7a8b",
      "amount": 12000,
      "reason": "incorrect_amount"
    }
  ],
  "amount_disputed": 12000
}
HTTP
GET /v1/disputes
GET /v1/disputes/dis_4a7b
POST /v1/disputes/dis_4a7b
GET /v1/invoices/inv_7a8b/disputes

Tant que le dossier est open, l'endpoint de mise à jour peut modifier son périmètre, ses objets liés et ses références. La conclusion finale appartient au processus via les nodes Finalize dispute et Cancel dispute.

Événements

ÉvénementDéclencheur
dispute.createdLe dossier vient d'être créé.
dispute.resolvedLe dossier vient d'être finalisé avec une résolution commerciale.
dispute.cancelledLe dossier vient d'être annulé.
invoice.disputedUne invoice entre dans le périmètre d'au moins un litige ouvert.
invoice.dispute_clearedLe dernier litige ouvert couvrant une invoice est clôturé ou ne la couvre plus.