Référence de l’API

Factures

Les factures des fournisseurs aux acheteurs, de leur arrivée au rapprochement, à la validation et au paiement.

En savoir plus sur cette ressource

La facture d’un fournisseur est créée en convertissant un bon de commande (source: "po-flip") ou en la saisissant pour un acheteur connecté (source: "manual", voir CreateInvoice), ou bien le fournisseur l’envoie depuis son système de facturation avec une clé API (source: "feed", voir SubmitFeedInvoice) une fois que cet acheteur a activé les factures automatisées. Un acheteur peut aussi en enregistrer une directement (source: "direct", voir SubmitInvoice), en JSON, cXML (InvoiceDetailRequest) ou UBL 2.1 (<Invoice>). Chaque facture réside dans l’espace de travail de l’acheteur et passe par le rapprochement, la validation et le règlement. Une facture est "pending" lorsqu’il existe un chiffre de consommation réel auquel la rapprocher : un bon de commande, et une connexion de facturation active pour le fournisseur cloud du bon de commande avec une facture synchronisée. usageAmount, usageCurrency et tolerancePct ne sont présents que dans ce cas, et sur le résultat "matched" ou "discrepancy". Sinon, elle est "unverified", avec unverifiedReason "no_purchase_order" ou "no_billing_connection" (vue acheteur uniquement ; absent sur les anciennes factures, qui se lisent comme "no_purchase_order"), ou "debit_note" pour une note de débit sur le bon de commande d’un fournisseur cloud, qui s’ajoute à une facture déjà émise et ne peut donc pas être comparée à la facture du mois. Un appelant fournisseur voit matchStatus tel quel, mais jamais unverifiedReason ni les champs de consommation. Une facture unverified n’est jamais rapprochée ni validée automatiquement : une personne l’examine avec ResolveInvoiceDiscrepancy.

Lister les factures

Liste les factures, et éventuellement les avoirs et notes de débit.

GET/v1/workspaces/{regionId}/invoices

Paramètres

  • fromstring

    Date/horodatage ISO 8601 : seuls les éléments créés à cette date ou après sont renvoyés.

  • tostring

    Date/horodatage ISO 8601 : seuls les éléments créés à cette date ou avant sont renvoyés.

  • documentTypestring

    Par défaut, ce qui se paie : les factures et les notes de débit qui les modifient. invoice (factures seules), debit_note, credit_note (les mêmes éléments que ListCreditNotes), ou all (tous types, du plus récent au plus ancien). Chaque élément porte documentType. Toute autre valeur donne 400 DOCUMENT_TYPE_INVALID.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Liste les factures, sans ordre particulier, ou, avec documentType, les avoirs ou les deux : factures et avoirs forment une seule ressource de relevés, chaque élément indiquant sa nature dans documentType. Un appelant acheteur obtient les factures reçues par son espace de travail ; un appelant fournisseur obtient les factures qu’il a émises à des acheteurs connectés, quel que soit l’espace de travail acheteur où chacune réside. Peut être limité à une plage de createdAt via from/to : passez les bornes d’un mois civil pour obtenir une vue mensuelle. Un appelant fournisseur reçoit une vue réduite de chaque facture (voir GetInvoice) : les données internes de rapprochement de l’acheteur et le circuit de validation complet ne sont pas communiqués.

Erreurs

  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
GET /v1/workspaces/{regionId}/invoices
Requête
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 200 OK
[
   {
      "documentType": "invoice" | "debit_note",
      "amendsInvoiceId": "string",
      "amendsExternalInvoiceNumber": "string",
      "debitNoteIds": [ "string" ],
      "replacesInvoiceIds": [ "string" ],
      "replacedByInvoiceIds": [ "string" ],
      "replacement": { "creditedInFull": boolean, "uncredited": number },
      "uncreditedOriginals": [ { "invoiceId": "string", "externalInvoiceNumber": "string", "uncredited": number, "currency": "string" } ],
      "id": "string",
      "po": "string",
      "poLineNo": number,
      "billsNoPoLine": true,
      "buyerOrgId": "string",
      "supplierOrgId": "string",
      "supplier": "string",
      "amount": number,
      "currency": "string",
      "usageAmount": number,
      "usageCurrency": "string",
      "tolerancePct": number,
      "matchStatus": "pending" | "matched" | "discrepancy" | "unverified",
      "unverifiedReason": "no_purchase_order" | "no_billing_connection" | "debit_note",
      "discrepancyReason": "amount" | "currency",
      "paid": boolean,
      "dueInDays": number,
      "approval": {
         "requester": "string",
         "requesterEmployeeKey": "string",
         "groups": [
           {
             "id": "string",
             "mode": "sequential" | "parallel",
             "label": "string",
             "status": "pending" | "approved" | "rejected",
             "stages": [
               { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
             ]
           }
         ],
         "groupIndex": number,
         "status": "pending" | "approved" | "rejected",
         "history": [
           { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
         ],
         "autonomy": boolean,
         "selfApproved": boolean
       },
      "createdAt": "string",
      "lastRemindedAt": "string",
      "rejection": { "reasonCode": "amount_incorrect" | "not_ordered_or_not_received" | "duplicate" | "missing_or_wrong_po" | "wrong_billing_entity" | "other", "reason": "string", "at": "string" },
      "replacesInvoiceId": "string",
      "source": "po-flip" | "direct" | "manual" | "feed",
      "submittedFormat": "json" | "cxml" | "ubl",
      "submittedBy": "string",
      "externalInvoiceNumber": "string",
      "lineItems": [
         { "description": "string", "qty": number, "unitPrice": number, "discount": number, "charge": number, "amount": number }
      ],
      "adjustments": [
         { "type": "discount" | "charge", "description": "string", "amount": number }
      ],
      "taxAmount": number,
      "taxBreakdown": [ { "description": "string", "rate": number, "amount": number } ],
      "paymentCurrencyAmount": { "currencyCode": "string", "totalAmount": number, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
      "taxCurrencyAmount": { "currencyCode": "string", "amountBreakdown": { "taxes": { "totalAmount": number } }, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
      "baseCurrencyAmount": { "currencyCode": "string", "totalAmount": number },
      "rateWarnings": [
         { "object": "payment" | "tax", "currency": "string", "statedRate": number, "referenceRate": number, "source": "provider" | "override", "asOf": "string", "deviationPct": number }
      ],
      "withholdings": [ { "description": "string", "rate": number, "amount": number } ],
      "deductions": [ { "kind": "prepayment" | "credit", "description": "string", "amount": number, "reference": "string", "paidOn": "string", "sourceInvoiceId": "string", "stated": true } ],
      "invoiceKind": "prepayment",
      "creditNoteIds": [ "string" ],
      "creditApplications": [ { "id": "string", "creditNoteId": "string", "externalCreditNoteNumber": "string", "amount": number, "appliedAt": "string", "appliedByName": "string", "auto": true } ],
      "payment": { "status": "recorded", "method": "ach" | "wire" | "check" | "card" | "other" | "credit", "paymentDate": "string", "reference": "string", "paidAmount": { "amount": number, "currency": "string", "rate": number, "rateDate": "string" } },
      "remittances": [ { "id": "string", "sentAt": "string", "sentByName": "string", "note": "string", "file": { "fileName": "string", "contentType": "application/pdf" | "image/png" | "image/jpeg", "sizeBytes": number } } ]
   }
]

Obtenir une facture

Récupère une facture.

GET/v1/workspaces/{regionId}/invoices/{invoiceId}

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture, ou celui d’un avoir (CN-…).

  • buyerstring

    Appelants fournisseurs uniquement, et seulement après un 409 *_ID_AMBIGUOUS : l’ID de l’espace de travail de l’acheteur (se terminant par .buyer) ou son id de région, tiré de la liste buyers du 409. Seul le document de cet acheteur est pris en compte ; s’il n’y en a pas, c’est un 404. Un ID d’espace de travail .supplier donne 400 BUYER_QUALIFIER_INVALID (« The buyer parameter must be one buyer's Workspace ID (ending in .buyer), from the buyers list in the 409 response. »). Ignoré pour un appelant acheteur.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Récupère une facture par son id ou, à partir de l’id d’un avoir (CN-…), cet avoir, au format de GetCreditNote ; documentType indique lequel des deux. Pour un appelant acheteur, regionId est l’espace de travail de la facture elle-même. Pour un appelant fournisseur, regionId est l’espace de travail du fournisseur, et la facture est recherchée parmi les factures entrantes de l’organisation, quel que soit l’espace de travail acheteur qui l’a émise : la même recherche que celle utilisée par ListSupplierWorkspace. GET …/invoices/{invoiceId}/pdf accepte le même paramètre de requête buyer.

Champs de la réponse

  • replacesInvoiceIdsArray<string>

    Avoir et refacturation : les factures et notes de débit que cette facture remplace. Absent s’il n’y en a pas.

  • replacedByInvoiceIdsArray<string>

    Les factures qui remplacent celle-ci. Absent s’il n’y en a pas.

  • replacementobject

    Acheteur, lecture d’une seule facture uniquement, sur une facture remplacée qui n’a pas été refusée : creditedInFull, et uncredited, son montant diminué de ses avoirs acceptés et en attente, dans sa devise. Tant que uncredited est supérieur à 0, la payer en plus de sa facture de remplacement revient à payer deux fois, et RecordPayment, StartStripePayment et ExportInvoicesForPayment demandent confirmReplaced.

  • uncreditedOriginalsArray

    Acheteur, lecture d’une seule facture uniquement, sur une facture de remplacement : les factures qu’elle remplace et que leurs avoirs ne couvrent pas entièrement. Absent s’il n’y en a pas.

Erreurs

  • 404 Not Found - Aucune facture avec cet id n’existe dans l’espace de travail de l’appelant.
  • 409 Conflict - Appelants fournisseurs uniquement. Code INVOICE_ID_AMBIGUOUS : plusieurs de vos acheteurs détiennent une facture de votre part avec cet id (les id ne sont uniques qu’au sein d’un même acheteur), donc Pleaxy ne devine pas laquelle vous visez. Rien n’est lu ni modifié. Le champ buyers du corps liste l’ID de l’espace de travail et le nom de chaque acheteur : relancez l’appel avec ?buyer=<that Workspace ID>.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
GET /v1/workspaces/{regionId}/invoices/{invoiceId}
Requête
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 200 OK
{
   "documentType": "invoice" | "debit_note",
   "amendsInvoiceId": "string",
   "amendsExternalInvoiceNumber": "string",
   "debitNoteIds": [ "string" ],
   "replacesInvoiceIds": [ "string" ],
   "replacedByInvoiceIds": [ "string" ],
   "replacement": { "creditedInFull": boolean, "uncredited": number },
   "uncreditedOriginals": [ { "invoiceId": "string", "externalInvoiceNumber": "string", "uncredited": number, "currency": "string" } ],
   "id": "string",
   "po": "string",
   "poLineNo": number,
   "billsNoPoLine": true,
   "buyerOrgId": "string",
   "supplierOrgId": "string",
   "supplier": "string",
   "amount": number,
   "currency": "string",
   "usageAmount": number,
   "usageCurrency": "string",
   "tolerancePct": number,
   "matchStatus": "pending" | "matched" | "discrepancy" | "unverified",
   "unverifiedReason": "no_purchase_order" | "no_billing_connection" | "debit_note",
   "discrepancyReason": "amount" | "currency",
   "paid": boolean,
   "dueInDays": number,
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "createdAt": "string",
   "lastRemindedAt": "string",
   "rejection": { "reasonCode": "amount_incorrect" | "not_ordered_or_not_received" | "duplicate" | "missing_or_wrong_po" | "wrong_billing_entity" | "other", "reason": "string", "at": "string" },
   "replacesInvoiceId": "string",
   "source": "po-flip" | "direct" | "manual" | "feed",
   "submittedFormat": "json" | "cxml" | "ubl",
   "submittedBy": "string",
   "externalInvoiceNumber": "string",
   "lineItems": [
      { "description": "string", "qty": number, "unitPrice": number, "discount": number, "charge": number, "amount": number }
   ],
   "adjustments": [
      { "type": "discount" | "charge", "description": "string", "amount": number }
   ],
   "taxAmount": number,
   "taxBreakdown": [ { "description": "string", "rate": number, "amount": number } ],
   "paymentCurrencyAmount": { "currencyCode": "string", "totalAmount": number, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "taxCurrencyAmount": { "currencyCode": "string", "amountBreakdown": { "taxes": { "totalAmount": number } }, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "baseCurrencyAmount": { "currencyCode": "string", "totalAmount": number },
   "rateWarnings": [
      { "object": "payment" | "tax", "currency": "string", "statedRate": number, "referenceRate": number, "source": "provider" | "override", "asOf": "string", "deviationPct": number }
   ],
   "withholdings": [ { "description": "string", "rate": number, "amount": number } ],
   "deductions": [ { "kind": "prepayment" | "credit", "description": "string", "amount": number, "reference": "string", "paidOn": "string", "sourceInvoiceId": "string", "stated": true } ],
   "invoiceKind": "prepayment",
   "creditNoteIds": [ "string" ],
   "creditApplications": [ { "id": "string", "creditNoteId": "string", "externalCreditNoteNumber": "string", "amount": number, "appliedAt": "string", "appliedByName": "string", "auto": true } ],
   "payment": { "status": "recorded", "method": "ach" | "wire" | "check" | "card" | "other" | "credit", "paymentDate": "string", "reference": "string", "paidAmount": { "amount": number, "currency": "string", "rate": number, "rateDate": "string" } },
   "remittances": [ { "id": "string", "sentAt": "string", "sentByName": "string", "note": "string", "file": { "fileName": "string", "contentType": "application/pdf" | "image/png" | "image/jpeg", "sizeBytes": number } } ]
}

Obtenir l’activité d’une facture

Renvoie l’historique d’une facture, du plus ancien au plus récent.

GET/v1/workspaces/{regionId}/invoices/{invoiceId}/activity

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

  • buyerstring

    Appelants fournisseurs uniquement, et seulement après un 409 *_ID_AMBIGUOUS : l’ID de l’espace de travail de l’acheteur (se terminant par .buyer) ou son id de région, tiré de la liste buyers du 409. Seul le document de cet acheteur est pris en compte ; s’il n’y en a pas, c’est un 404. Un ID d’espace de travail .supplier donne 400 BUYER_QUALIFIER_INVALID (« The buyer parameter must be one buyer's Workspace ID (ending in .buyer), from the buyers list in the 409 response. »). Ignoré pour un appelant acheteur.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

L’historique d’une facture, du plus ancien au plus récent : son arrivée, les contrôles et rapprochements effectués, les étapes de validation, le refus, les paiements, les relances et les commentaires. Chaque entrée a un kind et des données structurées, jamais une phrase, pour que vous puissiez la formuler vous-même. La plupart des entrées sont déduites de la facture elle-même, donc une facture plus ancienne a aussi un historique. Un appelant fournisseur n’obtient que l’arrivée de la facture, son issue, les paiements enregistrés, les relances et les commentaires partagés.

Champs de la réponse

  • idstring

    Stable pour un même historique, pour que vous sachiez quelles entrées vous avez déjà vues.

  • kind, datastring, object

    received : data.source, enteredBy, submittedFormat, fileName. corrects : data.invoiceId, la facture refusée qu’elle remplace. control_findings (acheteur uniquement) : data.codes. match (acheteur uniquement) : data.result (matched, discrepancy ou unverified) et data.reason. sent_for_approval (acheteur uniquement) : data.from (discrepancy ou unverified). approval (acheteur uniquement) : data.action, data.stage, et data.to pour une réaffectation. approved. rejected : data.reasonCode et data.reason. payment : data.action, method, paymentDate, reference. reminder : data.autonomy lorsque l’espace de travail l’a envoyée de lui-même. comment : le commentaire lui-même, dans comment.

Erreurs

  • 404 Not Found - Aucune facture avec cet id n’existe dans l’espace de travail de l’appelant.
  • 409 Conflict - Appelants fournisseurs uniquement. Code INVOICE_ID_AMBIGUOUS : plusieurs de vos acheteurs détiennent une facture de votre part avec cet id (les id ne sont uniques qu’au sein d’un même acheteur), donc Pleaxy ne devine pas laquelle vous visez. Rien n’est lu ni modifié. Le champ buyers du corps liste l’ID de l’espace de travail et le nom de chaque acheteur : relancez l’appel avec ?buyer=<that Workspace ID>.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
GET /v1/workspaces/{regionId}/invoices/{invoiceId}/activity
Requête
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/activity" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 200 OK
{
   "entries": [
      {
         "id": "string",
         "at": "string",
         "kind": "received" | "corrects" | "control_findings" | "match" | "sent_for_approval" | "approval" | "approved" | "rejected" | "payment" | "reminder" | "comment",
         "actorName": "string",
         "actorSide": "buyer" | "supplier" | "system",
         "data": { },
         "comment": {
            "id": "string",
            "documentKind": "invoice" | "purchase_order",
            "documentId": "string",
            "body": "string",
            "visibility": "internal" | "shared",
            "authorSide": "buyer" | "supplier",
            "authorKey": "string",
            "authorName": "string",
            "authorOrgName": "string",
            "mentions": [ { "employeeKey": "string", "name": "string" } ],
            "createdAt": "string",
            "deletedAt": "string",
            "viewerIsAuthor": boolean
         }
      }
   ]
}

Lister les commentaires d’une facture

Liste les commentaires d’une facture.

GET/v1/workspaces/{regionId}/invoices/{invoiceId}/comments

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

  • buyerstring

    Appelants fournisseurs uniquement, et seulement après un 409 *_ID_AMBIGUOUS : l’ID de l’espace de travail de l’acheteur (se terminant par .buyer) ou son id de région, tiré de la liste buyers du 409. Seul le document de cet acheteur est pris en compte ; s’il n’y en a pas, c’est un 404. Un ID d’espace de travail .supplier donne 400 BUYER_QUALIFIER_INVALID (« The buyer parameter must be one buyer's Workspace ID (ending in .buyer), from the buyers list in the 409 response. »). Ignoré pour un appelant acheteur.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Les commentaires d’une facture, du plus ancien au plus récent : les commentaires internes de votre côté et tous les commentaires partagés. Un commentaire supprimé par son auteur reste dans le fil avec un corps vide, de sorte qu’il montre toujours que quelque chose a été dit, et quand. Même recherche que GetInvoice, donc un fournisseur accède aux factures qu’il a émises.

Champs de la réponse

  • visibilitystring

    internal : uniquement le côté de l’auteur. shared : l’acheteur et le fournisseur le lisent tous les deux.

  • authorKey, mentionsstring, Array

    Uniquement sur les commentaires de votre côté : qui l’a écrit, par clé d’employé, et qui il mentionnait. L’autre partie voit authorName et authorOrgName.

  • bodystring

    Texte brut avec ses sauts de ligne. Vide une fois supprimé par l’auteur ; deletedAt indique alors quand.

  • viewerIsAuthorboolean

    Indique si l’appelant l’a écrit, et peut donc le supprimer. Toujours false pour une clé API.

Erreurs

  • 404 Not Found - Aucune facture avec cet id n’existe dans l’espace de travail de l’appelant.
  • 409 Conflict - Appelants fournisseurs uniquement. Code INVOICE_ID_AMBIGUOUS : plusieurs de vos acheteurs détiennent une facture de votre part avec cet id (les id ne sont uniques qu’au sein d’un même acheteur), donc Pleaxy ne devine pas laquelle vous visez. Rien n’est lu ni modifié. Le champ buyers du corps liste l’ID de l’espace de travail et le nom de chaque acheteur : relancez l’appel avec ?buyer=<that Workspace ID>.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
GET /v1/workspaces/{regionId}/invoices/{invoiceId}/comments
Requête
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/comments" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 200 OK
{
   "comments": [
      {
         "id": "string",
         "documentKind": "invoice" | "purchase_order",
         "documentId": "string",
         "body": "string",
         "visibility": "internal" | "shared",
         "authorSide": "buyer" | "supplier",
         "authorKey": "string",
         "authorName": "string",
         "authorOrgName": "string",
         "mentions": [ { "employeeKey": "string", "name": "string" } ],
         "createdAt": "string",
         "deletedAt": "string",
         "viewerIsAuthor": boolean
      }
   ]
}

Ajouter un commentaire à une facture

Ajoute un commentaire à une facture.

POST/v1/workspaces/{regionId}/invoices/{invoiceId}/comments

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

  • buyerstring

    Appelants fournisseurs uniquement, et seulement après un 409 *_ID_AMBIGUOUS : l’ID de l’espace de travail de l’acheteur (se terminant par .buyer) ou son id de région, tiré de la liste buyers du 409. Seul le document de cet acheteur est pris en compte ; s’il n’y en a pas, c’est un 404. Un ID d’espace de travail .supplier donne 400 BUYER_QUALIFIER_INVALID (« The buyer parameter must be one buyer's Workspace ID (ending in .buyer), from the buyers list in the 409 response. »). Ignoré pour un appelant acheteur.

Corps

  • bodystringObligatoire

    Texte brut, jusqu’à 2 000 caractères. Les sauts de ligne sont conservés ; les caractères de contrôle, de texte bidirectionnel et invisibles sont supprimés.

  • visibility"internal" | "shared"Obligatoire

    internal : votre propre équipe uniquement. shared : l’autre partie le lit et y répond aussi. Les commentaires d’un fournisseur sont toujours partagés.

  • mentionsstring[]

    Jusqu’à 10 clés d’employé de personnes de votre propre espace de travail à notifier (voir ListEmployees). La notification ne contient jamais le texte du commentaire.

Retour

201 Created avec l’objet présenté dans la réponse.

Plus de détails

Commente une facture : en interne pour votre équipe, ou en partage avec l’autre partie, par exemple un acheteur qui interroge le fournisseur sur une ligne. Les commentaires ne sont jamais modifiés. Les personnes que vous mentionnez, les auteurs des commentaires précédents de votre côté et, pour un commentaire partagé, l’autre partie sont notifiés (invoice_comment) ; la notification ne contient jamais le texte.

Session connectée uniquement. Une clé API reçoit 403 HUMAN_SESSION_REQUIRED.

Erreurs

  • 400 Bad Request - Un corps vide (« Write something before you post the comment. »), plus de 2 000 caractères, plus de 10 mentions, la mention d’une personne extérieure à votre espace de travail, une visibilité autre que internal ou shared, un commentaire internal d’un fournisseur (« A supplier's comments are always shared with the buyer. »), ou un commentaire shared sur un document dont le fournisseur est absent de Pleaxy (publiez-le plutôt en internal).
  • 403 Forbidden - Code HUMAN_SESSION_REQUIRED : l’appelant est une clé API (« Comments are written by people. Sign in to Pleaxy to post one. »).
  • 404 Not Found - Aucune facture avec cet id n’existe dans l’espace de travail de l’appelant.
  • 409 Conflict - Appelants fournisseurs uniquement. Code INVOICE_ID_AMBIGUOUS : plusieurs de vos acheteurs détiennent une facture de votre part avec cet id (les id ne sont uniques qu’au sein d’un même acheteur), donc Pleaxy ne devine pas laquelle vous visez. Rien n’est lu ni modifié. Le champ buyers du corps liste l’ID de l’espace de travail et le nom de chaque acheteur : relancez l’appel avec ?buyer=<that Workspace ID>.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/comments
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/comments" \
  -H "X-Api-Key: $PLEAXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d @body.json
body.json
{
   "body": "string",
   "visibility": "internal" | "shared",
   "mentions": [ "string" ]
}
Réponse · 201 Created
{
   "id": "string",
   "documentKind": "invoice" | "purchase_order",
   "documentId": "string",
   "body": "string",
   "visibility": "internal" | "shared",
   "authorSide": "buyer" | "supplier",
   "authorKey": "string",
   "authorName": "string",
   "authorOrgName": "string",
   "mentions": [ { "employeeKey": "string", "name": "string" } ],
   "createdAt": "string",
   "deletedAt": "string",
   "viewerIsAuthor": boolean
}

Supprimer un commentaire d’une facture

Supprime l’un de vos commentaires sur une facture.

DELETE/v1/workspaces/{regionId}/invoices/{invoiceId}/comments/{commentId}

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

  • commentIdstringObligatoire

    Le commentaire, par exemple "CMT-1760313600000-3f9a1c2e".

  • buyerstring

    Appelants fournisseurs uniquement, et seulement après un 409 *_ID_AMBIGUOUS : l’ID de l’espace de travail de l’acheteur (se terminant par .buyer) ou son id de région, tiré de la liste buyers du 409. Seul le document de cet acheteur est pris en compte ; s’il n’y en a pas, c’est un 404. Un ID d’espace de travail .supplier donne 400 BUYER_QUALIFIER_INVALID (« The buyer parameter must be one buyer's Workspace ID (ending in .buyer), from the buyers list in the 409 response. »). Ignoré pour un appelant acheteur.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Retire votre propre commentaire : son texte est supprimé et le fil garde la trace qu’un commentaire a été publié. Le supprimer à nouveau ne change rien.

Session connectée uniquement. Une clé API reçoit 403 HUMAN_SESSION_REQUIRED.

Erreurs

  • 403 Forbidden - Code HUMAN_SESSION_REQUIRED : l’appelant est une clé API (« Comments are written by people. Sign in to Pleaxy to post one. »).
  • 403 Forbidden - Le commentaire n’est pas le vôtre (« Only the person who wrote a comment can delete it. »).
  • 404 Not Found - Aucun commentaire avec cet id visible pour vous sur ce document (« Comment {commentId} not found. »), ou document inexistant.
  • 409 Conflict - Appelants fournisseurs uniquement. Code INVOICE_ID_AMBIGUOUS : plusieurs de vos acheteurs détiennent une facture de votre part avec cet id (les id ne sont uniques qu’au sein d’un même acheteur), donc Pleaxy ne devine pas laquelle vous visez. Rien n’est lu ni modifié. Le champ buyers du corps liste l’ID de l’espace de travail et le nom de chaque acheteur : relancez l’appel avec ?buyer=<that Workspace ID>.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
DELETE /v1/workspaces/{regionId}/invoices/{invoiceId}/comments/{commentId}
Requête
curl -X DELETE "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/comments/{commentId}" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 200 OK
{
   "id": "string",
   "documentKind": "invoice" | "purchase_order",
   "documentId": "string",
   "body": "string",
   "visibility": "internal" | "shared",
   "authorSide": "buyer" | "supplier",
   "authorKey": "string",
   "authorName": "string",
   "authorOrgName": "string",
   "mentions": [ { "employeeKey": "string", "name": "string" } ],
   "createdAt": "string",
   "deletedAt": "string",
   "viewerIsAuthor": boolean
}

Soumettre une facture

Enregistre le document de facture d’un fournisseur, en JSON, cXML ou UBL.

POST/v1/workspaces/{regionId}/invoices

Corps

  • invoiceNumberstring

    Numéro de facture fourni par le fournisseur, utilisé pour dédupliquer les soumissions renvoyées au sein de la région.

  • poIdstring

    Id du bon de commande Pleaxy auquel se rapporte cette facture, par exemple "PO-AB12CD34". Omettez-le pour soumettre une facture autonome.

  • supplierstringObligatoire

    Nom d’affichage du fournisseur / de la contrepartie.

  • amountnumberObligatoire

    Total de la facture. Doit être supérieur à 0.

  • currencystring

    Code ISO 4217 (ici, ou dans currencyID pour UBL / Money currency pour cXML). Doit être la devise de la région, et une facture sur un bon de commande doit être dans la devise de ce bon de commande. Pleaxy ne convertit pas les devises.

  • dueInDaysnumber

    Conditions de paiement en jours. Par défaut, les conditions de paiement par défaut du contrat dont relève le bon de commande, sinon 30.

  • lineItemsArray<{ description, qty?, unitPrice?, amount }>

    Ventilation facultative de la facture par ligne.

  • lineItems[].ai{ invoicer, vendor, model, meter, region?, period? }

    Une ligne d’IA : ce qu’elle facture et le mois d’usage (YYYY-MM ; le mois précédant invoiceDate si omis), avec qty dans l’unité du compteur (millions de tokens, heures). Chaque ligne d’IA est rapprochée de la ligne d’IA du bon de commande ayant le même périmètre et soumise à la condition du contrat, à la grille tarifaire et au rapport d’usage du fournisseur ; ce qu’elle enfreint apparaît en constats ai_*.

  • poLineNonumber

    Avec poId : la ligne du bon de commande que facture cette facture, comme dans CreateInvoice. Les documents XML l’indiquent plutôt ligne par ligne (UBL cac:OrderLineReference/cbc:LineID, cXML InvoiceDetailItemReference@lineNumber).

  • billsNoPoLineboolean

    Avec poId : true lorsque la facture ne facture aucune des lignes du bon de commande, comme dans CreateInvoice. Incompatible avec poLineNo.

  • remittanceInstructionsobject

    Où l’acheteur doit payer, enregistré avec la facture et jamais modifié ensuite : { method, payeeName, bankName?, iban?, accountNumber?, bic?, routingNumber?, mailingAddress?, paymentReference?, notes? }. method vaut bank_transfer (nécessite iban ou accountNumber), wire (iban ou accountNumber, plus bic ou routingNumber), ach (accountNumber et un routingNumber ABA à 9 chiffres), check (mailingAddress) ou other (notes). Pleaxy ne le vérifie jamais ; l’acheteur est averti lorsque le bénéficiaire ou le compte diffère de la facture précédente de ce fournisseur.

  • pdfBase64string

    PDF de la facture encodé en base64.

Retour

201 Created avec l’objet présenté dans la réponse.

Plus de détails

Opération acheteur : enregistre directement le document de facture d’un fournisseur, sans conversion préalable d’un bon de commande créé dans Pleaxy. Un corps JSON avec un connectionId relève de CreateInvoice. Le corps JSON ci-dessous (fournisseur et montant, sans connectionId) est obsolète et accepté jusqu’à la v2. Un appelant fournisseur reçoit 400 SUPPLIER_DIRECT_INVOICE_RETIRED : une facture envoyée de cette façon n’atteignait aucun acheteur ; les fournisseurs utilisent plutôt CreateInvoice ou FlipPurchaseOrderToInvoice. Accepte trois formats de requête, choisis selon Content-Type : application/json (un corps CreateInvoiceDto), ou application/xml / text/xml contenant soit un cXML InvoiceDetailRequest, soit un document Invoice UBL 2.1 (détecté automatiquement à partir du XML analysé). Si poId est fourni, il est vérifié par rapport à un bon de commande existant au statut awaiting_fulfillment, et la facture est "pending" lorsqu’un montant de facturation en direct existe pour le fournisseur cloud du bon de commande, sinon "unverified" avec unverifiedReason "no_billing_connection" ; s’il est omis, la facture démarre en "unverified" avec unverifiedReason "no_purchase_order". Un document XML bénéficie du même mappage des remises, frais et taxes, du même refus des lignes négatives et du même rapprochement des totaux que SubmitFeedInvoice, et un échec donne 400 INVOICE_DOCUMENT_INVALID. Le corps JSON reste inchangé.

Appelants acheteurs uniquement : appelez avec une session connectée ou une X-Api-Key à portée limitée d’un espace de travail acheteur (voir Clés API). Les appelants fournisseurs reçoivent toujours 400. Utilisez plutôt CreateInvoice.

Champs de la réponse

  • idstring

    Identifiant de la facture. "INV-<PO suffix>" lorsque poId a été fourni, sinon un "INV-XXXXXXXX" aléatoire.

  • matchStatusstring

    "pending" si poId a été fourni et qu’un montant de facturation en direct existe pour son fournisseur cloud, "unverified" sinon.

  • unverifiedReasonstring

    Défini lorsque matchStatus vaut "unverified" : "no_purchase_order" ou "no_billing_connection".

  • currencystring

    La devise dans laquelle la facture est enregistrée, en majuscules.

  • sourcestring

    Toujours "direct" pour ce point de terminaison.

  • submittedFormatstring

    "json", "cxml" ou "ubl", selon le Content-Type de la requête.

Erreurs

  • 400 Bad Request (SUPPLIER_DIRECT_INVOICE_RETIRED) - L’appelant est un fournisseur. Renvoyé pour tous les types de contenu et tous les identifiants, avant que le corps ne soit analysé comme une facture ou validé, et rien n’est enregistré. La limite de taille des requêtes s’applique toujours en premier, et un corps qui n’est pas du JSON valide reçoit le 400 générique de l’analyseur JSON. Voir ListInvoiceCounterparties et CreateInvoice.
  • 400 Bad Request - amount n’est pas supérieur à zéro, le corps JSON échoue à la validation, le bon de commande référencé n’est pas au statut awaiting_fulfillment, le corps XML n’est pas du cXML/UBL reconnaissable ou contient une déclaration DOCTYPE ou d’entité (INVOICE_DOCUMENT_INVALID ; la référence standard de cXML à une DTD externe est autorisée), ou la devise de la facture ne peut pas être acceptée : ce n’est pas la devise de la région (« This invoice is in GBP, but Europe is invoiced in EUR. Ask the supplier to reissue it in EUR - Pleaxy doesn't convert currencies. »), ou ce n’est pas celle du bon de commande référencé (« This invoice is in GBP, but PO-AB12CD34 is in EUR. Ask the supplier to reissue it in EUR - Pleaxy doesn't convert currencies. »). Les deux refus de devise portent respectivement les codes INVOICE_CURRENCY_MISMATCH et INVOICE_PO_CURRENCY_MISMATCH.
  • 404 Not Found - poId a été fourni, mais aucun bon de commande avec cet id n’existe dans l’espace de travail.
  • 409 Conflict - invoiceNumber est déjà utilisé par une autre facture de cet espace de travail, ou le bon de commande référencé a déjà une facture.
  • 415 Unsupported Media Type - L’en-tête Content-Type est autre chose que application/json, application/xml ou text/xml.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou le rôle achats d’un appelant acheteur n’a pas l’accès 'create' aux factures : seuls les rôles administrator et finance l’ont (« Your procurement role ('read-only') doesn't have 'create' access to 'invoices' » ; une clé API est aussi invitée à se régénérer avec un rôle qui l’accorde). Sur un regionId nu, un appelant qui détient les deux profils est traité comme acheteur ; utilisez l’ID d’espace de travail .supplier pour agir en tant que fournisseur.
POST /v1/workspaces/{regionId}/invoices
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/reg_01k5x8p9j3q7vn2mhb4tzc6rde.buyer/invoices" \
  -H "X-Api-Key: $PLEAXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "supplier": "Corvo Cloud Services",
    "amount": 4820.00,
    "currency": "USD",
    "dueInDays": 30,
    "invoiceNumber": "CORVO-2026-0091"
  }'
Réponse · 201 Created
{
  "id": "INV-7F3A9C21",
  "supplier": "Corvo Cloud Services",
  "amount": 4820,
  "currency": "USD",
  "matchStatus": "unverified",
  "paid": false,
  "dueInDays": 30,
  "createdAt": "2026-02-03T09:12:44.000Z",
  "source": "direct",
  "submittedFormat": "json",
  "externalInvoiceNumber": "CORVO-2026-0091"
}

Lister les contreparties de facturation

Liste qui vous pouvez facturer, ou par qui vous pouvez être facturé.

GET/v1/workspaces/{regionId}/invoices/counterparties

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Les contreparties actives que l’appelant peut facturer via CreateInvoice : pour un appelant acheteur, ses fournisseurs validés ; pour un appelant fournisseur, les acheteurs qui l’ont validé. Chaque entrée contient l’id de connexion à passer comme connectionId, la devise de l’acheteur et les bons de commande ouverts entre exactement ces deux parties.

Session connectée uniquement. Une clé API reçoit 403.

Champs de la réponse

  • connectionIdstring

    La connexion fournisseur à facturer : le connectionId de CreateInvoice.

  • namestring

    Le nom de la contrepartie : celui du fournisseur pour un appelant acheteur, celui de l’acheteur pour un appelant fournisseur.

  • currencystring

    La devise de l’acheteur. Chaque facture adressée à cette contrepartie est enregistrée dans cette devise.

  • openPurchaseOrdersArray

    Les bons de commande en attente d’exécution avec un montant restant à facturer, entre exactement cet acheteur et ce fournisseur : les poIds acceptés par CreateInvoice. invoicedAmount est ce que les factures précédentes ont consommé, hors taxes (absent s’il n’y en a pas). lines sont les lignes du bon de commande qu’une facture peut facturer (son poLineNo) : le montant de chacune et ce que les factures précédentes en ont consommé (consumed), hors taxes. defaultDueInDays correspond aux conditions de paiement par défaut du contrat dont relève le bon de commande, pour préremplir le dueInDays d’une facture (absent s’il n’y en a pas). billToCompanyName est l’entreprise que facture le fournisseur du bon de commande (son billToParty ; absent sur les anciens bons de commande). paidDeposits sont les factures payées du bon de commande qu’une facture peut encore déduire comme acompte (deductions[].sourceInvoiceId) : ce que chacune devait et le montant qu’aucune facture ne déduit encore, taxes comprises (absent s’il n’y en a pas).

  • invoiceFeedEnabledboolean

    Appelants acheteurs uniquement : true lorsque les factures automatisées de ce fournisseur sont activées (voir SetInvoiceFeed). Activées dès la validation ; absent signifie désactivées.

  • invoiceFeedUpdatedAtstring

    Appelants acheteurs uniquement : date de la dernière activation ou désactivation des factures automatisées. Absent si cela n’a jamais eu lieu.

  • feedReadinessstring

    Appelants acheteurs avec ?perConnection=true uniquement : l’état des factures automatisées de cette connexion, "off" (l’interrupteur), "untested" (rien n’a encore réussi), "tested" (un appel ValidateFeedInvoice a réussi), "live" (au moins une facture acceptée). La vue propre du fournisseur (ListSupplierConnections) peut aussi indiquer "no_key" et "not_connected".

  • feedAcceptedCount, feedLastAcceptedAt, feedValidCount, feedLastValidAtnumber, string, number, string

    Appelants acheteurs avec ?perConnection=true uniquement : le reflet du journal des tentatives (ListFeedAttempts), une fois que le flux a été appelé.

Erreurs

  • 403 Forbidden - L’appelant s’est authentifié avec une clé API plutôt qu’avec une session connectée (« This action requires a logged-in user session, not an API key »), son identifiant ne donne pas accès à cet espace de travail, ou le rôle achats d’un appelant acheteur ne permet pas de créer des factures.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
GET /v1/workspaces/{regionId}/invoices/counterparties
Requête
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/counterparties" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 200 OK
{
   "counterparties": [
      {
         "connectionId": "string",
         "name": "string",
         "currency": "string",
         "openPurchaseOrders": [
            {
               "id": "string", "amount": number, "createdAt": "string", "label": "string", "invoicedAmount": number, "defaultDueInDays": number, "billToCompanyName": "string",
               "lines": [ { "lineNo": number, "name": "string", "amount": number, "consumed": number } ],
               "paidDeposits": [ { "invoiceId": "string", "externalInvoiceNumber": "string", "currency": "string", "owed": number, "available": number, "paidOn": "string", "prepayment": true, "reference": "string" } ]
            }
         ],
         "invoiceFeedEnabled": boolean,
         "invoiceFeedUpdatedAt": "string"
      }
   ]
}

Créer une facture

Crée une facture pour un acheteur ou un fournisseur connecté.

POST/v1/workspaces/{regionId}/invoices

Corps

  • documentTypestring

    invoice (par défaut), debit_note ou credit_note. Avec credit_note, le reste du corps est celui de CreateCreditNote (un champ inconnu donne 400) et la réponse est l’avoir. Avec debit_note, il s’agit d’une facture qui modifie une autre facture à la hausse : indiquez amendsInvoiceId (ou amendsInvoiceNumber, le numéro du fournisseur) ; connectionId peut être omis. Elle reprend la contrepartie, le bon de commande, la ligne de bon de commande et la devise de l’original (un autre bon de commande ou une autre devise donne 400 DEBIT_NOTE_INVALID), consomme le solde du bon de commande, et est validée et payée comme toute facture. Elle est rapprochée du bon de commande, sauf sur le bon de commande d’un fournisseur cloud, où elle démarre en unverified avec unverifiedReason "debit_note" pour examen par une personne. L’original doit être une facture de ce fournisseur à cet acheteur (sinon 404 DEBIT_NOTE_ORIGINAL_NOT_FOUND), non refusée et qui ne soit pas elle-même une note de débit. Toute autre valeur donne 400 DOCUMENT_TYPE_INVALID.

  • amendsInvoiceIdstring

    Note de débit uniquement : l’id Pleaxy de la facture qu’elle modifie.

  • amendsInvoiceNumberstring

    Note de débit uniquement : le numéro fournisseur de la facture qu’elle modifie, lorsque l’id Pleaxy n’est pas connu.

  • replacesInvoiceIdsArray<string>

    Une facture de remplacement (avoir et refacturation : le fournisseur émet un avoir total sur des factures puis les refacture) : les id Pleaxy des factures et notes de débit qu’elle remplace, de 1 à 20, toutes de ce fournisseur. Elle peut facturer un autre bon de commande ou une autre devise que celles-ci. Chaque original la liste alors dans replacedByInvoiceIds. Une facture inconnue ou celle d’un autre fournisseur donne 404 REPLACES_NOT_FOUND ; un avoir, ou des remplacements sur une note de débit, donnent 400 REPLACES_INVALID.

  • replacesInvoiceNumbersArray<string>

    Une facture de remplacement : les numéros fournisseur des factures qu’elle remplace, lorsque les id Pleaxy ne sont pas connus. De 1 à 20.

  • connectionIdstringObligatoire

    La contrepartie à facturer : un connectionId issu de ListInvoiceCounterparties.

  • poIdstring

    Un bon de commande ouvert entre exactement cet acheteur et ce fournisseur, parmi les openPurchaseOrders de la contrepartie.

  • invoiceNumberstringObligatoire

    De 1 à 64 caractères : lettres, chiffres, '.', '_', '/' et '-', commençant par une lettre ou un chiffre. Unique par fournisseur dans l’espace de travail de l’acheteur, sans tenir compte de la casse.

  • invoiceDatestringObligatoire

    YYYY-MM-DD. Ni dans le futur, ni plus de 365 jours en arrière.

  • dueInDaysnumber

    Conditions de paiement en jours, de 0 à 365. Par défaut, les conditions de paiement par défaut du contrat dont relève le bon de commande (defaultDueInDays de ListInvoiceCounterparties), sinon 30.

  • lineItemsArray<{ description, qty, unitPrice, discount?, charge? }>Obligatoire

    De 1 à 100 lignes. description fait de 1 à 200 caractères, qty est supérieur à 0 et d’au plus 1 000 000, unitPrice va de 0 à 1 000 000 000. Une réduction est une remise, jamais un prix négatif : un unitPrice négatif donne 400 (« lineItems[1].unitPrice can't be negative. Send a reduction as that line's "discount", or as an "adjustments" entry with "type": "discount". »). discount et charge sont des totaux facultatifs pour la ligne, de 0 ou plus, sans plus de décimales que n’en autorise la devise de l’acheteur (2 pour USD et EUR, aucune pour JPY : sinon 400, par exemple « taxAmount must be a whole number in JPY. »), et la remise de la ligne ne peut pas dépasser qty × unitPrice + charge. null n’est pas accepté : omettez un champ qui ne s’applique pas. Le total après remises doit être supérieur à 0, et le total d’au plus 1 000 000 000 000 000. La ligne du bon de commande que facture la facture est indiquée une seule fois, sur la facture (poLineNo ou billsNoPoLine), jamais sur ses lignes : le poLineNo ou billsNoPoLine propre à une ligne est ignoré. Indiquez les frais de port et de manutention dans adjustments plutôt que sous forme de ligne.

  • lineItems[].ai{ invoicer, vendor, model, meter, region?, period? }

    Une ligne d’IA : ce qu’elle facture et le mois d’usage (YYYY-MM ; le mois précédant invoiceDate si omis), avec qty dans l’unité du compteur (millions de tokens, heures). Chaque ligne d’IA est rapprochée de la ligne d’IA du bon de commande ayant le même périmètre et soumise à la condition du contrat, à la grille tarifaire et au rapport d’usage du fournisseur ; ce qu’elle enfreint apparaît en constats ai_*.

  • poLineNonumber

    Avec poId : la ligne du bon de commande que facture cette facture, par son lineNo (issu de GetPurchaseOrder ou de openPurchaseOrders[].lines de ListInvoiceCounterparties). Une facture facture une seule ligne de bon de commande, et toutes ses lignes y sont soumises ; pour facturer plusieurs lignes de bon de commande, envoyez une facture pour chacune. Les lignes ne sont jamais rapprochées des lignes du bon de commande par leur description. Sur un bon de commande à une seule ligne, une facture qui n’en indique aucune facture cette ligne. Sur un bon de commande à plusieurs lignes, une facture qui n’en désigne aucune est en "discrepancy" (po_line_unassigned), qu’une personne doit résoudre, car ni la limite ni le prix d’aucune ligne n’ont pu être contrôlés. Un lineNo que le bon de commande n’a pas donne 400 INVOICE_PO_LINE_UNKNOWN. Incompatible avec billsNoPoLine (400 INVOICE_PO_LINE_CONTRADICTORY). Une note de débit qui n’en indique pas reprend celle de son original.

  • billsNoPoLineboolean

    Avec poId : true lorsque la facture ne facture aucune des lignes du bon de commande, comme un supplément non commandé ou des frais ponctuels. Elle ne consomme que le solde du bon de commande, et la facture n’est jamais validée automatiquement. Incompatible avec poLineNo.

  • adjustmentsArray<{ type, description, amount }>

    Remises et frais au niveau de la facture, avant taxes. 20 au maximum. type vaut "discount" ou "charge" ; description fait de 1 à 200 caractères et est enregistrée sans caractères de contrôle, sauts de ligne ni caractères de contrôle de texte bidirectionnel ; amount est une valeur absolue positive, de 0,01 ou plus, sans plus de décimales que n’en autorise la devise de l’acheteur (type donne le signe).

  • taxAmountnumber

    Total des taxes de la facture, tel qu’indiqué par le fournisseur. Il est inclus dans le total de la facture. Pleaxy ne calcule pas les taxes. 0 ou plus, sans plus de décimales que n’en autorise la devise de l’acheteur. Omettez-le lorsque la facture n’indique aucune taxe ; null est refusé.

  • currencystring

    ISO 4217, facultatif. Seulement contrôlé : il doit s’agir de la devise de l’acheteur, qui est toujours celle enregistrée.

  • pdfBase64string

    PDF de la facture encodé en base64, jusqu’à 8 Mo.

  • remittanceInstructionsobject

    Où l’acheteur doit payer, enregistré avec la facture et jamais modifié ensuite : { method, payeeName, bankName?, iban?, accountNumber?, bic?, routingNumber?, mailingAddress?, paymentReference?, notes? }. method vaut bank_transfer (nécessite iban ou accountNumber), wire (iban ou accountNumber, plus bic ou routingNumber), ach (accountNumber et un routingNumber ABA à 9 chiffres), check (mailingAddress) ou other (notes). Pleaxy ne le vérifie jamais ; l’acheteur est averti lorsque le bénéficiaire ou le compte diffère de la facture précédente de ce fournisseur.

  • withholdingsArray<{ description, amount, rate? }>

    Facultatif. Les retenues fiscales que l’acheteur prélève sur ce qu’il paie (retenciones, par exemple ISR retenido), dans la devise de la facture. Elles réduisent le montant dû, jamais le total ni ses taxes. Avec les déductions, elles doivent rester inférieures au total. 20 au maximum.

  • deductionsArray<{ kind, description, amount, reference?, paidOn?, sourceInvoiceId? }>

    Facultatif. Ce qui a déjà été payé sur la facture, taxes comprises : kind "prepayment" pour un acompte ou une avance versé par l’acheteur (il nécessite une reference, ou un sourceInvoiceId désignant votre facture payée sur le même bon de commande, dont la référence et la date de paiement sont alors renseignées et que le bon de commande ne consomme qu’une fois), ou kind "credit" pour un avoir que vous avez imputé sur la facture. Ces déductions réduisent le montant dû, jamais le total ni ses taxes. Avec les retenues, elles doivent rester inférieures au total ; incompatible avec paymentCurrencyAmount. 20 au maximum. UBL : cbc:PrepaidAmount ; cXML : DepositAmount.

  • taxBreakdownArray<{ description, amount, rate? }>

    Facultatif. Les taxes par type dans la devise de la facture, par exemple [{ "description": "IVA", "rate": 21, "amount": 199.50 }, { "description": "Percepción IIBB", "amount": 28.50 }]. rate est un pourcentage, facultatif. La somme doit être égale à taxAmount, qui devient alors obligatoire (400 TAX_BREAKDOWN_MISMATCH). 20 au maximum. Affichage uniquement. UBL : les TaxSubtotals du TaxTotal dans la devise du document, conservés lorsque leur somme concorde.

  • paymentCurrencyAmountobject

    Facultatif. Uniquement lorsque la facture indique le montant dû dans une autre devise (par exemple AWS facturant un client argentin en ARS) ; totalAmount est alors le montant dû, utilisé par les dettes fournisseurs, les paiements et l’enregistrement du paiement : { currencyCode, totalAmount, totalAmountBeforeTax?, amountBreakdown?: { subTotalAmount?, discounts?, fees?, taxes? }, currencyExchangeDetails: { rate, rateDate?, rateSource?, sourceCurrencyCode?, targetCurrencyCode? } }, le même format que PaymentCurrencyAmount d’AWS Invoicing. rate signifie 1 unité de la devise de la facture = rate currencyCode, tel qu’imprimé sur la facture. Omettez-le lorsque la facture est convertie au taux de la date de paiement. Chaque montant indiqué doit être à 0,5 % près (ou à une unité mineure près) du montant de la facture × rate (400 STATED_AMOUNT_RATE_MISMATCH, qui cite les deux montants), chaque ventilation doit correspondre à son total, et currencyCode ne peut pas être la devise de la facture elle-même (400 SAME_CURRENCY). rateDate est au format YYYY-MM-DD, ni dans le futur, ni plus d’un jour après la date de la facture. UBL : cbc:PaymentCurrencyCode avec cac:PaymentExchangeRate ; cXML : Money@alternateCurrency/alternateAmount sur DueAmount. Enregistré tel qu’indiqué ; Pleaxy ne convertit rien.

  • taxCurrencyAmountobject

    Facultatif. Les taxes dans la devise légale du pays de l’acheteur lorsque ce n’est pas la devise de la facture. Même format que paymentCurrencyAmount ; amountBreakdown.taxes.totalAmount est obligatoire et totalAmount est facultatif. Nécessite taxAmount. UBL : le cac:TaxTotal de cbc:TaxCurrencyCode avec cac:TaxExchangeRate ou, sans celui-ci (EN 16931 BT-111), un taux déduit des deux totaux de taxes ; cXML : Money@alternateAmount sur Tax. Un taux déduit a rateSource "derived" et n’est pas contrôlé par rapport aux montants dont il provient. Affichage uniquement.

Retour

201 Created avec l’objet présenté dans la réponse.

Plus de détails

Envoyé sous forme de corps application/json avec un connectionId ; le même chemin sans connectionId correspond à SubmitInvoice. Cette route remplace POST /v1/workspaces/{regionId}/invoices/manual, qui renvoie désormais 410 ROUTE_MERGED. Enregistre une facture pour une contrepartie active issue de ListInvoiceCounterparties : un fournisseur qui facture l’un de ses acheteurs, ou un acheteur qui saisit la facture de l’un de ses fournisseurs. La facture est enregistrée dans l’espace de travail de l’acheteur, dans la devise de l’acheteur, pour que les deux parties la voient. Le serveur calcule le montant de chaque ligne comme qty × unitPrice + charge − discount, et le total comme la somme des lignes, moins les remises au niveau de la facture, plus les frais au niveau de la facture, plus taxAmount. Chaque montant calculé est arrondi au demi supérieur à l’unité mineure de la devise de l’acheteur : au centime pour USD et EUR, à l’unité entière pour JPY (3 × 333,33 JPY donne un montant de ligne de 1 000). Ce total est le montant rapproché, validé, plafonné et payé. Avec poId, la facture est "pending" lorsqu’un montant de facturation en direct existe pour le fournisseur cloud du bon de commande, sinon "unverified" avec unverifiedReason "no_billing_connection" (vue acheteur uniquement) ; sans poId, elle est "unverified" avec unverifiedReason "no_purchase_order". Un acheteur qui saisit une facture ne peut ni la valider, ni la résoudre, ni l’exporter, ni enregistrer son paiement, sauf si personne d’autre dans l’espace de travail ne le pourrait, et la payer via Stripe demande toujours une autre personne.

Appelants acheteurs : une session connectée ou une X-Api-Key d’un espace de travail acheteur. La personne qui l’a enregistrée et, pour une clé, également la personne qui a créé la clé ne peuvent ni la valider, ni la résoudre, ni l’exporter, ni enregistrer son paiement, sauf si une personne connectée est la seule de l’espace de travail à pouvoir le faire ; la payer via Stripe demande toujours une autre personne. Appelants fournisseurs : session connectée uniquement ; une clé API fournisseur reçoit 400 SUPPLIER_DIRECT_INVOICE_RETIRED.

Champs de la réponse

  • sourcestring

    Toujours "manual" pour ce point de terminaison.

  • amountnumber

    Le total à payer : les lignes après leurs propres remises et frais, moins les remises au niveau de la facture, plus les frais au niveau de la facture, plus taxAmount. Le rapprochement, la validation, l’autonomie, les plafonds contractuels et le règlement l’utilisent tous.

  • lineItemsArray

    Chaque ligne telle qu’enregistrée. amount est le montant net de la ligne, hors taxes ; discount et charge n’apparaissent que sur une ligne qui en comporte.

  • adjustmentsArray

    Remises et frais au niveau de la facture. Absent s’il n’y en a pas.

  • taxAmountnumber

    Les taxes indiquées, déjà incluses dans amount. Affichage uniquement : aucune décision ne s’en sert. Absent si aucune taxe n’a été indiquée.

  • currencystring

    La devise de l’acheteur.

Erreurs

  • 400 Bad Request - Le corps échoue à la validation (y compris plus de 20 ajustements, un taxAmount négatif, ou plus de 2 décimales sur une remise, des frais, un ajustement ou taxAmount), INVOICE_DOCUMENT_INVALID (un unitPrice négatif ; une remise de ligne supérieure à sa ligne : « Line 2's discount (12.00 USD) is more than the line (10.00 USD). Check lineItems[1].discount. » ; un total après remises qui n’est pas supérieur à 0 : « The invoice total after discounts must be greater than zero. » ; un total supérieur à 1 000 000 000 000 000 ; ou plus de décimales que n’en autorise la devise de l’acheteur sur une remise, des frais, un ajustement ou taxAmount (« lineItems[0].discount must be a whole number in JPY. »)), invoiceDate est hors plage (INVOICE_DATE_OUT_OF_RANGE), la contrepartie n’est pas encore connectée (COUNTERPARTY_NOT_ACTIVE), poId ne peut pas être facturé (PO_NOT_INVOICEABLE), poLineNo est une ligne que le bon de commande n’a pas (INVOICE_PO_LINE_UNKNOWN) ou est fourni avec billsNoPoLine (INVOICE_PO_LINE_CONTRADICTORY), ou currency n’est pas la devise de l’acheteur (INVOICE_CURRENCY_MISMATCH).
  • 404 Not Found - Aucune contrepartie avec ce connectionId n’est visible pour l’appelant.
  • 409 Conflict - Ce fournisseur a déjà une facture avec ce numéro (INVOICE_NUMBER_TAKEN).
  • 400 Bad Request - Le corps contient un amount (AMOUNT_NOT_ACCEPTED : « Leave amount off: Pleaxy computes the total from the line items. »), ou un fournisseur a appelé avec une clé API (SUPPLIER_DIRECT_INVOICE_RETIRED).
  • 403 Forbidden - L’identifiant ne donne pas accès à cet espace de travail, ou le rôle achats d’un appelant acheteur ne permet pas de créer des factures.
  • 422 Unprocessable Entity - La contrepartie est le propre profil acheteur ou fournisseur de l’appelant (SELF_DEALING).
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
POST /v1/workspaces/{regionId}/invoices
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices" \
  -H "X-Api-Key: $PLEAXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d @body.json
body.json
{
   "connectionId": "string",
   "poId": "string",
   "invoiceNumber": "string",
   "invoiceDate": "string",
   "dueInDays": number,
   "poLineNo": number,
   "lineItems": [
      { "description": "string", "qty": number, "unitPrice": number, "discount": number, "charge": number }
   ],
   "adjustments": [
      { "type": "discount" | "charge", "description": "string", "amount": number }
   ],
   "taxAmount": number,
   "currency": "string",
   "pdfBase64": "string"
}
Réponse · 201 Created
{
   "documentType": "invoice" | "debit_note",
   "amendsInvoiceId": "string",
   "amendsExternalInvoiceNumber": "string",
   "debitNoteIds": [ "string" ],
   "replacesInvoiceIds": [ "string" ],
   "replacedByInvoiceIds": [ "string" ],
   "replacement": { "creditedInFull": boolean, "uncredited": number },
   "uncreditedOriginals": [ { "invoiceId": "string", "externalInvoiceNumber": "string", "uncredited": number, "currency": "string" } ],
   "id": "string",
   "po": "string",
   "poLineNo": number,
   "billsNoPoLine": true,
   "buyerOrgId": "string",
   "supplierOrgId": "string",
   "supplier": "string",
   "amount": number,
   "currency": "string",
   "usageAmount": number,
   "usageCurrency": "string",
   "tolerancePct": number,
   "matchStatus": "pending" | "matched" | "discrepancy" | "unverified",
   "unverifiedReason": "no_purchase_order" | "no_billing_connection" | "debit_note",
   "discrepancyReason": "amount" | "currency",
   "paid": boolean,
   "dueInDays": number,
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "createdAt": "string",
   "lastRemindedAt": "string",
   "rejection": { "reasonCode": "amount_incorrect" | "not_ordered_or_not_received" | "duplicate" | "missing_or_wrong_po" | "wrong_billing_entity" | "other", "reason": "string", "at": "string" },
   "replacesInvoiceId": "string",
   "source": "po-flip" | "direct" | "manual" | "feed",
   "submittedFormat": "json" | "cxml" | "ubl",
   "submittedBy": "string",
   "externalInvoiceNumber": "string",
   "lineItems": [
      { "description": "string", "qty": number, "unitPrice": number, "discount": number, "charge": number, "amount": number }
   ],
   "adjustments": [
      { "type": "discount" | "charge", "description": "string", "amount": number }
   ],
   "taxAmount": number,
   "taxBreakdown": [ { "description": "string", "rate": number, "amount": number } ],
   "paymentCurrencyAmount": { "currencyCode": "string", "totalAmount": number, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "taxCurrencyAmount": { "currencyCode": "string", "amountBreakdown": { "taxes": { "totalAmount": number } }, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "baseCurrencyAmount": { "currencyCode": "string", "totalAmount": number },
   "rateWarnings": [
      { "object": "payment" | "tax", "currency": "string", "statedRate": number, "referenceRate": number, "source": "provider" | "override", "asOf": "string", "deviationPct": number }
   ],
   "withholdings": [ { "description": "string", "rate": number, "amount": number } ],
   "deductions": [ { "kind": "prepayment" | "credit", "description": "string", "amount": number, "reference": "string", "paidOn": "string", "sourceInvoiceId": "string", "stated": true } ],
   "invoiceKind": "prepayment",
   "creditNoteIds": [ "string" ],
   "creditApplications": [ { "id": "string", "creditNoteId": "string", "externalCreditNoteNumber": "string", "amount": number, "appliedAt": "string", "appliedByName": "string", "auto": true } ],
   "payment": { "status": "recorded", "method": "ach" | "wire" | "check" | "card" | "other" | "credit", "paymentDate": "string", "reference": "string", "paidAmount": { "amount": number, "currency": "string", "rate": number, "rateDate": "string" } },
   "remittances": [ { "id": "string", "sentAt": "string", "sentByName": "string", "note": "string", "file": { "fileName": "string", "contentType": "application/pdf" | "image/png" | "image/jpeg", "sizeBytes": number } } ]
}

Obtenir les taux de change

Renvoie les taux de change utilisés pour comparer des montants à vos limites.

GET/v1/workspaces/{regionId}/exchange-rates

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Les taux que Pleaxy utilise uniquement pour comparer les commandes et factures dans d’autres devises à vos seuils de validation, conditions de montant, limites de validation automatique, règles d’automatisation et plafonds de dépenses. Les montants, factures et paiements ne sont jamais convertis. Une ligne par devise utilisée par vos commandes, factures et fournisseurs : le taux de référence vers la devise de votre espace de travail (un taux quotidien d’Exchange Rate API, utilisé tant qu’il a au plus 3 jours). Les espaces de travail ne peuvent pas définir leurs propres taux. Sans taux récent, un document dans cette devise passe par toutes les étapes de validation et n’est jamais validé automatiquement. Une chaîne construite avec un taux l’enregistre sous approval.fx : { from, to, rate, source: provider | none, asOf, controlAmount, supplierStated? }. Lorsqu’une facture indique son propre montant dans la devise de votre espace de travail (son paymentCurrencyAmount, ou son total au taux de son taxCurrencyAmount), controlAmount est le plus élevé de ce montant et du montant au taux de référence, de sorte qu’un taux indiqué bas ne peut pas abaisser le routage ; supplierStated { amount, rateSource, rateDate } indique le montant de la facture. Sans taux de référence récent, la chaîne passe quand même par toutes les étapes de validation, jamais selon le montant de la facture. Une facture dont le taux indiqué s’écarte de plus de warningPct du taux de référence à son arrivée porte rateWarnings (vue acheteur uniquement) ; ils ne la bloquent jamais. Rates By Exchange Rate API (https://www.exchangerate-api.com).

Session connectée uniquement, avec l’accès 'view' aux paramètres de validation. Une clé API reçoit 403 HUMAN_SESSION_REQUIRED : les conditions du fournisseur de taux ne permettent pas de proposer ses taux via une API.

Erreurs

  • 403 Forbidden - Une clé API (HUMAN_SESSION_REQUIRED), un appelant fournisseur, ou un rôle achats sans 'view' sur les paramètres de validation.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
GET /v1/workspaces/{regionId}/exchange-rates
Requête
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/exchange-rates" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 200 OK
{
   "workspaceCurrency": "string",
   "warningPct": number,
   "rows": [
      { "currency": "string", "providerRate": number, "providerAsOf": "string" }
   ],
   "provider": { "asOf": "string", "fresh": boolean, "attribution": { "text": "string", "url": "string" } }
}

Définir l’alerte de taux de change

Définit à partir de quel écart le taux de change propre à une facture déclenche un avertissement.

PUT/v1/workspaces/{regionId}/exchange-rates

Corps

  • warningPctnumberObligatoire

    De 0 à 100.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Définit de combien, en pourcentage, le taux indiqué par une facture (le taux de son paymentCurrencyAmount ou de son taxCurrencyAmount) peut s’écarter du taux de référence (un taux quotidien récent d’Exchange Rate API) avant que la facture porte rateWarnings. 5 par défaut. Contrôlé à l’arrivée d’une facture ; les factures déjà reçues conservent leurs avertissements. Un avertissement ne bloque jamais une facture. Sans taux de référence récent, il n’y a rien à comparer et aucun avertissement.

Session connectée uniquement (une clé API reçoit 403 HUMAN_SESSION_REQUIRED), avec l’accès 'edit' aux paramètres de validation : les administrateurs.

Erreurs

  • 400 Bad Request - warningPct est absent, ou n’est pas un nombre de 0 à 100.
  • 403 Forbidden - Une clé API, un appelant fournisseur, ou un rôle achats sans 'edit' sur les paramètres de validation.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
PUT /v1/workspaces/{regionId}/exchange-rates
Requête
curl -X PUT "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/exchange-rates" \
  -H "X-Api-Key: $PLEAXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d @body.json
body.json
{
   "warningPct": number
}
Réponse · 200 OK
{
   "warningPct": number
}

Obtenir le taux de référence

Renvoie le taux de change de référence pour une date.

GET/v1/workspaces/{regionId}/reference-rate

Paramètres

  • fromstringObligatoire

    Code ISO 4217 : la devise de la facture.

  • tostringObligatoire

    Code ISO 4217 : la devise de paiement ou de taxe.

  • datestring

    YYYY-MM-DD, la date de la facture. Aujourd’hui par défaut.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Le taux de référence pour 1 from en to à une date de facture : le taux quotidien d’Exchange Rate API pour cette date, ou le plus récent des 3 jours précédents, jamais celui d’un jour ultérieur. Sans date, celui du jour, tant qu’il a au plus 3 jours. Le formulaire Nouvelle facture l’utilise pour suggérer le taux d’une devise de paiement ou de taxe ; la facture enregistre les taux et montants soumis, quels qu’ils soient, et Pleaxy vérifie qu’ils concordent. reference est absent lorsqu’il n’y a pas de taux (même devise, devise inconnue, ou aucun relevé pour cette date). Rates By Exchange Rate API (https://www.exchangerate-api.com).

Session connectée uniquement, avec l’accès 'create' aux factures. Une clé API reçoit 403 HUMAN_SESSION_REQUIRED : les conditions du fournisseur de taux ne permettent pas de proposer ses taux via une API.

Erreurs

  • 400 Bad Request - from ou to n’est pas un code ISO 4217 à 3 lettres, ou date n’est pas au format YYYY-MM-DD.
  • 403 Forbidden - Une clé API (HUMAN_SESSION_REQUIRED), ou un rôle sans 'create' sur les factures.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
GET /v1/workspaces/{regionId}/reference-rate
Requête
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/reference-rate" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 200 OK
{
   "reference": {
      "from": "string",
      "to": "string",
      "rate": number,
      "date": "string",
      "source": "string",
      "attribution": { "text": "string", "url": "string" }
   }
}

Définir les devises d’un fournisseur

Définit les devises dans lesquelles un fournisseur facture et est payé.

PUT/v1/workspaces/{regionId}/supplier-connections/{connectionId}/currencies

Paramètres

  • connectionIdstringObligatoire

    La connexion fournisseur.

Corps

  • billingCurrencystring | null

    ISO 4217. Uniquement pour un fournisseur sans compte Pleaxy ; un fournisseur qui a un compte définit ses propres devises.

  • paymentCurrencystring | null

    ISO 4217. Pour un fournisseur qui a un compte, une devise dans laquelle il accepte d’être payé.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Définit deux valeurs par défaut pour un fournisseur : « Devise de facturation » (billingCurrency), la devise dans laquelle vous facture un fournisseur sans compte Pleaxy, utilisée pour ses nouvelles commandes et factures ; et « Devise de paiement » (paymentCurrency), la devise dans laquelle vous le payez habituellement, proposée comme devise de paiement d’une nouvelle facture. Un champ absent reste inchangé, null le supprime. Les commandes et factures existantes conservent leurs devises. Le fournisseur ne voit ni l’une ni l’autre.

Session connectée ou X-Api-Key d’un espace de travail acheteur, avec l’accès 'edit' aux fournisseurs : administrator ou contracts-and-suppliers.

Erreurs

  • 400 Bad Request - Un code qui n’est pas ISO 4217, billingCurrency pour un fournisseur qui a un compte (BILLING_CURRENCY_SUPPLIER_OWNED), ou un paymentCurrency qu’il n’accepte pas (PAYMENT_CURRENCY_NOT_ACCEPTED).
  • 403 Forbidden - Un appelant fournisseur, ou un rôle achats sans 'edit' sur les fournisseurs.
  • 404 Not Found - Aucune connexion de ce type dans cet espace de travail.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
PUT /v1/workspaces/{regionId}/supplier-connections/{connectionId}/currencies
Requête
curl -X PUT "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/supplier-connections/{connectionId}/currencies" \
  -H "X-Api-Key: $PLEAXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d @body.json
body.json
{
   "billingCurrency": "string" | null,
   "paymentCurrency": "string" | null
}
Réponse · 200 OK
{
   "id": "string",
   "supplierName": "string",
   "billingCurrency": "string",
   "paymentCurrency": "string"
}

Configurer le flux de factures

Active ou désactive les factures automatisées d’un fournisseur.

PUT/v1/workspaces/{regionId}/supplier-connections/{connectionId}/invoice-feed

Paramètres

  • connectionIdstringObligatoire

    La connexion fournisseur.

Corps

  • enabledbooleanObligatoire

    true pour accepter les factures automatisées de ce fournisseur, false pour les arrêter.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Active ou désactive les factures automatisées d’un fournisseur (SubmitFeedInvoice) pour une connexion validée. Activées dès que vous validez l’intégration du fournisseur (les connexions validées avant le 9 octobre 2026 conservent leur valeur) ; c’est le bouton d’arrêt. Les désactiver fait refuser dès la requête suivante du fournisseur ; les factures déjà reçues restent dans Factures et rapprochement et poursuivent leur validation. Le fournisseur est notifié (invoice_feed_changed). Redéfinir la valeur actuelle ne change rien. Renvoie la connexion avec invoiceFeedEnabled, invoiceFeedUpdatedAt et invoiceFeedUpdatedBy. ListInvoiceCounterparties indique le réglage actuel et l’état de préparation de chaque connexion.

Session connectée uniquement (une clé API reçoit 403), avec l’accès 'edit' aux factures : administrator ou finance.

Erreurs

  • 400 Bad Request - La connexion n’est pas encore validée (COUNTERPARTY_NOT_ACTIVE), ou enabled n’est pas un booléen.
  • 403 Forbidden - Une clé API au lieu d’une session connectée, un appelant fournisseur, ou un rôle achats sans 'edit' sur les factures (read-only, contracts-and-suppliers, relationships, requisitions).
  • 404 Not Found - Aucune connexion avec cet id dans l’espace de travail.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
PUT /v1/workspaces/{regionId}/supplier-connections/{connectionId}/invoice-feed
Requête
curl -X PUT "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/supplier-connections/{connectionId}/invoice-feed" \
  -H "X-Api-Key: $PLEAXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d @body.json
body.json
{
   "enabled": boolean
}
Réponse · 200 OK
{
   "id": "string",
   "supplierName": "string",
   "status": "approved",
   "invoiceFeedEnabled": boolean,
   "invoiceFeedUpdatedAt": "string",
   "invoiceFeedUpdatedBy": "string"
}

Lister les tentatives du flux

Liste les tentatives de factures automatisées sur une connexion.

GET/v1/workspaces/{regionId}/supplier-connections/{connectionId}/feed-attempts

Paramètres

  • connectionIdstringObligatoire

    La connexion fournisseur.

  • beforestring

    Le curseur de la dernière ligne de la page dont vous disposez, pour obtenir la page suivante. 50 lignes par page.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Le journal des tentatives des factures automatisées d’une connexion : chaque appel à SubmitFeedInvoice ou ValidateFeedInvoice qui a atteint la connexion, du plus récent au plus ancien, avec la réponse de Pleaxy. Un refus intervenu avant que la connexion soit connue (pas de clé, mauvaise portée, limite de débit de la clé, connexion qui n’appartient pas à l’appelant) ne peut être attribué à aucune connexion et n’est pas consigné. Le document lui-même n’est jamais stocké. Le fournisseur lit ses propres connexions ; l’acheteur lit celles des fournisseurs qu’il a validés ; tous deux voient les mêmes lignes. Les lignes sont conservées 90 jours. La connexion elle-même (ListSupplierConnections, ListInvoiceCounterparties avec ?perConnection=true) reflète la dernière tentative de chaque type : feedLastAttemptAt, feedLastAcceptedAt, feedAcceptedCount, feedLastRefusedAt, feedLastRefusedCode, feedLastValidAt, feedValidCount.

Session connectée ou clé API. Un appelant acheteur a besoin de l’accès 'view' aux fournisseurs.

Champs de la réponse

  • modestring

    "submit" pour la route réelle, "validate" pour la route de test.

  • formatstring

    Connu une fois le corps analysé ; absent lorsque l’appel a été refusé avant.

  • outcomestring

    "accepted" (201, une facture créée), "replayed" (200, le même document à nouveau), "valid" (un test réussi), "refused" (toute erreur survenue une fois la connexion connue, y compris un flux désactivé).

  • status, code, messagenumber, string, string

    La réponse reçue par l’appelant : le statut HTTP et, en cas de refus, son code et son message tels que renvoyés.

  • messageId, paramsstring, object

    En cas de refus, le messageId et les params de l’erreur tels que renvoyés, pour l’afficher dans la langue de votre lecteur. Absent sur les lignes consignées avant leur conservation.

  • invoiceNumberstring

    Votre numéro de facture, si l’analyse est allée jusque-là.

  • invoiceIdstring

    La facture créée ou rejouée ; pour un test réussi, la facture que désigne déjà un numéro rejoué.

  • creditNoteIdstring

    L’avoir créé ou rejoué, lorsque le document était un avoir ; invoiceNumber est alors son numéro.

  • keyIdstring

    L’id de la clé API (jamais son secret), à rapprocher de ListApiKeys.

  • beforestring

    Le curseur de la dernière ligne lorsqu’il peut y avoir des lignes plus anciennes ; absent sur la dernière page.

Erreurs

  • 400 Bad Request - before n’est pas un curseur issu d’une page précédente.
  • 403 Forbidden - Le rôle achats d’un appelant acheteur ne permet pas de voir les fournisseurs (requisitions).
  • 404 Not Found - Aucune connexion avec cet id ne vous appartient.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
GET /v1/workspaces/{regionId}/supplier-connections/{connectionId}/feed-attempts
Requête
curl "$PLEAXY_API_BASE_URL/v1/workspaces/reg_01k5x8p9j3q7vn2mhb4tzc6rde.supplier/supplier-connections/SC-1A2B3C4D/feed-attempts" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 200 OK
{
  "attempts": [
    {
      "at": "2026-10-09T10:12:44.000Z",
      "mode": "submit",
      "format": "ubl",
      "outcome": "refused",
      "status": 400,
      "code": "INVOICE_CURRENCY_MISMATCH",
      "message": "This invoice is in EUR, but Beta Buyer is invoiced in USD. Reissue it in USD - Pleaxy doesn't convert currencies.",
      "invoiceNumber": "INV-2026-0143",
      "keyId": "k_01k6…",
      "cursor": "FEEDATTEMPT#2026-10-09T10:12:44.000Z#3f9a1c2e"
    },
    {
      "at": "2026-10-09T09:58:02.000Z",
      "mode": "validate",
      "format": "json",
      "outcome": "valid",
      "status": 200,
      "invoiceNumber": "INV-2026-0001",
      "keyId": "k_01k6…",
      "cursor": "FEEDATTEMPT#2026-10-09T09:58:02.000Z#b71e0d44"
    }
  ]
}

Lancer le rapprochement d’une facture

Compare une facture à la consommation cloud mesurée.

POST/v1/workspaces/{regionId}/invoices/{invoiceId}/run-match

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

Retour

201 Created avec l’objet présenté dans la réponse.

Plus de détails

Lance le rapprochement à 3 voies : compare le montant facturé (amount) à la consommation mesurée (usageAmount, en usageCurrency, la devise propre du fournisseur cloud, issue d’une connexion de facturation active). Seul un chiffre réel est comparé : une ancienne facture pending sans chiffre de consommation réel devient à la place "unverified" (unverifiedReason "no_billing_connection"), sans chaîne de validation. Seul un chiffre issu d’une facture AWS émise permet à l’autonomie ou à une règle d’automatisation de la valider sans intervention humaine ; un rapprochement avec toute autre source est envoyé à une personne. Dans la tolérance (3 %), la facture devient matched et une chaîne de validation est construite. Hors tolérance, elle passe automatiquement à matched si le dépassement relève de l’autonomie, sinon elle devient discrepancy (discrepancyReason "amount") et attend ResolveInvoiceDiscrepancy. Pleaxy ne convertit pas les devises : lorsque la consommation est dans une autre devise que la facture, rien n’est comparé et aucune autonomie ni règle d’automatisation ne s’applique ; la facture devient discrepancy avec discrepancyReason "currency" et nécessite ResolveInvoiceDiscrepancy. Une facture sur un bon de commande qui ne concerne pas un fournisseur cloud n’a pas de consommation à comparer : elle est créée en pending avec matchBasis "purchase_order" lorsqu’elle passe les contrôles de son bon de commande et de son contrat, et cet appel construit sa chaîne de validation : matched, toujours avec un valideur humain, jamais par l’autonomie ni par une règle d’automatisation. Une facture créée "unverified" (unverifiedReason "no_billing_connection") avant cela est de nouveau contrôlée par rapport à son bon de commande et à son contrat : matched, ou discrepancy avec discrepancyReason "controls". Le demandeur de la chaîne de validation est l’appelant authentifié (une clé API est enregistrée comme apikey:<keyId>), jamais un nom transmis ; la requête ne prend pas de corps.

Champs de la réponse

  • matchStatusstring

    "matched" ou "discrepancy" après le rapprochement, ou "unverified" pour une ancienne facture pending sans chiffre de consommation réel.

  • discrepancyReasonstring

    Défini uniquement en cas d’écart : "amount" (hors tolérance), "currency" (consommation dans une autre devise, jamais comparée) ou "controls" (enfreint son bon de commande ou son contrat).

  • matchBasisstring

    "purchase_order" lorsque la facture a été rapprochée d’un bon de commande qui ne concerne pas un fournisseur cloud plutôt que d’une consommation. Absent pour un rapprochement sur consommation.

Erreurs

  • 400 Bad Request - Le matchStatus de la facture n’est pas "pending" (ou "unverified" sur un bon de commande qui ne concerne pas un fournisseur cloud). Pour toute autre facture unverified (sans bon de commande, ou sans connexion de facturation) : « Invoice '{invoiceId}' can't be matched: it's unverified, with no usage figure to compare against. Nothing was matched. A person must review it in Pleaxy before it can go for approval. » Sinon : « Invoice '{invoiceId}' has already been matched (result: {matchStatus}). »
  • 404 Not Found - Aucune facture avec cet id n’existe dans l’espace de travail.
  • 409 Conflict - Une autre exécution ou décision est intervenue simultanément ; relisez la facture.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/run-match
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/run-match" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 201 Created
{
   "documentType": "invoice" | "debit_note",
   "amendsInvoiceId": "string",
   "amendsExternalInvoiceNumber": "string",
   "debitNoteIds": [ "string" ],
   "replacesInvoiceIds": [ "string" ],
   "replacedByInvoiceIds": [ "string" ],
   "replacement": { "creditedInFull": boolean, "uncredited": number },
   "uncreditedOriginals": [ { "invoiceId": "string", "externalInvoiceNumber": "string", "uncredited": number, "currency": "string" } ],
   "id": "string",
   "po": "string",
   "poLineNo": number,
   "billsNoPoLine": true,
   "buyerOrgId": "string",
   "supplierOrgId": "string",
   "supplier": "string",
   "amount": number,
   "currency": "string",
   "usageAmount": number,
   "usageCurrency": "string",
   "tolerancePct": number,
   "matchStatus": "pending" | "matched" | "discrepancy" | "unverified",
   "unverifiedReason": "no_purchase_order" | "no_billing_connection" | "debit_note",
   "discrepancyReason": "amount" | "currency",
   "paid": boolean,
   "dueInDays": number,
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "createdAt": "string",
   "lastRemindedAt": "string",
   "rejection": { "reasonCode": "amount_incorrect" | "not_ordered_or_not_received" | "duplicate" | "missing_or_wrong_po" | "wrong_billing_entity" | "other", "reason": "string", "at": "string" },
   "replacesInvoiceId": "string",
   "source": "po-flip" | "direct" | "manual" | "feed",
   "submittedFormat": "json" | "cxml" | "ubl",
   "submittedBy": "string",
   "externalInvoiceNumber": "string",
   "lineItems": [
      { "description": "string", "qty": number, "unitPrice": number, "discount": number, "charge": number, "amount": number }
   ],
   "adjustments": [
      { "type": "discount" | "charge", "description": "string", "amount": number }
   ],
   "taxAmount": number,
   "taxBreakdown": [ { "description": "string", "rate": number, "amount": number } ],
   "paymentCurrencyAmount": { "currencyCode": "string", "totalAmount": number, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "taxCurrencyAmount": { "currencyCode": "string", "amountBreakdown": { "taxes": { "totalAmount": number } }, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "baseCurrencyAmount": { "currencyCode": "string", "totalAmount": number },
   "rateWarnings": [
      { "object": "payment" | "tax", "currency": "string", "statedRate": number, "referenceRate": number, "source": "provider" | "override", "asOf": "string", "deviationPct": number }
   ],
   "withholdings": [ { "description": "string", "rate": number, "amount": number } ],
   "deductions": [ { "kind": "prepayment" | "credit", "description": "string", "amount": number, "reference": "string", "paidOn": "string", "sourceInvoiceId": "string", "stated": true } ],
   "invoiceKind": "prepayment",
   "creditNoteIds": [ "string" ],
   "creditApplications": [ { "id": "string", "creditNoteId": "string", "externalCreditNoteNumber": "string", "amount": number, "appliedAt": "string", "appliedByName": "string", "auto": true } ],
   "payment": { "status": "recorded", "method": "ach" | "wire" | "check" | "card" | "other" | "credit", "paymentDate": "string", "reference": "string", "paidAmount": { "amount": number, "currency": "string", "rate": number, "rateDate": "string" } },
   "remittances": [ { "id": "string", "sentAt": "string", "sentByName": "string", "note": "string", "file": { "fileName": "string", "contentType": "application/pdf" | "image/png" | "image/jpeg", "sizeBytes": number } } ]
}

Résoudre l’écart d’une facture

Envoie en validation une facture examinée qui présente un écart.

POST/v1/workspaces/{regionId}/invoices/{invoiceId}/resolve-discrepancy

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

Retour

201 Created avec l’objet présenté dans la réponse.

Plus de détails

Forçage manuel pour une facture examinée par une personne : lance une chaîne de validation normale (hors autonomie) pour une facture en écart ou unverified. Un écart devient "matched" ; une facture unverified reste "unverified" avec sa chaîne en attente, car rien n’a été contrôlé. Le demandeur de la chaîne de validation est l’appelant authentifié (une clé API est enregistrée comme apikey:<keyId>), jamais un nom transmis ; la requête ne prend pas de corps.

Une clé API peut résoudre un écart de montant ou de devise. Seule une session connectée peut résoudre une facture unverified, quel que soit son unverifiedReason ; une clé API reçoit 403 HUMAN_REVIEW_REQUIRED.

Erreurs

  • 400 Bad Request - Le matchStatus de la facture n’est ni "discrepancy" ni "unverified".
  • 403 Forbidden - HUMAN_REVIEW_REQUIRED : la facture est unverified et l’appelant est une clé API (« An unverified invoice has nothing to match it against, so a person must review it. Sign in to Pleaxy to resolve it. »). Rien n’est modifié.
  • 404 Not Found - Aucune facture avec cet id n’existe dans l’espace de travail.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/resolve-discrepancy
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/resolve-discrepancy" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 201 Created
{
   "documentType": "invoice" | "debit_note",
   "amendsInvoiceId": "string",
   "amendsExternalInvoiceNumber": "string",
   "debitNoteIds": [ "string" ],
   "replacesInvoiceIds": [ "string" ],
   "replacedByInvoiceIds": [ "string" ],
   "replacement": { "creditedInFull": boolean, "uncredited": number },
   "uncreditedOriginals": [ { "invoiceId": "string", "externalInvoiceNumber": "string", "uncredited": number, "currency": "string" } ],
   "id": "string",
   "po": "string",
   "poLineNo": number,
   "billsNoPoLine": true,
   "buyerOrgId": "string",
   "supplierOrgId": "string",
   "supplier": "string",
   "amount": number,
   "currency": "string",
   "usageAmount": number,
   "usageCurrency": "string",
   "tolerancePct": number,
   "matchStatus": "pending" | "matched" | "discrepancy" | "unverified",
   "unverifiedReason": "no_purchase_order" | "no_billing_connection" | "debit_note",
   "discrepancyReason": "amount" | "currency",
   "paid": boolean,
   "dueInDays": number,
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "createdAt": "string",
   "lastRemindedAt": "string",
   "rejection": { "reasonCode": "amount_incorrect" | "not_ordered_or_not_received" | "duplicate" | "missing_or_wrong_po" | "wrong_billing_entity" | "other", "reason": "string", "at": "string" },
   "replacesInvoiceId": "string",
   "source": "po-flip" | "direct" | "manual" | "feed",
   "submittedFormat": "json" | "cxml" | "ubl",
   "submittedBy": "string",
   "externalInvoiceNumber": "string",
   "lineItems": [
      { "description": "string", "qty": number, "unitPrice": number, "discount": number, "charge": number, "amount": number }
   ],
   "adjustments": [
      { "type": "discount" | "charge", "description": "string", "amount": number }
   ],
   "taxAmount": number,
   "taxBreakdown": [ { "description": "string", "rate": number, "amount": number } ],
   "paymentCurrencyAmount": { "currencyCode": "string", "totalAmount": number, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "taxCurrencyAmount": { "currencyCode": "string", "amountBreakdown": { "taxes": { "totalAmount": number } }, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "baseCurrencyAmount": { "currencyCode": "string", "totalAmount": number },
   "rateWarnings": [
      { "object": "payment" | "tax", "currency": "string", "statedRate": number, "referenceRate": number, "source": "provider" | "override", "asOf": "string", "deviationPct": number }
   ],
   "withholdings": [ { "description": "string", "rate": number, "amount": number } ],
   "deductions": [ { "kind": "prepayment" | "credit", "description": "string", "amount": number, "reference": "string", "paidOn": "string", "sourceInvoiceId": "string", "stated": true } ],
   "invoiceKind": "prepayment",
   "creditNoteIds": [ "string" ],
   "creditApplications": [ { "id": "string", "creditNoteId": "string", "externalCreditNoteNumber": "string", "amount": number, "appliedAt": "string", "appliedByName": "string", "auto": true } ],
   "payment": { "status": "recorded", "method": "ach" | "wire" | "check" | "card" | "other" | "credit", "paymentDate": "string", "reference": "string", "paidAmount": { "amount": number, "currency": "string", "rate": number, "rateDate": "string" } },
   "remittances": [ { "id": "string", "sentAt": "string", "sentByName": "string", "note": "string", "file": { "fileName": "string", "contentType": "application/pdf" | "image/png" | "image/jpeg", "sizeBytes": number } } ]
}

Valider une facture

Valide l’étape de validation en cours d’une facture.

POST/v1/workspaces/{regionId}/invoices/{invoiceId}/approve

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

Retour

201 Created avec l’objet présenté dans la réponse.

Plus de détails

Fait avancer d’une étape la chaîne de validation de la facture. Seul l’employé désigné par l’étape en cours peut l’appeler : aucun rôle, aucune permission ni aucun droit d’administrateur ne remplace le fait d’être désigné, et une clé API ne peut jamais être désignée. Une validation complète envoie une notification invoice_approved au fournisseur. Ne prend pas de corps et agit au nom de l’appelant authentifié (une clé API agit en tant que apikey:<keyId>).

Session connectée uniquement. Tout autre appelant, y compris une clé API, reçoit 403 HUMAN_APPROVAL_REQUIRED avant toute lecture.

Erreurs

  • 400 Bad Request - La facture n’a aucune étape de validation en attente.
  • 403 Forbidden - Code HUMAN_APPROVAL_REQUIRED. L’appelant est une clé API. Les étapes de validation désignent un employé précis, et une clé ne peut jamais en être un : une clé ne peut donc ni valider ni refuser une étape. Demandez à l’employé désigné par l’étape d’agir dans Pleaxy.
  • 403 Forbidden - Code APPROVER_NOT_ASSIGNED. Aucun valideur n’est affecté à l’étape en cours, donc personne ne peut agir dessus. Un administrateur doit d’abord en affecter un avec ReassignPurchaseOrderApprovalStage / ReassignInvoiceApprovalStage.
  • 403 Forbidden - L’appelant n’est pas l’employé désigné par l’étape en cours. Seul cet employé peut la valider ou la refuser : aucun rôle ni aucune permission ne remplace le fait d’être désigné.
  • 404 Not Found - Aucune facture avec cet id n’existe dans l’espace de travail.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/approve
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/approve" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 201 Created
{
   "documentType": "invoice" | "debit_note",
   "amendsInvoiceId": "string",
   "amendsExternalInvoiceNumber": "string",
   "debitNoteIds": [ "string" ],
   "replacesInvoiceIds": [ "string" ],
   "replacedByInvoiceIds": [ "string" ],
   "replacement": { "creditedInFull": boolean, "uncredited": number },
   "uncreditedOriginals": [ { "invoiceId": "string", "externalInvoiceNumber": "string", "uncredited": number, "currency": "string" } ],
   "id": "string",
   "po": "string",
   "poLineNo": number,
   "billsNoPoLine": true,
   "buyerOrgId": "string",
   "supplierOrgId": "string",
   "supplier": "string",
   "amount": number,
   "currency": "string",
   "usageAmount": number,
   "usageCurrency": "string",
   "tolerancePct": number,
   "matchStatus": "pending" | "matched" | "discrepancy" | "unverified",
   "unverifiedReason": "no_purchase_order" | "no_billing_connection" | "debit_note",
   "discrepancyReason": "amount" | "currency",
   "paid": boolean,
   "dueInDays": number,
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "createdAt": "string",
   "lastRemindedAt": "string",
   "rejection": { "reasonCode": "amount_incorrect" | "not_ordered_or_not_received" | "duplicate" | "missing_or_wrong_po" | "wrong_billing_entity" | "other", "reason": "string", "at": "string" },
   "replacesInvoiceId": "string",
   "source": "po-flip" | "direct" | "manual" | "feed",
   "submittedFormat": "json" | "cxml" | "ubl",
   "submittedBy": "string",
   "externalInvoiceNumber": "string",
   "lineItems": [
      { "description": "string", "qty": number, "unitPrice": number, "discount": number, "charge": number, "amount": number }
   ],
   "adjustments": [
      { "type": "discount" | "charge", "description": "string", "amount": number }
   ],
   "taxAmount": number,
   "taxBreakdown": [ { "description": "string", "rate": number, "amount": number } ],
   "paymentCurrencyAmount": { "currencyCode": "string", "totalAmount": number, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "taxCurrencyAmount": { "currencyCode": "string", "amountBreakdown": { "taxes": { "totalAmount": number } }, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "baseCurrencyAmount": { "currencyCode": "string", "totalAmount": number },
   "rateWarnings": [
      { "object": "payment" | "tax", "currency": "string", "statedRate": number, "referenceRate": number, "source": "provider" | "override", "asOf": "string", "deviationPct": number }
   ],
   "withholdings": [ { "description": "string", "rate": number, "amount": number } ],
   "deductions": [ { "kind": "prepayment" | "credit", "description": "string", "amount": number, "reference": "string", "paidOn": "string", "sourceInvoiceId": "string", "stated": true } ],
   "invoiceKind": "prepayment",
   "creditNoteIds": [ "string" ],
   "creditApplications": [ { "id": "string", "creditNoteId": "string", "externalCreditNoteNumber": "string", "amount": number, "appliedAt": "string", "appliedByName": "string", "auto": true } ],
   "payment": { "status": "recorded", "method": "ach" | "wire" | "check" | "card" | "other" | "credit", "paymentDate": "string", "reference": "string", "paidAmount": { "amount": number, "currency": "string", "rate": number, "rateDate": "string" } },
   "remittances": [ { "id": "string", "sentAt": "string", "sentByName": "string", "note": "string", "file": { "fileName": "string", "contentType": "application/pdf" | "image/png" | "image/jpeg", "sizeBytes": number } } ]
}

Refuser une facture

Refuse une facture, avec un motif visible par le fournisseur.

POST/v1/workspaces/{regionId}/invoices/{invoiceId}/reject

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

Corps

  • reasonCodestringObligatoire

    L’une des valeurs amount_incorrect, not_ordered_or_not_received, duplicate, missing_or_wrong_po, wrong_billing_entity, other. Le fournisseur en voit le libellé.

  • reasonstringObligatoire

    La note que voit le fournisseur : ce qu’il doit corriger. Les sauts de ligne deviennent des espaces, et les caractères de contrôle et invisibles sont supprimés. Elle doit ensuite contenir au moins 10 lettres ou chiffres et au plus 500 caractères. Texte brut ; jamais affiché sous forme de lien. N’y mettez ni données personnelles ni commentaires internes.

Retour

201 Created avec l’objet présenté dans la réponse.

Plus de détails

Refuse la facture à son étape de validation en cours, avec un motif visible par le fournisseur. Seul l’employé désigné par l’étape en cours peut l’appeler. Une facture unverified ou en écart qui n’a pas encore de chaîne de validation est un cas à part : tout acheteur disposant de invoices:edit peut la refuser, sauf l’acheteur qui l’a saisie. Sessions connectées uniquement : une clé API ne peut pas refuser. Le fournisseur voit le motif et la note mot pour mot, mais pas qui a refusé, et reçoit une notification qui ne mentionne que le motif. Le refus est enregistré sur la facture sous `rejection`. Refuser une facture qui détient la réservation de son bon de commande rouvre ce bon de commande dans la même écriture, pour que le fournisseur puisse envoyer une facture corrigée sur celui-ci : elle reçoit l’id INV-<PO suffix>-R<n> et `replacesInvoiceId`, et nécessite un nouveau numéro de facture, car la facture refusée conserve le sien.

Erreurs

  • 400 Bad Request - La facture n’a aucune étape de validation en attente.
  • 400 Bad Request - Code INVOICE_REJECTION_REASON_INVALID. reasonCode est absent ou ne fait pas partie des six codes, ou reason est absent, n’est pas une chaîne, contient moins de 10 lettres ou chiffres, ou dépasse 500 caractères une fois nettoyé.
  • 403 Forbidden - Code HUMAN_APPROVAL_REQUIRED : « Rejecting needs you, signed in to Pleaxy. » L’appelant est une clé API. Un refus est une décision que voit le fournisseur ; il nécessite donc une personne connectée.
  • 403 Forbidden - Code APPROVER_NOT_ASSIGNED. Aucun valideur n’est affecté à l’étape en cours, donc personne ne peut agir dessus. Un administrateur doit d’abord en affecter un avec ReassignPurchaseOrderApprovalStage / ReassignInvoiceApprovalStage.
  • 403 Forbidden - L’appelant n’est pas l’employé désigné par l’étape en cours. Seul cet employé peut la valider ou la refuser : aucun rôle ni aucune permission ne remplace le fait d’être désigné.
  • 404 Not Found - Aucune facture avec cet id n’existe dans l’espace de travail.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/reject
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/reject" \
  -H "X-Api-Key: $PLEAXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d @body.json
body.json
{
   "reasonCode": "amount_incorrect" | "not_ordered_or_not_received" | "duplicate" | "missing_or_wrong_po" | "wrong_billing_entity" | "other",
   "reason": "string"
}
Réponse · 201 Created
{
   "documentType": "invoice" | "debit_note",
   "amendsInvoiceId": "string",
   "amendsExternalInvoiceNumber": "string",
   "debitNoteIds": [ "string" ],
   "replacesInvoiceIds": [ "string" ],
   "replacedByInvoiceIds": [ "string" ],
   "replacement": { "creditedInFull": boolean, "uncredited": number },
   "uncreditedOriginals": [ { "invoiceId": "string", "externalInvoiceNumber": "string", "uncredited": number, "currency": "string" } ],
   "id": "string",
   "po": "string",
   "poLineNo": number,
   "billsNoPoLine": true,
   "buyerOrgId": "string",
   "supplierOrgId": "string",
   "supplier": "string",
   "amount": number,
   "currency": "string",
   "usageAmount": number,
   "usageCurrency": "string",
   "tolerancePct": number,
   "matchStatus": "pending" | "matched" | "discrepancy" | "unverified",
   "unverifiedReason": "no_purchase_order" | "no_billing_connection" | "debit_note",
   "discrepancyReason": "amount" | "currency",
   "paid": boolean,
   "dueInDays": number,
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "createdAt": "string",
   "lastRemindedAt": "string",
   "rejection": { "reasonCode": "amount_incorrect" | "not_ordered_or_not_received" | "duplicate" | "missing_or_wrong_po" | "wrong_billing_entity" | "other", "reason": "string", "at": "string" },
   "replacesInvoiceId": "string",
   "source": "po-flip" | "direct" | "manual" | "feed",
   "submittedFormat": "json" | "cxml" | "ubl",
   "submittedBy": "string",
   "externalInvoiceNumber": "string",
   "lineItems": [
      { "description": "string", "qty": number, "unitPrice": number, "discount": number, "charge": number, "amount": number }
   ],
   "adjustments": [
      { "type": "discount" | "charge", "description": "string", "amount": number }
   ],
   "taxAmount": number,
   "taxBreakdown": [ { "description": "string", "rate": number, "amount": number } ],
   "paymentCurrencyAmount": { "currencyCode": "string", "totalAmount": number, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "taxCurrencyAmount": { "currencyCode": "string", "amountBreakdown": { "taxes": { "totalAmount": number } }, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "baseCurrencyAmount": { "currencyCode": "string", "totalAmount": number },
   "rateWarnings": [
      { "object": "payment" | "tax", "currency": "string", "statedRate": number, "referenceRate": number, "source": "provider" | "override", "asOf": "string", "deviationPct": number }
   ],
   "withholdings": [ { "description": "string", "rate": number, "amount": number } ],
   "deductions": [ { "kind": "prepayment" | "credit", "description": "string", "amount": number, "reference": "string", "paidOn": "string", "sourceInvoiceId": "string", "stated": true } ],
   "invoiceKind": "prepayment",
   "creditNoteIds": [ "string" ],
   "creditApplications": [ { "id": "string", "creditNoteId": "string", "externalCreditNoteNumber": "string", "amount": number, "appliedAt": "string", "appliedByName": "string", "auto": true } ],
   "payment": { "status": "recorded", "method": "ach" | "wire" | "check" | "card" | "other" | "credit", "paymentDate": "string", "reference": "string", "paidAmount": { "amount": number, "currency": "string", "rate": number, "rateDate": "string" } },
   "remittances": [ { "id": "string", "sentAt": "string", "sentByName": "string", "note": "string", "file": { "fileName": "string", "contentType": "application/pdf" | "image/png" | "image/jpeg", "sizeBytes": number } } ]
}

Réaffecter une étape de validation d’une facture

Affecte une étape de validation en attente à une autre personne.

POST/v1/workspaces/{regionId}/invoices/{invoiceId}/approval/reassign

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

Corps

  • stageIdstringObligatoire

    Id de l’étape en attente à réaffecter. Elle peut se trouver dans n’importe quel groupe de la chaîne, pas seulement dans le groupe en cours.

  • approverEmployeeKeystringObligatoire

    Clé d’employé (sub Cognito) du nouveau valideur. Doit être un membre acheteur de cet espace de travail, et pas l’administrateur qui effectue l’action.

  • reasonstring

    Pourquoi l’étape a été réaffectée, jusqu’à 280 caractères. Affiché dans l’historique de validation.

Retour

201 Created avec l’objet présenté dans la réponse.

Plus de détails

L’équivalent pour les factures de ReassignPurchaseOrderApprovalStage : redirige une étape en attente de la chaîne de validation de cette facture vers un autre employé désigné. Administrateur uniquement (approvalSettings:edit), sessions connectées uniquement, limité au document, et consigné dans l’historique de validation. C’est ainsi que l’on débloque une facture liée à un fournisseur qui, par sécurité, a été placée sur une étape « Manual approval » non affectée.

Erreurs

  • 400 Bad Request - La chaîne est déjà validée ou refusée ; l’étape a déjà été validée ou refusée ; le nouveau valideur n’est pas un employé de cet espace de travail ; le nouveau valideur a créé la commande / saisi la facture, est exclu au titre de la séparation des tâches, a déjà levé le plafond de dépenses par sa propre délégation de pouvoir, ou occupe déjà une autre place sur la même étape ; ou l’étape est la revue du plafond de dépenses, dont le valideur est un élément d’audit figé (modifiez-le dans Paramètres › Plafonds de dépenses).
  • 403 Forbidden - L’appelant n’a pas approvalSettings:edit (administrateur), ou s’est désigné lui-même comme nouveau valideur : s’affecter une étape active ferait d’une seule personne toute la chaîne, sans aucune trace de règle. Code HUMAN_APPROVAL_REQUIRED lorsque l’appelant est une clé API : seul un administrateur connecté peut réaffecter une étape de validation.
  • 404 Not Found - Aucun document avec cet id n’existe dans l’espace de travail, ou la chaîne n’a aucune étape avec ce stageId.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/approval/reassign
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/approval/reassign" \
  -H "X-Api-Key: $PLEAXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d @body.json
body.json
{
   "stageId": "string",
   "approverEmployeeKey": "string",
   "reason": "string"
}
Réponse · 201 Created
{
   "documentType": "invoice" | "debit_note",
   "amendsInvoiceId": "string",
   "amendsExternalInvoiceNumber": "string",
   "debitNoteIds": [ "string" ],
   "replacesInvoiceIds": [ "string" ],
   "replacedByInvoiceIds": [ "string" ],
   "replacement": { "creditedInFull": boolean, "uncredited": number },
   "uncreditedOriginals": [ { "invoiceId": "string", "externalInvoiceNumber": "string", "uncredited": number, "currency": "string" } ],
   "id": "string",
   "po": "string",
   "poLineNo": number,
   "billsNoPoLine": true,
   "buyerOrgId": "string",
   "supplierOrgId": "string",
   "supplier": "string",
   "amount": number,
   "currency": "string",
   "usageAmount": number,
   "usageCurrency": "string",
   "tolerancePct": number,
   "matchStatus": "pending" | "matched" | "discrepancy" | "unverified",
   "unverifiedReason": "no_purchase_order" | "no_billing_connection" | "debit_note",
   "discrepancyReason": "amount" | "currency",
   "paid": boolean,
   "dueInDays": number,
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "createdAt": "string",
   "lastRemindedAt": "string",
   "rejection": { "reasonCode": "amount_incorrect" | "not_ordered_or_not_received" | "duplicate" | "missing_or_wrong_po" | "wrong_billing_entity" | "other", "reason": "string", "at": "string" },
   "replacesInvoiceId": "string",
   "source": "po-flip" | "direct" | "manual" | "feed",
   "submittedFormat": "json" | "cxml" | "ubl",
   "submittedBy": "string",
   "externalInvoiceNumber": "string",
   "lineItems": [
      { "description": "string", "qty": number, "unitPrice": number, "discount": number, "charge": number, "amount": number }
   ],
   "adjustments": [
      { "type": "discount" | "charge", "description": "string", "amount": number }
   ],
   "taxAmount": number,
   "taxBreakdown": [ { "description": "string", "rate": number, "amount": number } ],
   "paymentCurrencyAmount": { "currencyCode": "string", "totalAmount": number, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "taxCurrencyAmount": { "currencyCode": "string", "amountBreakdown": { "taxes": { "totalAmount": number } }, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "baseCurrencyAmount": { "currencyCode": "string", "totalAmount": number },
   "rateWarnings": [
      { "object": "payment" | "tax", "currency": "string", "statedRate": number, "referenceRate": number, "source": "provider" | "override", "asOf": "string", "deviationPct": number }
   ],
   "withholdings": [ { "description": "string", "rate": number, "amount": number } ],
   "deductions": [ { "kind": "prepayment" | "credit", "description": "string", "amount": number, "reference": "string", "paidOn": "string", "sourceInvoiceId": "string", "stated": true } ],
   "invoiceKind": "prepayment",
   "creditNoteIds": [ "string" ],
   "creditApplications": [ { "id": "string", "creditNoteId": "string", "externalCreditNoteNumber": "string", "amount": number, "appliedAt": "string", "appliedByName": "string", "auto": true } ],
   "payment": { "status": "recorded", "method": "ach" | "wire" | "check" | "card" | "other" | "credit", "paymentDate": "string", "reference": "string", "paidAmount": { "amount": number, "currency": "string", "rate": number, "rateDate": "string" } },
   "remittances": [ { "id": "string", "sentAt": "string", "sentByName": "string", "note": "string", "file": { "fileName": "string", "contentType": "application/pdf" | "image/png" | "image/jpeg", "sizeBytes": number } } ]
}

Enregistrer un paiement

Enregistre qu’une facture a été payée en dehors de Pleaxy.

POST/v1/workspaces/{regionId}/invoices/{invoiceId}/payment-record

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

Corps

  • methodstringObligatoire

    Moyen de paiement : ach, wire, check, card ou other.

  • paymentDatestringObligatoire

    Date (YYYY-MM-DD) d’envoi du paiement. Pas postérieure à aujourd’hui dans le fuseau horaire de l’espace de travail acheteur, ni antérieure à la date de la facture.

  • referencestringObligatoire

    La référence de la banque ou de l’outil de paiement, comme une trace ACH ou un numéro de chèque, de 1 à 64 caractères une fois nettoyée. Le fournisseur la voit. Jamais un numéro de compte bancaire.

  • currencystring

    Uniquement pour un paiement dans une autre devise que celle du montant dû : ISO 4217. Nécessite amount et rate.

  • amountnumber

    Avec currency : ce qui a été payé, en currency. Le montant dû × rate, à 0,5 % ou une unité mineure près.

  • ratenumber

    Avec currency : 1 {devise du montant dû} = rate {currency}, le taux auquel le paiement a été effectué.

  • rateDatestring

    Avec currency : la date (YYYY-MM-DD) à laquelle correspond le taux, pas postérieure à aujourd’hui. paymentDate par défaut.

  • remittance{ note?, file?: { fileId, fileName } }

    Un avis de règlement pour le fournisseur, envoyé avec la notification du paiement : une note, un justificatif de paiement téléversé avec RequestRemittanceUpload, ou les deux. Mêmes règles que SendRemittance.

  • confirmReplacedboolean

    True pour l’enregistrer malgré tout lorsque la facture est remplacée (avoir et refacturation) et que ses avoirs ne la couvrent pas entièrement : la payer en plus de sa facture de remplacement revient à payer deux fois.

Retour

201 Created avec l’objet présenté dans la réponse.

Plus de détails

Enregistre qu’une facture validée a été payée en dehors de Pleaxy, avec le moyen, la date et la référence. Aucun fonds n’est déplacé et la réalité du paiement n’est pas vérifiée. Un paiement couvre l’intégralité du montant dû : le paymentCurrencyAmount.totalAmount de la facture lorsqu’elle en indique un, sinon son amount, dans cette devise. Un paiement partiel ne peut pas être enregistré. Payé dans une autre devise que celle du montant dû ? Envoyez aussi amount, currency et rate : le montant doit être égal au montant dû × rate, à 0,5 % ou une unité mineure près, et est enregistré comme paidAmount ; Pleaxy ne convertit rien. La facture apparaît comme payée, et le fournisseur est notifié que l’acheteur a enregistré le paiement et reçoit un avis de paiement indiquant qu’il a été enregistré par l’acheteur et non effectué via Pleaxy. Fonctionne aussi sur une facture exportée, ce qui clôt son export. Enregistrer à nouveau les mêmes informations renvoie 200 avec alreadyRecorded: true et ne change rien. Vous pouvez aussi envoyer en même temps un avis de règlement au fournisseur (remittance), comme le fait SendRemittance.

Une session connectée avec l’accès 'edit' aux factures. Modifié le 2026-09-24, correctif de sécurité au sein de la v1 : une clé API ne peut pas enregistrer de paiement (403 HUMAN_SESSION_REQUIRED). La personne qui a saisi la facture et les membres du profil du fournisseur ne peuvent pas enregistrer son paiement.

Erreurs

  • 400 Bad Request - Un champ est absent ou invalide (codes PAYMENT_METHOD_INVALID, PAYMENT_DATE_INVALID, PAYMENT_DATE_IN_FUTURE, PAYMENT_DATE_BEFORE_INVOICE, PAYMENT_REFERENCE_INVALID), le montant payé ne convient pas (PAID_AMOUNT_SAME_CURRENCY : currency est la devise même du montant dû, omettez donc amount, currency et rate ; PAID_AMOUNT_INVALID : amount ou rate absent ou non supérieur à 0, ou rateDate incorrect ; PAID_AMOUNT_RATE_MISMATCH : amount n’est pas égal au montant dû × rate), l’avis de règlement est invalide (comme pour SendRemittance), ou le corps contient un champ non accepté.
  • 403 Forbidden - Code HUMAN_SESSION_REQUIRED : l’appelant est une clé API. Ou un refus au titre de la séparation des tâches : l’appelant a saisi la facture ou est membre du profil du fournisseur.
  • 404 Not Found - Aucune facture avec cet id n’existe dans l’espace de travail.
  • 409 Conflict - Code PAYMENT_ALREADY_RECORDED (un autre paiement est déjà enregistré : retirez-le d’abord), STRIPE_PAYMENT_IN_PROGRESS (un paiement via Pleaxy avec Stripe a été lancé), EXPORT_COOLING_OFF (son export a été retiré ; réessayez le jour ouvré suivant), REPLACED_UNCREDITED (la facture est remplacée et ses avoirs ne la couvrent pas entièrement : vérifiez auprès du fournisseur, puis envoyez confirmReplaced: true) ou PAYMENT_CHANGED.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/payment-record
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/payment-record" \
  -H "X-Api-Key: $PLEAXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d @body.json
body.json
{
   "method": "ach" | "wire" | "check" | "card" | "other",
   "paymentDate": "YYYY-MM-DD",
   "reference": "string",
   "currency": "string",
   "amount": number,
   "rate": number,
   "rateDate": "YYYY-MM-DD",
   "remittance": { "note": "string", "file": { "fileId": "string", "fileName": "string" } },
   "confirmReplaced": boolean
}
Réponse · 201 Created
{
   "documentType": "invoice" | "debit_note",
   "amendsInvoiceId": "string",
   "amendsExternalInvoiceNumber": "string",
   "debitNoteIds": [ "string" ],
   "replacesInvoiceIds": [ "string" ],
   "replacedByInvoiceIds": [ "string" ],
   "replacement": { "creditedInFull": boolean, "uncredited": number },
   "uncreditedOriginals": [ { "invoiceId": "string", "externalInvoiceNumber": "string", "uncredited": number, "currency": "string" } ],
   "id": "string",
   "po": "string",
   "poLineNo": number,
   "billsNoPoLine": true,
   "buyerOrgId": "string",
   "supplierOrgId": "string",
   "supplier": "string",
   "amount": number,
   "currency": "string",
   "usageAmount": number,
   "usageCurrency": "string",
   "tolerancePct": number,
   "matchStatus": "pending" | "matched" | "discrepancy" | "unverified",
   "unverifiedReason": "no_purchase_order" | "no_billing_connection" | "debit_note",
   "discrepancyReason": "amount" | "currency",
   "paid": boolean,
   "dueInDays": number,
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "createdAt": "string",
   "lastRemindedAt": "string",
   "rejection": { "reasonCode": "amount_incorrect" | "not_ordered_or_not_received" | "duplicate" | "missing_or_wrong_po" | "wrong_billing_entity" | "other", "reason": "string", "at": "string" },
   "replacesInvoiceId": "string",
   "source": "po-flip" | "direct" | "manual" | "feed",
   "submittedFormat": "json" | "cxml" | "ubl",
   "submittedBy": "string",
   "externalInvoiceNumber": "string",
   "lineItems": [
      { "description": "string", "qty": number, "unitPrice": number, "discount": number, "charge": number, "amount": number }
   ],
   "adjustments": [
      { "type": "discount" | "charge", "description": "string", "amount": number }
   ],
   "taxAmount": number,
   "taxBreakdown": [ { "description": "string", "rate": number, "amount": number } ],
   "paymentCurrencyAmount": { "currencyCode": "string", "totalAmount": number, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "taxCurrencyAmount": { "currencyCode": "string", "amountBreakdown": { "taxes": { "totalAmount": number } }, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "baseCurrencyAmount": { "currencyCode": "string", "totalAmount": number },
   "rateWarnings": [
      { "object": "payment" | "tax", "currency": "string", "statedRate": number, "referenceRate": number, "source": "provider" | "override", "asOf": "string", "deviationPct": number }
   ],
   "withholdings": [ { "description": "string", "rate": number, "amount": number } ],
   "deductions": [ { "kind": "prepayment" | "credit", "description": "string", "amount": number, "reference": "string", "paidOn": "string", "sourceInvoiceId": "string", "stated": true } ],
   "invoiceKind": "prepayment",
   "creditNoteIds": [ "string" ],
   "creditApplications": [ { "id": "string", "creditNoteId": "string", "externalCreditNoteNumber": "string", "amount": number, "appliedAt": "string", "appliedByName": "string", "auto": true } ],
   "payment": { "status": "recorded", "method": "ach" | "wire" | "check" | "card" | "other" | "credit", "paymentDate": "string", "reference": "string", "paidAmount": { "amount": number, "currency": "string", "rate": number, "rateDate": "string" } },
   "remittances": [ { "id": "string", "sentAt": "string", "sentByName": "string", "note": "string", "file": { "fileName": "string", "contentType": "application/pdf" | "image/png" | "image/jpeg", "sizeBytes": number } } ]
}

Retirer un enregistrement de paiement

Retire un paiement enregistré.

DELETE/v1/workspaces/{regionId}/invoices/{invoiceId}/payment-record

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

Corps

  • confirmbooleanObligatoire

    Doit valoir true.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Retire l’enregistrement d’un paiement par l’acheteur. La facture apparaît de nouveau comme impayée et le fournisseur est informé du retrait de l’enregistrement. Cela n’annule ni ne contre-passe le paiement lui-même. L’avis de paiement porte alors la mention « Withdrawn ».

Une session connectée avec l’accès 'edit' aux factures ; une clé API reçoit 403 HUMAN_SESSION_REQUIRED.

Erreurs

  • 403 Forbidden - Code HUMAN_SESSION_REQUIRED, ou un refus au titre de la séparation des tâches.
  • 404 Not Found - Aucune facture avec cet id n’existe, ou code NO_PAYMENT_RECORD : aucun paiement n’est enregistré pour elle.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
DELETE /v1/workspaces/{regionId}/invoices/{invoiceId}/payment-record
Requête
curl -X DELETE "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/payment-record" \
  -H "X-Api-Key: $PLEAXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d @body.json
body.json
{
   "confirm": true
}
Réponse · 200 OK
{
   "documentType": "invoice" | "debit_note",
   "amendsInvoiceId": "string",
   "amendsExternalInvoiceNumber": "string",
   "debitNoteIds": [ "string" ],
   "replacesInvoiceIds": [ "string" ],
   "replacedByInvoiceIds": [ "string" ],
   "replacement": { "creditedInFull": boolean, "uncredited": number },
   "uncreditedOriginals": [ { "invoiceId": "string", "externalInvoiceNumber": "string", "uncredited": number, "currency": "string" } ],
   "id": "string",
   "po": "string",
   "poLineNo": number,
   "billsNoPoLine": true,
   "buyerOrgId": "string",
   "supplierOrgId": "string",
   "supplier": "string",
   "amount": number,
   "currency": "string",
   "usageAmount": number,
   "usageCurrency": "string",
   "tolerancePct": number,
   "matchStatus": "pending" | "matched" | "discrepancy" | "unverified",
   "unverifiedReason": "no_purchase_order" | "no_billing_connection" | "debit_note",
   "discrepancyReason": "amount" | "currency",
   "paid": boolean,
   "dueInDays": number,
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "createdAt": "string",
   "lastRemindedAt": "string",
   "rejection": { "reasonCode": "amount_incorrect" | "not_ordered_or_not_received" | "duplicate" | "missing_or_wrong_po" | "wrong_billing_entity" | "other", "reason": "string", "at": "string" },
   "replacesInvoiceId": "string",
   "source": "po-flip" | "direct" | "manual" | "feed",
   "submittedFormat": "json" | "cxml" | "ubl",
   "submittedBy": "string",
   "externalInvoiceNumber": "string",
   "lineItems": [
      { "description": "string", "qty": number, "unitPrice": number, "discount": number, "charge": number, "amount": number }
   ],
   "adjustments": [
      { "type": "discount" | "charge", "description": "string", "amount": number }
   ],
   "taxAmount": number,
   "taxBreakdown": [ { "description": "string", "rate": number, "amount": number } ],
   "paymentCurrencyAmount": { "currencyCode": "string", "totalAmount": number, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "taxCurrencyAmount": { "currencyCode": "string", "amountBreakdown": { "taxes": { "totalAmount": number } }, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "baseCurrencyAmount": { "currencyCode": "string", "totalAmount": number },
   "rateWarnings": [
      { "object": "payment" | "tax", "currency": "string", "statedRate": number, "referenceRate": number, "source": "provider" | "override", "asOf": "string", "deviationPct": number }
   ],
   "withholdings": [ { "description": "string", "rate": number, "amount": number } ],
   "deductions": [ { "kind": "prepayment" | "credit", "description": "string", "amount": number, "reference": "string", "paidOn": "string", "sourceInvoiceId": "string", "stated": true } ],
   "invoiceKind": "prepayment",
   "creditNoteIds": [ "string" ],
   "creditApplications": [ { "id": "string", "creditNoteId": "string", "externalCreditNoteNumber": "string", "amount": number, "appliedAt": "string", "appliedByName": "string", "auto": true } ],
   "payment": { "status": "recorded", "method": "ach" | "wire" | "check" | "card" | "other" | "credit", "paymentDate": "string", "reference": "string", "paidAmount": { "amount": number, "currency": "string", "rate": number, "rateDate": "string" } },
   "remittances": [ { "id": "string", "sentAt": "string", "sentByName": "string", "note": "string", "file": { "fileName": "string", "contentType": "application/pdf" | "image/png" | "image/jpeg", "sizeBytes": number } } ]
}

Exporter des factures pour paiement

Exporte les factures validées non payées au format CSV pour votre campagne de paiement.

POST/v1/workspaces/{regionId}/invoices/payment-export

Corps

  • invoiceIdsstring[]

    Facultatif : n’exporter que ces factures, de 1 à 1 000 id. Si omis (ou corps vide), toutes les factures éligibles. Tout autre champ donne 400.

  • confirmReplacedboolean

    Avec invoiceIds : exporter malgré tout une facture remplacée (avoir et refacturation) que ses avoirs ne couvrent pas entièrement. Sans invoiceIds, une telle facture est toujours écartée.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Télécharge les factures validées non payées au format CSV pour votre propre campagne de paiement, par date d’échéance croissante, jusqu’à 1 000 : toutes les factures éligibles, ou seulement celles que vous désignez dans invoiceIds (une facture non éligible est écartée). Chaque facture exportée est verrouillée jusqu’à l’enregistrement de son paiement ou le retrait de l’export, pour qu’elle ne puisse pas être exportée ni enregistrée deux fois. Le fichier ne contient aucune coordonnée bancaire. Le fournisseur ne voit pas l’export. En-têtes de réponse : X-Pleaxy-Export-Id, X-Pleaxy-Export-Count, X-Pleaxy-Export-Truncated.

Une session connectée avec l’accès 'edit' aux factures ; une clé API reçoit 403 HUMAN_SESSION_REQUIRED.

Erreurs

  • 403 Forbidden - Code HUMAN_SESSION_REQUIRED.
  • 400 Bad Request - Le corps n’est ni vide, ni {}, ni { invoiceIds, confirmReplaced }, ou invoiceIds est vide, contient plus de 1 000 id ou un id de plus de 64 caractères.
  • 409 Conflict - Code REPLACED_UNCREDITED : une facture désignée dans invoiceIds est remplacée et ses avoirs ne la couvrent pas entièrement. Envoyez confirmReplaced: true pour l’exporter malgré tout.
  • 422 Unprocessable Entity - Code NOTHING_TO_EXPORT : aucune facture validée non payée n’est éligible.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
POST /v1/workspaces/{regionId}/invoices/payment-export
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/payment-export" \
  -H "X-Api-Key: $PLEAXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d @body.json
body.json
{
   "invoiceIds": [ "string" ],
   "confirmReplaced": boolean
}
Réponse · 200 OK
text/csv: one row per invoice, with a status column of approved_unpaid. related_invoice names what a debit note amends or what a replacement replaces; replaced_by, the last column, the invoices that replace one.

Obtenir un export de paiement

Télécharge de nouveau un export de paiement.

GET/v1/workspaces/{regionId}/invoices/payment-exports/{exportId}

Paramètres

  • exportIdstringObligatoire

    X-Pleaxy-Export-Id issu d’ExportInvoicesForPayment.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Télécharge de nouveau un export : le même CSV, reconstruit à partir des factures toujours exportées sous cet id d’export. Utile lorsqu’un téléchargement a échoué après le verrouillage des factures.

Erreurs

  • 404 Not Found - Code EXPORT_NOT_FOUND : aucune facture n’est encore exportée sous cet id.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
GET /v1/workspaces/{regionId}/invoices/payment-exports/{exportId}
Requête
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/payment-exports/{exportId}" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 200 OK
text/csv

Retirer un export de paiement

Retire une facture d’un export de paiement.

DELETE/v1/workspaces/{regionId}/invoices/{invoiceId}/payment-export

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

Corps

  • confirmNotPaidbooleanObligatoire

    Doit valoir true : votre campagne de paiement n’a pas payé cette facture.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Retire une facture de son export, une fois que vous avez confirmé que votre campagne de paiement ne l’a pas payée. Pleaxy ne peut ni voir ni annuler quoi que ce soit dans votre propre outil de paiement. La facture repasse au statut validé mais ne peut être ni exportée ni enregistrée de nouveau avant le jour ouvré suivant, et l’export suivant la marque previously_exported_at.

Une session connectée avec l’accès 'edit' aux factures ; une clé API reçoit 403 HUMAN_SESSION_REQUIRED.

Erreurs

  • 403 Forbidden - Code HUMAN_SESSION_REQUIRED, ou un refus au titre de la séparation des tâches.
  • 404 Not Found - Aucune facture avec cet id n’existe dans l’espace de travail.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
DELETE /v1/workspaces/{regionId}/invoices/{invoiceId}/payment-export
Requête
curl -X DELETE "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/payment-export" \
  -H "X-Api-Key: $PLEAXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d @body.json
body.json
{
   "confirmNotPaid": true
}
Réponse · 200 OK
{
   "documentType": "invoice" | "debit_note",
   "amendsInvoiceId": "string",
   "amendsExternalInvoiceNumber": "string",
   "debitNoteIds": [ "string" ],
   "replacesInvoiceIds": [ "string" ],
   "replacedByInvoiceIds": [ "string" ],
   "replacement": { "creditedInFull": boolean, "uncredited": number },
   "uncreditedOriginals": [ { "invoiceId": "string", "externalInvoiceNumber": "string", "uncredited": number, "currency": "string" } ],
   "id": "string",
   "po": "string",
   "poLineNo": number,
   "billsNoPoLine": true,
   "buyerOrgId": "string",
   "supplierOrgId": "string",
   "supplier": "string",
   "amount": number,
   "currency": "string",
   "usageAmount": number,
   "usageCurrency": "string",
   "tolerancePct": number,
   "matchStatus": "pending" | "matched" | "discrepancy" | "unverified",
   "unverifiedReason": "no_purchase_order" | "no_billing_connection" | "debit_note",
   "discrepancyReason": "amount" | "currency",
   "paid": boolean,
   "dueInDays": number,
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "createdAt": "string",
   "lastRemindedAt": "string",
   "rejection": { "reasonCode": "amount_incorrect" | "not_ordered_or_not_received" | "duplicate" | "missing_or_wrong_po" | "wrong_billing_entity" | "other", "reason": "string", "at": "string" },
   "replacesInvoiceId": "string",
   "source": "po-flip" | "direct" | "manual" | "feed",
   "submittedFormat": "json" | "cxml" | "ubl",
   "submittedBy": "string",
   "externalInvoiceNumber": "string",
   "lineItems": [
      { "description": "string", "qty": number, "unitPrice": number, "discount": number, "charge": number, "amount": number }
   ],
   "adjustments": [
      { "type": "discount" | "charge", "description": "string", "amount": number }
   ],
   "taxAmount": number,
   "taxBreakdown": [ { "description": "string", "rate": number, "amount": number } ],
   "paymentCurrencyAmount": { "currencyCode": "string", "totalAmount": number, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "taxCurrencyAmount": { "currencyCode": "string", "amountBreakdown": { "taxes": { "totalAmount": number } }, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "baseCurrencyAmount": { "currencyCode": "string", "totalAmount": number },
   "rateWarnings": [
      { "object": "payment" | "tax", "currency": "string", "statedRate": number, "referenceRate": number, "source": "provider" | "override", "asOf": "string", "deviationPct": number }
   ],
   "withholdings": [ { "description": "string", "rate": number, "amount": number } ],
   "deductions": [ { "kind": "prepayment" | "credit", "description": "string", "amount": number, "reference": "string", "paidOn": "string", "sourceInvoiceId": "string", "stated": true } ],
   "invoiceKind": "prepayment",
   "creditNoteIds": [ "string" ],
   "creditApplications": [ { "id": "string", "creditNoteId": "string", "externalCreditNoteNumber": "string", "amount": number, "appliedAt": "string", "appliedByName": "string", "auto": true } ],
   "payment": { "status": "recorded", "method": "ach" | "wire" | "check" | "card" | "other" | "credit", "paymentDate": "string", "reference": "string", "paidAmount": { "amount": number, "currency": "string", "rate": number, "rateDate": "string" } },
   "remittances": [ { "id": "string", "sentAt": "string", "sentByName": "string", "note": "string", "file": { "fileName": "string", "contentType": "application/pdf" | "image/png" | "image/jpeg", "sizeBytes": number } } ]
}

Obtenir l’avis de paiement

Télécharge l’avis de paiement d’un paiement, au format PDF.

GET/v1/workspaces/{regionId}/invoices/{invoiceId}/remittance-advice

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

L’avis de paiement d’un paiement enregistré, au format PDF. Il indique que le paiement a été enregistré par l’acheteur et non effectué via Pleaxy, et ne constitue ni un reçu ni une preuve de paiement. Il porte la mention « Revised » après un nouvel enregistrement et « Withdrawn » après un retrait. Envoyez Accept: application/pdf. Un fournisseur dont les acheteurs partagent un id de facture ajoute ?buyer=<buyer Workspace ID>.

Erreurs

  • 404 Not Found - Aucune facture avec cet id, ou code NO_PAYMENT_RECORD : aucun paiement n’a jamais été enregistré pour elle.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
GET /v1/workspaces/{regionId}/invoices/{invoiceId}/remittance-advice
Requête
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/remittance-advice" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 200 OK
application/pdf

Demander le téléversement d’un justificatif de paiement

Renvoie une URL pour téléverser un justificatif de paiement.

POST/v1/workspaces/{regionId}/invoices/{invoiceId}/remittance-upload

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

Corps

  • contentType"application/pdf" | "image/png" | "image/jpeg"Obligatoire

    Le type du fichier.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Une URL présignée pour téléverser un justificatif de paiement, comme le reçu de virement de la banque, pour une facture validée ou payée. Envoyez le fichier par PUT à uploadUrl avec le même Content-Type dans les 5 minutes, jusqu’à maxBytes (10 Mo), puis envoyez son fileId avec SendRemittance ou dans le remittance de RecordPayment. Un fichier téléversé auquel rien n’est rattaché est supprimé au bout de quelques jours.

Une session connectée avec l’accès 'edit' aux factures ; une clé API reçoit 403 HUMAN_SESSION_REQUIRED. Les mêmes règles de séparation des tâches que pour RecordPayment.

Erreurs

  • 400 Bad Request - contentType n’est pas un PDF, PNG ou JPEG (« A remittance file must be a PDF, PNG or JPEG. »).
  • 403 Forbidden - Code HUMAN_SESSION_REQUIRED, ou un refus au titre de la séparation des tâches.
  • 404 Not Found - Aucune facture avec cet id n’existe dans l’espace de travail.
  • 409 Conflict - Code REMITTANCE_NEEDS_PAYMENT : la facture n’est pas encore validée ni payée.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/remittance-upload
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/remittance-upload" \
  -H "X-Api-Key: $PLEAXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d @body.json
body.json
{
   "contentType": "application/pdf" | "image/png" | "image/jpeg"
}
Réponse · 200 OK
{
   "fileId": "string",
   "uploadUrl": "string",
   "maxBytes": number
}

Envoyer un avis de règlement

Envoie au fournisseur un justificatif de paiement ou une note.

POST/v1/workspaces/{regionId}/invoices/{invoiceId}/remittance

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

Corps

  • notestring

    Jusqu’à 1 000 caractères une fois nettoyée, pour le fournisseur. Elle figure dans la notification du fournisseur, que reçoit aussi son canal Slack ou Teams lorsqu’elle y est acheminée.

  • file{ fileId, fileName }

    Un justificatif de paiement, comme le reçu de virement de la banque : le fileId issu de RequestRemittanceUpload, une fois le fichier envoyé par PUT à son uploadUrl, et un fileName de 1 à 200 caractères.

Retour

201 Created avec l’objet présenté dans la réponse.

Plus de détails

Envoie au fournisseur un avis de règlement pour une facture payée : un justificatif de paiement, une note, ou les deux. Le fournisseur est notifié (invoice_remittance_sent, avec la note) et le consulte dans les remittances de la facture, sans savoir qui l’a envoyé ; GetRemittanceFile ouvre le fichier. Jusqu’à 20 par facture, et chacun est conservé lorsqu’un enregistrement de paiement est retiré. Il ne s’agit ni de l’avis de paiement que Pleaxy génère à partir de l’enregistrement du paiement (GetRemittanceAdvice), ni des remittanceInstructions du fournisseur.

Une session connectée avec l’accès 'edit' aux factures ; une clé API reçoit 403 HUMAN_SESSION_REQUIRED. Les mêmes règles de séparation des tâches que pour RecordPayment.

Champs de la réponse

  • remittancesArray

    Chaque avis de règlement envoyé pour la facture, du plus ancien au plus récent : { id (RM-…), sentAt, sentByName, note?, file?: { fileName, contentType, sizeBytes } }.

Erreurs

  • 400 Bad Request - Code REMITTANCE_EMPTY (ni note ni fichier), REMITTANCE_NOTE_INVALID (plus de 1 000 caractères), REMITTANCE_FILE_NAME_INVALID, REMITTANCE_UPLOAD_INCOMPLETE (le fileId ne correspond pas à un fichier téléversé pour cette facture, ou le téléversement ne s’est pas terminé : « The proof of payment hasn't finished uploading. Attach it again. ») ou REMITTANCE_FILE_TOO_LARGE (plus de 10 Mo).
  • 403 Forbidden - Code HUMAN_SESSION_REQUIRED, ou un refus au titre de la séparation des tâches.
  • 404 Not Found - Aucune facture avec cet id n’existe dans l’espace de travail.
  • 409 Conflict - Code REMITTANCE_NEEDS_PAYMENT (aucun paiement n’est encore enregistré : enregistrez-le d’abord), REMITTANCE_LIMIT (la facture en a déjà 20), ou PAYMENT_CHANGED.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/remittance
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/remittance" \
  -H "X-Api-Key: $PLEAXY_API_KEY" \
  -H "Content-Type: application/json" \
  -d @body.json
body.json
{
   "note": "string",
   "file": { "fileId": "string", "fileName": "string" }
}
Réponse · 201 Created
{
   "documentType": "invoice" | "debit_note",
   "amendsInvoiceId": "string",
   "amendsExternalInvoiceNumber": "string",
   "debitNoteIds": [ "string" ],
   "replacesInvoiceIds": [ "string" ],
   "replacedByInvoiceIds": [ "string" ],
   "replacement": { "creditedInFull": boolean, "uncredited": number },
   "uncreditedOriginals": [ { "invoiceId": "string", "externalInvoiceNumber": "string", "uncredited": number, "currency": "string" } ],
   "id": "string",
   "po": "string",
   "poLineNo": number,
   "billsNoPoLine": true,
   "buyerOrgId": "string",
   "supplierOrgId": "string",
   "supplier": "string",
   "amount": number,
   "currency": "string",
   "usageAmount": number,
   "usageCurrency": "string",
   "tolerancePct": number,
   "matchStatus": "pending" | "matched" | "discrepancy" | "unverified",
   "unverifiedReason": "no_purchase_order" | "no_billing_connection" | "debit_note",
   "discrepancyReason": "amount" | "currency",
   "paid": boolean,
   "dueInDays": number,
   "approval": {
      "requester": "string",
      "requesterEmployeeKey": "string",
      "groups": [
        {
          "id": "string",
          "mode": "sequential" | "parallel",
          "label": "string",
          "status": "pending" | "approved" | "rejected",
          "stages": [
            { "id": "string", "label": "string", "approverEmployeeKey": "string", "approverName": "string", "status": "pending" | "approved" | "rejected" }
          ]
        }
      ],
      "groupIndex": number,
      "status": "pending" | "approved" | "rejected",
      "history": [
        { "stage": "string", "by": "string", "at": "string", "action": "approved" | "rejected" | "limit_exceeded" | "reassigned" | "skipped" }
      ],
      "autonomy": boolean,
      "selfApproved": boolean
    },
   "createdAt": "string",
   "lastRemindedAt": "string",
   "rejection": { "reasonCode": "amount_incorrect" | "not_ordered_or_not_received" | "duplicate" | "missing_or_wrong_po" | "wrong_billing_entity" | "other", "reason": "string", "at": "string" },
   "replacesInvoiceId": "string",
   "source": "po-flip" | "direct" | "manual" | "feed",
   "submittedFormat": "json" | "cxml" | "ubl",
   "submittedBy": "string",
   "externalInvoiceNumber": "string",
   "lineItems": [
      { "description": "string", "qty": number, "unitPrice": number, "discount": number, "charge": number, "amount": number }
   ],
   "adjustments": [
      { "type": "discount" | "charge", "description": "string", "amount": number }
   ],
   "taxAmount": number,
   "taxBreakdown": [ { "description": "string", "rate": number, "amount": number } ],
   "paymentCurrencyAmount": { "currencyCode": "string", "totalAmount": number, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "taxCurrencyAmount": { "currencyCode": "string", "amountBreakdown": { "taxes": { "totalAmount": number } }, "currencyExchangeDetails": { "rate": number, "rateDate": "string", "rateSource": "string" } },
   "baseCurrencyAmount": { "currencyCode": "string", "totalAmount": number },
   "rateWarnings": [
      { "object": "payment" | "tax", "currency": "string", "statedRate": number, "referenceRate": number, "source": "provider" | "override", "asOf": "string", "deviationPct": number }
   ],
   "withholdings": [ { "description": "string", "rate": number, "amount": number } ],
   "deductions": [ { "kind": "prepayment" | "credit", "description": "string", "amount": number, "reference": "string", "paidOn": "string", "sourceInvoiceId": "string", "stated": true } ],
   "invoiceKind": "prepayment",
   "creditNoteIds": [ "string" ],
   "creditApplications": [ { "id": "string", "creditNoteId": "string", "externalCreditNoteNumber": "string", "amount": number, "appliedAt": "string", "appliedByName": "string", "auto": true } ],
   "payment": { "status": "recorded", "method": "ach" | "wire" | "check" | "card" | "other" | "credit", "paymentDate": "string", "reference": "string", "paidAmount": { "amount": number, "currency": "string", "rate": number, "rateDate": "string" } },
   "remittances": [ { "id": "string", "sentAt": "string", "sentByName": "string", "note": "string", "file": { "fileName": "string", "contentType": "application/pdf" | "image/png" | "image/jpeg", "sizeBytes": number } } ]
}

Obtenir le fichier d’un avis de règlement

Renvoie un lien temporaire vers le justificatif de paiement d’un avis de règlement.

GET/v1/workspaces/{regionId}/invoices/{invoiceId}/remittances/{remittanceId}/file

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

  • remittanceIdstringObligatoire

    L’avis de règlement, par exemple "RM-1A2B3C4D", issu des remittances de la facture.

  • buyerstring

    Appelants fournisseurs uniquement, et seulement après un 409 *_ID_AMBIGUOUS : l’ID de l’espace de travail de l’acheteur (se terminant par .buyer) ou son id de région, tiré de la liste buyers du 409. Seul le document de cet acheteur est pris en compte ; s’il n’y en a pas, c’est un 404. Un ID d’espace de travail .supplier donne 400 BUYER_QUALIFIER_INVALID (« The buyer parameter must be one buyer's Workspace ID (ending in .buyer), from the buyers list in the 409 response. »). Ignoré pour un appelant acheteur.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Un lien, valable 5 minutes, vers le justificatif de paiement que porte un avis de règlement, ouvert dans le navigateur. Le fournisseur lit les avis de règlement que l’acheteur a envoyés sur sa propre facture ; même recherche que GetInvoice.

Erreurs

  • 404 Not Found - Aucune facture avec cet id, ou code REMITTANCE_NOT_FOUND : la facture n’a aucun avis de règlement avec cet id qui porte un fichier.
  • 409 Conflict - Appelants fournisseurs uniquement. Code INVOICE_ID_AMBIGUOUS : plusieurs de vos acheteurs détiennent une facture de votre part avec cet id (les id ne sont uniques qu’au sein d’un même acheteur), donc Pleaxy ne devine pas laquelle vous visez. Rien n’est lu ni modifié. Le champ buyers du corps liste l’ID de l’espace de travail et le nom de chaque acheteur : relancez l’appel avec ?buyer=<that Workspace ID>.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
GET /v1/workspaces/{regionId}/invoices/{invoiceId}/remittances/{remittanceId}/file
Requête
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/remittances/{remittanceId}/file" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 200 OK
{
   "url": "string",
   "fileName": "string",
   "contentType": "application/pdf" | "image/png" | "image/jpeg"
}

Obtenir un paiement Stripe

Renvoie l’état d’un paiement par carte ou par virement bancaire via Pleaxy (pas encore disponible).

GET/v1/workspaces/{regionId}/invoices/{invoiceId}/stripe-payment

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

Retour

200 OK avec l’objet présenté dans la réponse.

Plus de détails

Pas encore disponible : le paiement via Pleaxy n’est pas activé, donc cet appel répond available: false avec reason not_configured. Une fois activé, il indique si cette facture peut être payée via Pleaxy avec Stripe, ou pourquoi elle ne le peut pas, ainsi que tout paiement Stripe en cours. quote est ce que l’acheteur paierait : la facture plus les frais de virement bancaire de Stripe (0,8 %, plafonnés à 5 $), que l’acheteur prend en charge pour que le fournisseur reçoive le montant intégral de la facture.

Erreurs

  • 404 Not Found - Aucune facture avec cet id n’existe dans l’espace de travail.
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
GET /v1/workspaces/{regionId}/invoices/{invoiceId}/stripe-payment
Requête
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/stripe-payment" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 200 OK
{
   "available": boolean,
   "reason": "not_configured" | "not_approved" | "payment_locked" | "supplier_not_on_pleaxy" | "supplier_not_connected" | "unsupported_currency" | "amount_too_small",
   "state": "checkout_open" | "processing" | "succeeded",
   "paymentMethodType": "us_bank_account",
   "quote": { "amount": number, "fee": number, "total": number, "currency": "USD" }
}

Lancer un paiement Stripe

Lance le paiement d’une facture via Pleaxy (pas encore disponible).

POST/v1/workspaces/{regionId}/invoices/{invoiceId}/stripe-payment

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

  • confirmReplacedboolean

    true pour la payer malgré tout lorsque la facture est remplacée (avoir et refacturation) et que ses avoirs ne la couvrent pas entièrement.

Retour

201 Created avec l’objet présenté dans la réponse.

Plus de détails

Pas encore disponible : le paiement via Pleaxy n’est pas activé, donc cet appel répond 503. Une fois activé, il lance le paiement intégral d’une facture validée via Pleaxy, par virement bancaire américain avec Stripe, et renvoie l’url d’une page Stripe Checkout. Le paiement est effectué sur le propre compte Stripe du fournisseur : l’argent va du compte bancaire de l’acheteur au fournisseur sans jamais transiter par Pleaxy. L’acheteur paie la facture plus les frais de Stripe, pour que le fournisseur reçoive le montant intégral de la facture ; Pleaxy ne facture rien. La facture est verrouillée tant que Checkout est ouvert (jusqu’à une heure) et marquée payée lorsque Stripe confirme le virement. Reprend un Checkout ouvert ; répond { state } sans url lorsqu’un paiement est déjà en cours de traitement ou terminé.

Une session connectée avec l’accès 'edit' aux factures ; une clé API reçoit 403 HUMAN_SESSION_REQUIRED. Les mêmes règles de séparation des tâches que pour RecordPayment.

Erreurs

  • 403 Forbidden - Code HUMAN_SESSION_REQUIRED, ou un refus au titre de la séparation des tâches.
  • 409 Conflict - Code PAYMENT_ALREADY_RECORDED, PAYMENT_ACTIVE (exportée ou enregistrée : retirez d’abord cet export ou cet enregistrement), REPLACED_UNCREDITED (la facture est remplacée et ses avoirs ne la couvrent pas entièrement : ajoutez ?confirmReplaced=true pour la payer malgré tout) ou PAYMENT_CHANGED.
  • 422 Unprocessable Entity - Code STRIPE_SUPPLIER_NOT_ON_PLEAXY, STRIPE_SUPPLIER_NOT_CONNECTED, STRIPE_UNSUPPORTED_CURRENCY ou STRIPE_AMOUNT_TOO_SMALL.
  • 503 Service Unavailable - Le paiement via Pleaxy n’est pas activé (« Paying suppliers through Pleaxy isn't available yet. »).
  • 401 Unauthorized - Aucun identifiant n’a été fourni, ou la valeur du jeton Bearer / de X-Api-Key est manquante, invalide, expirée ou révoquée.
  • 403 Forbidden - Le jeton Bearer ou la clé API de l’appelant ne donne pas accès à cet espace de travail (regionId), ou n’a pas le rôle requis.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/stripe-payment
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/stripe-payment" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 201 Created
{
   "url": "string",
   "state": "checkout_open" | "processing" | "succeeded"
}

Régler une facture

Supprimé : utilisez plutôt RecordPayment.

POST/v1/workspaces/{regionId}/invoices/{invoiceId}/settle

Paramètres

  • invoiceIdstringObligatoire

    L’identifiant de la facture.

Retour

410 Gone avec l’objet présenté dans la réponse.

Plus de détails

Supprimé. Répond toujours 410 SETTLE_REPLACED et ne change rien. Enregistrez un paiement effectué en dehors de Pleaxy avec RecordPayment.

Modifié le 2026-09-24, correctif de sécurité au sein de la v1 : le règlement a d’abord été limité aux sessions connectées, puis supprimé ; il n’a jamais rien payé.

Erreurs

  • 410 Gone - Code SETTLE_REPLACED, toujours.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/settle
Requête
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/settle" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Réponse · 410 Gone
{
   "statusCode": 410,
   "error": "Gone",
   "code": "SETTLE_REPLACED",
   "message": "string",
   "messageId": "invoices.settleReplaced",
   "params": { }
}
Nous contacter