Riferimento API

Fatture

Le fatture dei fornitori agli acquirenti, dall’arrivo alla riconciliazione, all’approvazione e al pagamento.

Altro su questa risorsa

La fattura di un fornitore viene creata trasformando un ordine d’acquisto (source: "po-flip") o inserendola per un acquirente collegato (source: "manual", vedi CreateInvoice), oppure il fornitore la invia dal proprio sistema di fatturazione con una chiave API (source: "feed", vedi SubmitFeedInvoice) una volta che quell’acquirente attiva le fatture automatiche. Anche un acquirente può registrarne una direttamente (source: "direct", vedi SubmitInvoice), in JSON, cXML (InvoiceDetailRequest) o UBL 2.1 (<Invoice>). Ogni fattura risiede nel workspace dell’acquirente e passa per riconciliazione, approvazione e saldo. Una fattura è "pending" quando esiste un dato di consumo reale con cui riconciliarla: un OdA e una connessione di fatturazione attiva per il provider dell’OdA con una fattura sincronizzata. usageAmount, usageCurrency e tolerancePct sono presenti solo in quel caso, e sul risultato "matched" o "discrepancy". Altrimenti è "unverified", con unverifiedReason "no_purchase_order" o "no_billing_connection" (solo nella vista acquirente; assente sulle fatture meno recenti, che valgono come "no_purchase_order"), oppure "debit_note" per una nota di debito sull’OdA di un provider cloud, che si aggiunge a una fattura già emessa e quindi non può essere confrontata con la fattura del mese. Un chiamante Fornitore vede matchStatus così com’è, ma mai unverifiedReason né i campi di consumo. Una fattura non verificata non viene mai riconciliata né approvata automaticamente: una persona la esamina con ResolveInvoiceDiscrepancy.

Elencare le fatture

Elenca le fatture e, facoltativamente, le note di credito e di debito.

GET/v1/workspaces/{regionId}/invoices

Parametri

  • fromstring

    Data/timestamp ISO 8601: vengono restituiti solo gli elementi creati in questo momento o dopo.

  • tostring

    Data/timestamp ISO 8601: vengono restituiti solo gli elementi creati in questo momento o prima.

  • documentTypestring

    Per impostazione predefinita, ciò che si paga: le fatture e le note di debito che le rettificano. invoice (solo fatture), debit_note, credit_note (gli stessi elementi di ListCreditNotes), oppure all (tutti i tipi, dal più recente). Ogni elemento riporta documentType. Qualsiasi altro valore restituisce 400 DOCUMENT_TYPE_INVALID.

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

Elenca le fatture, senza un ordine particolare, oppure, con documentType, le note di credito o entrambe: fatture e note di credito sono un’unica risorsa di documenti, e ogni elemento indica in documentType di quale si tratta. Un chiamante Acquirente riceve le fatture ricevute dal suo workspace; un chiamante Fornitore riceve le fatture che ha emesso verso gli acquirenti collegati, in qualunque workspace acquirente si trovino. Con from/to puoi limitarle a un intervallo di createdAt: passa i limiti di un mese di calendario per avere una vista mensile. Un chiamante Fornitore riceve una vista ridotta di ogni fattura (vedi GetInvoice): i dettagli interni di riconciliazione dell’acquirente e il flusso di approvazione completo non vengono restituiti.

Errori

  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
GET /v1/workspaces/{regionId}/invoices
Richiesta
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Risposta · 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 } } ]
   }
]

Recuperare una fattura

Recupera una fattura.

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura, o quello di una nota di credito (CN-…).

  • buyerstring

    Solo per i chiamanti Fornitore, e solo dopo un 409 *_ID_AMBIGUOUS: l’ID del workspace dell’acquirente (che termina con .buyer) o il suo id di regione, preso dall’elenco buyers del 409. Viene considerato solo il documento di quell’acquirente; se lì non c’è, la risposta è 404. Un ID del workspace .supplier restituisce 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."). Ignorato per un chiamante Acquirente.

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

Recupera una singola fattura tramite id oppure, dato l’id di una nota di credito (CN-…), quella nota di credito, con la struttura di GetCreditNote; documentType indica quale delle due. Per un chiamante Acquirente, regionId è il workspace della fattura stessa. Per un chiamante Fornitore, regionId è il workspace del fornitore stesso e la fattura viene cercata tra le fatture in uscita dell’organizzazione, indipendentemente dal workspace acquirente in cui si trova: la stessa ricerca usata da ListSupplierWorkspace. GET …/invoices/{invoiceId}/pdf accetta lo stesso parametro di query buyer.

Campi della risposta

  • replacesInvoiceIdsArray<string>

    Storno e rifatturazione: le fatture e le note di debito che questa fattura sostituisce. Assente se non ce ne sono.

  • replacedByInvoiceIdsArray<string>

    Le fatture che sostituiscono questa. Assente se non ce ne sono.

  • replacementobject

    Solo per l’acquirente e solo nella lettura di una singola fattura, su una fattura sostituita che non è stata rifiutata: creditedInFull e uncredited, cioè il suo importo meno le note di credito accettate e in attesa, nella sua valuta. Finché uncredited è superiore a 0, pagare sia questa sia la fattura che la sostituisce significa pagare due volte, e RecordPayment, StartStripePayment ed ExportInvoicesForPayment chiedono confirmReplaced.

  • uncreditedOriginalsArray

    Solo per l’acquirente e solo nella lettura di una singola fattura, su una fattura sostitutiva: le fatture che sostituisce non interamente coperte dalle relative note di credito. Assente se non ce ne sono.

Errori

  • 404 Not Found - Nel workspace del chiamante non esiste alcuna fattura con questo id.
  • 409 Conflict - Solo per i chiamanti Fornitore. Codice INVOICE_ID_AMBIGUOUS: più di uno dei tuoi acquirenti ha una tua fattura con questo id (gli id sono univoci solo all’interno di un acquirente), quindi Pleaxy non tira a indovinare quale intendi. Nulla viene letto o modificato. Il campo buyers del corpo elenca l’ID del workspace e il nome di ogni acquirente: ripeti la chiamata con ?buyer=<quell’ID del workspace>.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
GET /v1/workspaces/{regionId}/invoices/{invoiceId}
Richiesta
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Risposta · 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 } } ]
}

Recuperare l’attività di una fattura

Restituisce la cronologia di una fattura, dalla voce meno recente.

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

  • buyerstring

    Solo per i chiamanti Fornitore, e solo dopo un 409 *_ID_AMBIGUOUS: l’ID del workspace dell’acquirente (che termina con .buyer) o il suo id di regione, preso dall’elenco buyers del 409. Viene considerato solo il documento di quell’acquirente; se lì non c’è, la risposta è 404. Un ID del workspace .supplier restituisce 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."). Ignorato per un chiamante Acquirente.

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

La cronologia di una fattura, dalla voce meno recente: l’arrivo, i controlli e le riconciliazioni eseguiti, i passaggi di approvazione, il rifiuto, i pagamenti, i solleciti e i commenti. Ogni voce ha un kind e dati strutturati, mai una frase, così puoi formularla tu. La maggior parte delle voci viene letta dalla fattura stessa, quindi anche una fattura meno recente ha una cronologia. Un chiamante Fornitore riceve solo l’arrivo della fattura, il suo esito, i pagamenti registrati, i solleciti e i commenti condivisi.

Campi della risposta

  • idstring

    Stabile per la stessa cronologia, così puoi capire quali voci hai già visto.

  • kind, datastring, object

    received: data.source, enteredBy, submittedFormat, fileName. corrects: data.invoiceId, la fattura rifiutata che sostituisce. control_findings (solo acquirente): data.codes. match (solo acquirente): data.result (matched, discrepancy o unverified) e data.reason. sent_for_approval (solo acquirente): data.from (discrepancy o unverified). approval (solo acquirente): data.action, data.stage e data.to per una riassegnazione. approved. rejected: data.reasonCode e data.reason. payment: data.action, method, paymentDate, reference. reminder: data.autonomy quando il workspace l’ha inviato in autonomia. comment: il commento stesso, in comment.

Errori

  • 404 Not Found - Nel workspace del chiamante non esiste alcuna fattura con questo id.
  • 409 Conflict - Solo per i chiamanti Fornitore. Codice INVOICE_ID_AMBIGUOUS: più di uno dei tuoi acquirenti ha una tua fattura con questo id (gli id sono univoci solo all’interno di un acquirente), quindi Pleaxy non tira a indovinare quale intendi. Nulla viene letto o modificato. Il campo buyers del corpo elenca l’ID del workspace e il nome di ogni acquirente: ripeti la chiamata con ?buyer=<quell’ID del workspace>.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
GET /v1/workspaces/{regionId}/invoices/{invoiceId}/activity
Richiesta
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/activity" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Risposta · 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
         }
      }
   ]
}

Elencare i commenti di una fattura

Elenca i commenti di una fattura.

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

  • buyerstring

    Solo per i chiamanti Fornitore, e solo dopo un 409 *_ID_AMBIGUOUS: l’ID del workspace dell’acquirente (che termina con .buyer) o il suo id di regione, preso dall’elenco buyers del 409. Viene considerato solo il documento di quell’acquirente; se lì non c’è, la risposta è 404. Un ID del workspace .supplier restituisce 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."). Ignorato per un chiamante Acquirente.

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

I commenti di una fattura, dal meno recente: quelli interni della tua parte e tutti quelli condivisi. Un commento eliminato dal suo autore resta nella conversazione con il corpo vuoto, così mostra comunque che qualcosa è stato detto e quando. Stessa ricerca di GetInvoice, quindi un fornitore raggiunge le fatture che ha emesso.

Campi della risposta

  • visibilitystring

    internal: solo la parte dell’autore. shared: lo leggono sia l’acquirente sia il fornitore.

  • authorKey, mentionsstring, Array

    Solo sui commenti della tua parte: chi l’ha scritto, per chiave dipendente, e chi ha menzionato. L’altra parte vede authorName e authorOrgName.

  • bodystring

    Testo semplice con i suoi a capo. Vuoto una volta eliminato dall’autore; in tal caso deletedAt indica quando.

  • viewerIsAuthorboolean

    Se l’ha scritto il chiamante, che quindi può eliminarlo. Sempre false per una chiave API.

Errori

  • 404 Not Found - Nel workspace del chiamante non esiste alcuna fattura con questo id.
  • 409 Conflict - Solo per i chiamanti Fornitore. Codice INVOICE_ID_AMBIGUOUS: più di uno dei tuoi acquirenti ha una tua fattura con questo id (gli id sono univoci solo all’interno di un acquirente), quindi Pleaxy non tira a indovinare quale intendi. Nulla viene letto o modificato. Il campo buyers del corpo elenca l’ID del workspace e il nome di ogni acquirente: ripeti la chiamata con ?buyer=<quell’ID del workspace>.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
GET /v1/workspaces/{regionId}/invoices/{invoiceId}/comments
Richiesta
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/comments" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Risposta · 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
      }
   ]
}

Aggiungere un commento a una fattura

Aggiunge un commento a una fattura.

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

  • buyerstring

    Solo per i chiamanti Fornitore, e solo dopo un 409 *_ID_AMBIGUOUS: l’ID del workspace dell’acquirente (che termina con .buyer) o il suo id di regione, preso dall’elenco buyers del 409. Viene considerato solo il documento di quell’acquirente; se lì non c’è, la risposta è 404. Un ID del workspace .supplier restituisce 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."). Ignorato per un chiamante Acquirente.

Corpo

  • bodystringObbligatorio

    Testo semplice, fino a 2.000 caratteri. Gli a capo vengono mantenuti; i caratteri di controllo, di testo bidirezionale e invisibili vengono rimossi.

  • visibility"internal" | "shared"Obbligatorio

    internal: solo il tuo team. shared: anche l’altra parte lo legge e risponde. I commenti di un fornitore sono sempre condivisi.

  • mentionsstring[]

    Fino a 10 chiavi dipendente di persone del tuo workspace da notificare (vedi ListEmployees). La notifica non contiene mai il testo del commento.

Restituisce

201 Created con l’oggetto mostrato nella risposta.

Più dettagli

Commenta una fattura: interno al tuo team oppure condiviso con l’altra parte, ad esempio un acquirente che chiede al fornitore di una riga. I commenti non vengono mai modificati. Ricevono una notifica (invoice_comment) le persone che menzioni, chi ha già commentato dalla tua parte e, per un commento condiviso, l’altra parte; la notifica non contiene mai il testo.

Solo sessione con accesso effettuato. Una chiave API riceve 403 HUMAN_SESSION_REQUIRED.

Errori

  • 400 Bad Request - Un corpo vuoto ("Write something before you post the comment."), più di 2.000 caratteri, più di 10 menzioni, una menzione di qualcuno che non è nel tuo workspace, una visibilità diversa da internal o shared, un commento interno di un fornitore ("A supplier's comments are always shared with the buyer."), oppure un commento condiviso su un documento il cui fornitore non è su Pleaxy (pubblicalo invece come internal).
  • 403 Forbidden - Codice HUMAN_SESSION_REQUIRED: il chiamante è una chiave API ("Comments are written by people. Sign in to Pleaxy to post one.").
  • 404 Not Found - Nel workspace del chiamante non esiste alcuna fattura con questo id.
  • 409 Conflict - Solo per i chiamanti Fornitore. Codice INVOICE_ID_AMBIGUOUS: più di uno dei tuoi acquirenti ha una tua fattura con questo id (gli id sono univoci solo all’interno di un acquirente), quindi Pleaxy non tira a indovinare quale intendi. Nulla viene letto o modificato. Il campo buyers del corpo elenca l’ID del workspace e il nome di ogni acquirente: ripeti la chiamata con ?buyer=<quell’ID del workspace>.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/comments
Richiesta
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" ]
}
Risposta · 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
}

Eliminare un commento di una fattura

Elimina uno dei tuoi commenti su una fattura.

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

  • commentIdstringObbligatorio

    Il commento, ad es. "CMT-1760313600000-3f9a1c2e".

  • buyerstring

    Solo per i chiamanti Fornitore, e solo dopo un 409 *_ID_AMBIGUOUS: l’ID del workspace dell’acquirente (che termina con .buyer) o il suo id di regione, preso dall’elenco buyers del 409. Viene considerato solo il documento di quell’acquirente; se lì non c’è, la risposta è 404. Un ID del workspace .supplier restituisce 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."). Ignorato per un chiamante Acquirente.

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

Ritira un tuo commento: il testo viene rimosso e la conversazione conserva il fatto che un commento è stato scritto. Eliminarlo di nuovo non cambia nulla.

Solo sessione con accesso effettuato. Una chiave API riceve 403 HUMAN_SESSION_REQUIRED.

Errori

  • 403 Forbidden - Codice HUMAN_SESSION_REQUIRED: il chiamante è una chiave API ("Comments are written by people. Sign in to Pleaxy to post one.").
  • 403 Forbidden - Il commento non è tuo ("Only the person who wrote a comment can delete it.").
  • 404 Not Found - Nessun commento con questo id visibile a te su questo documento ("Comment {commentId} not found."), oppure il documento non esiste.
  • 409 Conflict - Solo per i chiamanti Fornitore. Codice INVOICE_ID_AMBIGUOUS: più di uno dei tuoi acquirenti ha una tua fattura con questo id (gli id sono univoci solo all’interno di un acquirente), quindi Pleaxy non tira a indovinare quale intendi. Nulla viene letto o modificato. Il campo buyers del corpo elenca l’ID del workspace e il nome di ogni acquirente: ripeti la chiamata con ?buyer=<quell’ID del workspace>.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
DELETE /v1/workspaces/{regionId}/invoices/{invoiceId}/comments/{commentId}
Richiesta
curl -X DELETE "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/comments/{commentId}" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Risposta · 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
}

Inviare una fattura

Registra il documento di fattura di un fornitore, in JSON, cXML o UBL.

POST/v1/workspaces/{regionId}/invoices

Corpo

  • invoiceNumberstring

    Numero di fattura fornito dal fornitore, usato per deduplicare gli invii ripetuti all’interno della regione.

  • poIdstring

    Id dell’OdA Pleaxy evaso da questa fattura, ad es. "PO-AB12CD34". Omettilo per inviare una fattura autonoma.

  • supplierstringObbligatorio

    Nome visualizzato del fornitore / della controparte.

  • amountnumberObbligatorio

    Totale della fattura. Deve essere maggiore di 0.

  • currencystring

    Codice ISO 4217 (qui, oppure come currencyID di UBL / Money currency di cXML). Deve essere la valuta della regione, e una fattura relativa a un OdA deve essere nella valuta dell’OdA. Pleaxy non converte le valute.

  • dueInDaysnumber

    Termini di pagamento in giorni. Per impostazione predefinita, i termini di pagamento predefiniti del contratto a cui fa capo l’OdA, altrimenti 30.

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

    Ripartizione facoltativa della fattura per righe.

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

    Una riga di IA: cosa fattura e il mese di utilizzo (YYYY-MM; se omesso, il mese precedente a invoiceDate), con qty nell’unità del contatore (milioni di token, ore). Ogni riga di IA viene abbinata alla riga di IA dell’ordine con lo stesso ambito e confrontata con la condizione contrattuale, il listino e il report di utilizzo del provider; ciò che viola compare come rilievi ai_*.

  • poLineNonumber

    Con poId: la riga dell’OdA fatturata da questa fattura, come in CreateInvoice. I documenti XML la indicano invece per ogni riga (UBL cac:OrderLineReference/cbc:LineID, cXML InvoiceDetailItemReference@lineNumber).

  • billsNoPoLineboolean

    Con poId: true quando la fattura non fattura nessuna delle righe dell’OdA, come in CreateInvoice. Non insieme a poLineNo.

  • remittanceInstructionsobject

    Dove l’acquirente deve pagare, memorizzato con la fattura e mai modificato in seguito: { method, payeeName, bankName?, iban?, accountNumber?, bic?, routingNumber?, mailingAddress?, paymentReference?, notes? }. method è bank_transfer (richiede iban o accountNumber), wire (iban o accountNumber, più bic o routingNumber), ach (accountNumber e un routingNumber ABA di 9 cifre), check (mailingAddress) oppure other (notes). Pleaxy non lo verifica mai; l’acquirente viene avvisato quando il beneficiario o il conto differiscono da quelli della fattura precedente di questo fornitore.

  • pdfBase64string

    PDF della fattura codificato in Base64.

Restituisce

201 Created con l’oggetto mostrato nella risposta.

Più dettagli

Operazione dell’acquirente: registra direttamente il documento di fattura di un fornitore, senza una precedente trasformazione di un OdA creato in Pleaxy. Un corpo JSON con un connectionId è invece CreateInvoice. Il corpo JSON qui sotto (supplier e amount, senza connectionId) è deprecato e accettato fino alla v2. Un chiamante Fornitore riceve 400 SUPPLIER_DIRECT_INVOICE_RETIRED: una fattura inviata in questo modo non raggiungeva alcun acquirente; i fornitori usano invece CreateInvoice o FlipPurchaseOrderToInvoice. Accetta tre formati di richiesta, scelti in base al Content-Type: application/json (un corpo CreateInvoiceDto), oppure application/xml / text/xml contenente un InvoiceDetailRequest cXML o un documento Invoice UBL 2.1 (rilevato automaticamente dall’XML analizzato). Se viene indicato poId, viene convalidato rispetto a un OdA esistente nello stato awaiting_fulfillment e la fattura è "pending" quando esiste un dato di fatturazione attivo per il provider dell’OdA, altrimenti "unverified" con unverifiedReason "no_billing_connection"; se omesso, la fattura parte come "unverified" con unverifiedReason "no_purchase_order". Un documento XML riceve la stessa mappatura di sconti, maggiorazioni e imposte, lo stesso rifiuto delle righe negative e la stessa quadratura dei totali di SubmitFeedInvoice, e un errore restituisce 400 INVOICE_DOCUMENT_INVALID. Il corpo JSON è invariato.

Solo per i chiamanti Acquirente: chiama con una sessione con accesso effettuato o con una X-Api-Key con ambiti limitati di un workspace acquirente (vedi Chiavi API). I chiamanti Fornitore ricevono sempre 400. Usa invece CreateInvoice.

Campi della risposta

  • idstring

    Identificativo della fattura. "INV-<PO suffix>" quando è stato indicato poId, altrimenti un "INV-XXXXXXXX" casuale.

  • matchStatusstring

    "pending" se è stato indicato poId ed esiste un dato di fatturazione attivo per il suo provider, altrimenti "unverified".

  • unverifiedReasonstring

    Impostato quando matchStatus è "unverified": "no_purchase_order" o "no_billing_connection".

  • currencystring

    La valuta in cui è registrata la fattura, in maiuscolo.

  • sourcestring

    Sempre "direct" per questo endpoint.

  • submittedFormatstring

    "json", "cxml" o "ubl", in base al Content-Type della richiesta.

Errori

  • 400 Bad Request (SUPPLIER_DIRECT_INVOICE_RETIRED) - Il chiamante è un Fornitore. Restituito per ogni tipo di contenuto e credenziale, prima che il corpo venga analizzato come fattura o convalidato, e nulla viene memorizzato. Si applica comunque prima il limite di dimensione della richiesta, e un corpo che non è JSON valido riceve il 400 generico del parser JSON. Vedi ListInvoiceCounterparties e CreateInvoice.
  • 400 Bad Request - amount non è maggiore di zero, il corpo JSON non supera la convalida, l’OdA indicato non è nello stato awaiting_fulfillment, il corpo XML non è cXML/UBL riconoscibile o contiene una dichiarazione DOCTYPE o di entità (INVOICE_DOCUMENT_INVALID; il riferimento al DTD esterno standard di cXML è consentito), oppure la valuta della fattura non può essere accettata: non è la valuta della regione ("This invoice is in GBP, but Europe is invoiced in EUR. Ask the supplier to reissue it in EUR - Pleaxy doesn't convert currencies."), o non è quella dell’OdA indicato ("This invoice is in GBP, but PO-AB12CD34 is in EUR. Ask the supplier to reissue it in EUR - Pleaxy doesn't convert currencies."). I due rifiuti per valuta riportano il codice INVOICE_CURRENCY_MISMATCH e INVOICE_PO_CURRENCY_MISMATCH.
  • 404 Not Found - È stato indicato poId, ma nel workspace non esiste alcun OdA con quell’id.
  • 409 Conflict - invoiceNumber è già stato usato da un’altra fattura in questo workspace, oppure l’OdA indicato ha già una fattura.
  • 415 Unsupported Media Type - L’header Content-Type è diverso da application/json, application/xml o text/xml.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure il ruolo procurement di un chiamante Acquirente non ha l’accesso 'create' alle fatture: ce l’hanno solo administrator e finance ("Your procurement role ('read-only') doesn't have 'create' access to 'invoices'"; a una chiave API viene anche detto di rigenerarsi con un ruolo che lo concede). Con un regionId senza suffisso, un chiamante che ha entrambi i profili viene trattato come Acquirente; usa l’ID del workspace .supplier per agire come Fornitore.
POST /v1/workspaces/{regionId}/invoices
Richiesta
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"
  }'
Risposta · 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"
}

Elencare le controparti di fatturazione

Elenca chi puoi fatturare o da chi puoi ricevere fatture.

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

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

Le controparti attive che il chiamante può fatturare tramite CreateInvoice: per un chiamante Acquirente i suoi fornitori approvati, per un chiamante Fornitore gli acquirenti che lo hanno approvato. Ogni voce riporta l’id di connessione da passare come connectionId, la valuta dell’acquirente e gli ordini d’acquisto aperti tra esattamente quella coppia.

Solo sessione con accesso effettuato. Una chiave API riceve 403.

Campi della risposta

  • connectionIdstring

    La connessione fornitore da fatturare: il connectionId di CreateInvoice.

  • namestring

    Il nome della controparte: quello del fornitore per un chiamante Acquirente, quello dell’acquirente per un chiamante Fornitore.

  • currencystring

    La valuta dell’acquirente. Ogni fattura a questa controparte viene registrata in essa.

  • openPurchaseOrdersArray

    Ordini d’acquisto in attesa di evasione con un importo ancora da fatturare, tra esattamente questo acquirente e questo fornitore: i poIds accettati da CreateInvoice. invoicedAmount è quanto hanno già assorbito le fatture precedenti, al netto delle imposte (assente se nessuna). lines sono le righe dell’OdA che una fattura può fatturare (il suo poLineNo): l’importo di ciascuna e quanto ne hanno già assorbito le fatture precedenti (consumed), al netto delle imposte. defaultDueInDays sono i termini di pagamento predefiniti del contratto a cui fa capo l’OdA, per precompilare il dueInDays di una fattura (assente se non ne ha). billToCompanyName è l’azienda che il fornitore dell’OdA fattura (il suo billToParty; assente sugli OdA meno recenti). paidDeposits sono le fatture pagate sull’OdA che una fattura può ancora detrarre come acconto (deductions[].sourceInvoiceId): quanto era dovuto per ciascuna e quanto non è ancora detratto da alcuna fattura, imposte incluse (assente se non ce ne sono).

  • invoiceFeedEnabledboolean

    Solo per i chiamanti Acquirente: true quando le fatture automatiche di questo fornitore sono attive (vedi SetInvoiceFeed). Attive dall’approvazione; se assente, sono disattivate.

  • invoiceFeedUpdatedAtstring

    Solo per i chiamanti Acquirente: quando le fatture automatiche sono state attivate o disattivate l’ultima volta. Assente se mai.

  • feedReadinessstring

    Solo per i chiamanti Acquirente con ?perConnection=true: lo stato delle fatture automatiche di questa connessione: "off" (l’interruttore), "untested" (nulla è ancora passato), "tested" (una chiamata ValidateFeedInvoice è passata), "live" (almeno una fattura accettata). La vista del fornitore (ListSupplierConnections) può riportare anche "no_key" e "not_connected".

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

    Solo per i chiamanti Acquirente con ?perConnection=true: il riflesso del registro dei tentativi (ListFeedAttempts), una volta che il feed è stato chiamato.

Errori

  • 403 Forbidden - Il chiamante si è autenticato con una chiave API invece che con una sessione con accesso effettuato ("This action requires a logged-in user session, not an API key"), la sua credenziale non dà accesso a questo workspace, oppure il ruolo procurement di un chiamante Acquirente non può creare fatture.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
GET /v1/workspaces/{regionId}/invoices/counterparties
Richiesta
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/counterparties" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Risposta · 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"
      }
   ]
}

Creare una fattura

Crea una fattura per un acquirente o un fornitore collegato.

POST/v1/workspaces/{regionId}/invoices

Corpo

  • documentTypestring

    invoice (il valore predefinito), debit_note o credit_note. Con credit_note il resto del corpo è quello di CreateCreditNote (un campo sconosciuto restituisce 400) e la risposta è la nota di credito. Con debit_note è una fattura che rettifica in aumento un’altra fattura: indica amendsInvoiceId (o amendsInvoiceNumber, il numero del fornitore); connectionId può essere omesso. Prende la controparte, l’OdA, la riga dell’OdA e la valuta dell’originale (un altro OdA o un’altra valuta restituisce 400 DEBIT_NOTE_INVALID), assorbe saldo dell’OdA e viene approvata e pagata come qualsiasi fattura. Viene riconciliata con l’OdA, tranne sull’OdA di un provider cloud, dove parte come unverified con unverifiedReason "debit_note" perché una persona la esamini. L’originale deve essere una fattura di questo fornitore a questo acquirente (altrimenti 404 DEBIT_NOTE_ORIGINAL_NOT_FOUND), non rifiutata e non a sua volta una nota di debito. Qualsiasi altro valore restituisce 400 DOCUMENT_TYPE_INVALID.

  • amendsInvoiceIdstring

    Solo per le note di debito: l’id Pleaxy della fattura che rettifica.

  • amendsInvoiceNumberstring

    Solo per le note di debito: il numero del fornitore della fattura che rettifica, quando l’id Pleaxy non è noto.

  • replacesInvoiceIdsArray<string>

    Una fattura sostitutiva (storno e rifatturazione: il fornitore storna integralmente delle fatture e le rifattura): gli id Pleaxy delle fatture e delle note di debito che sostituisce, da 1 a 20, tutte di questo fornitore. Può fatturare un ordine d’acquisto o una valuta diversi dai loro. Ogni originale la elenca poi in replacedByInvoiceIds. Una fattura sconosciuta o di un altro fornitore restituisce 404 REPLACES_NOT_FOUND; una nota di credito, o sostituzioni su una nota di debito, restituiscono 400 REPLACES_INVALID.

  • replacesInvoiceNumbersArray<string>

    Una fattura sostitutiva: i numeri del fornitore delle fatture che sostituisce, quando gli id Pleaxy non sono noti. Da 1 a 20.

  • connectionIdstringObbligatorio

    La controparte da fatturare: un connectionId di ListInvoiceCounterparties.

  • poIdstring

    Un ordine d’acquisto aperto tra esattamente questo acquirente e questo fornitore, preso da openPurchaseOrders della controparte.

  • invoiceNumberstringObbligatorio

    Da 1 a 64 caratteri: lettere, cifre, '.', '_', '/' e '-', a partire da una lettera o una cifra. Univoco per fornitore all’interno del workspace dell’acquirente, senza distinzione tra maiuscole e minuscole.

  • invoiceDatestringObbligatorio

    YYYY-MM-DD. Non nel futuro e non più di 365 giorni prima.

  • dueInDaysnumber

    Termini di pagamento in giorni, da 0 a 365. Per impostazione predefinita, i termini di pagamento predefiniti del contratto a cui fa capo l’OdA (defaultDueInDays di ListInvoiceCounterparties), altrimenti 30.

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

    Da 1 a 100 righe. description ha da 1 a 200 caratteri, qty è maggiore di 0 e al massimo 1.000.000, unitPrice va da 0 a 1.000.000.000. Una riduzione è uno sconto, mai un prezzo negativo: un unitPrice negativo restituisce 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 e charge sono totali facoltativi per la riga, pari o superiori a 0 e con non più cifre decimali di quante la valuta dell’acquirente ne consenta (2 per USD ed EUR, nessuna per JPY: altrimenti 400, ad es. "taxAmount must be a whole number in JPY."), e lo sconto della riga non può superare qty × unitPrice + charge. null non è accettato: ometti un campo che non si applica. Il totale al netto degli sconti deve essere maggiore di 0, e il totale al massimo 1.000.000.000.000.000. La riga dell’OdA fatturata viene indicata una sola volta, sulla fattura (poLineNo o billsNoPoLine), mai sulle sue righe: il poLineNo o billsNoPoLine di una singola riga viene ignorato. Indica spedizione e gestione in adjustments anziché come riga.

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

    Una riga di IA: cosa fattura e il mese di utilizzo (YYYY-MM; se omesso, il mese precedente a invoiceDate), con qty nell’unità del contatore (milioni di token, ore). Ogni riga di IA viene abbinata alla riga di IA dell’ordine con lo stesso ambito e confrontata con la condizione contrattuale, il listino e il report di utilizzo del provider; ciò che viola compare come rilievi ai_*.

  • poLineNonumber

    Con poId: la riga dell’OdA fatturata da questa fattura, tramite il suo lineNo (da GetPurchaseOrder o da openPurchaseOrders[].lines di ListInvoiceCounterparties). Una fattura fattura una sola riga dell’OdA, e tutte le sue righe vengono confrontate con essa; per fatturare più righe dell’OdA, invia una fattura per ciascuna. Le righe non vengono mai abbinate alle righe dell’OdA in base alla descrizione. Su un OdA con una sola riga, una fattura che non la indica fattura quella riga. Su un OdA con più righe, una fattura che non ne indica nessuna è una "discrepancy" (po_line_unassigned) che una persona deve risolvere, perché non è stato possibile verificare il limite né il prezzo di alcuna riga. Un lineNo che l’OdA non ha restituisce 400 INVOICE_PO_LINE_UNKNOWN. Non insieme a billsNoPoLine (400 INVOICE_PO_LINE_CONTRADICTORY). Una nota di debito che non la indica prende quella dell’originale.

  • billsNoPoLineboolean

    Con poId: true quando la fattura non fattura nessuna delle righe dell’OdA, ad esempio un extra non ordinato o un costo una tantum. Assorbe solo il saldo dell’OdA, e la fattura non viene mai approvata automaticamente. Non insieme a poLineNo.

  • adjustmentsArray<{ type, description, amount }>

    Sconti e maggiorazioni a livello di fattura, al netto delle imposte. Al massimo 20. type è "discount" o "charge"; description ha da 1 a 200 caratteri, memorizzata senza caratteri di controllo, a capo o controlli di testo bidirezionale; amount è un valore positivo, pari o superiore a 0,01 e con non più cifre decimali di quante la valuta dell’acquirente ne consenta (il segno è dato da type).

  • taxAmountnumber

    Imposta totale della fattura, come indicata dal fornitore. È inclusa nel totale della fattura. Pleaxy non calcola le imposte. Pari o superiore a 0, con non più cifre decimali di quante la valuta dell’acquirente ne consenta. Omettila quando la fattura non indica imposte; null viene rifiutato.

  • currencystring

    ISO 4217, facoltativo. Solo verificato: deve essere la valuta dell’acquirente, che è sempre quella memorizzata.

  • pdfBase64string

    PDF della fattura codificato in Base64, fino a 8MB.

  • remittanceInstructionsobject

    Dove l’acquirente deve pagare, memorizzato con la fattura e mai modificato in seguito: { method, payeeName, bankName?, iban?, accountNumber?, bic?, routingNumber?, mailingAddress?, paymentReference?, notes? }. method è bank_transfer (richiede iban o accountNumber), wire (iban o accountNumber, più bic o routingNumber), ach (accountNumber e un routingNumber ABA di 9 cifre), check (mailingAddress) oppure other (notes). Pleaxy non lo verifica mai; l’acquirente viene avvisato quando il beneficiario o il conto differiscono da quelli della fattura precedente di questo fornitore.

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

    Facoltativo. Le imposte che l’acquirente trattiene da quanto paga (retenciones, ad es. ISR retenido), nella valuta della fattura. Riducono l’importo dovuto, mai il totale né le sue imposte. Insieme alle detrazioni, devono essere inferiori al totale. Al massimo 20.

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

    Facoltativo. Quanto è già stato pagato sulla fattura, imposte incluse: kind "prepayment" per un deposito o un anticipo pagato dall’acquirente (richiede un riferimento, oppure sourceInvoiceId che indica una tua fattura pagata sullo stesso OdA, di cui vengono poi compilati riferimento e data di pagamento e che assorbe l’OdA una sola volta), oppure kind "credit" per un credito che hai applicato sulla fattura. Riducono l’importo dovuto, mai il totale né le sue imposte. Insieme alle ritenute, devono essere inferiori al totale; non insieme a paymentCurrencyAmount. Al massimo 20. UBL: cbc:PrepaidAmount; cXML: DepositAmount.

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

    Facoltativo. Le imposte per tipo nella valuta della fattura, ad es. [{ "description": "IVA", "rate": 21, "amount": 199.50 }, { "description": "Percepción IIBB", "amount": 28.50 }]. rate è una percentuale ed è facoltativo. La somma deve essere pari a taxAmount, che diventa allora obbligatorio (400 TAX_BREAKDOWN_MISMATCH). Al massimo 20. Solo a scopo di visualizzazione. UBL: i TaxSubtotals del TaxTotal nella valuta del documento, mantenuti quando la somma torna.

  • paymentCurrencyAmountobject

    Facoltativo. Solo quando la fattura indica l’importo dovuto in un’altra valuta (ad es. AWS che fattura in ARS a un cliente argentino); in tal caso totalAmount è l’importo dovuto, usato da debiti, pagamenti e registrazione del pagamento: { currencyCode, totalAmount, totalAmountBeforeTax?, amountBreakdown?: { subTotalAmount?, discounts?, fees?, taxes? }, currencyExchangeDetails: { rate, rateDate?, rateSource?, sourceCurrencyCode?, targetCurrencyCode? } }, la stessa struttura di PaymentCurrencyAmount di AWS Invoicing. rate significa 1 unità della valuta della fattura = rate currencyCode, come stampato sulla fattura. Omettilo quando la fattura viene convertita al cambio della data di pagamento. Ogni valore indicato deve rientrare nello 0,5% (o in un’unità minima) del valore della fattura × rate (400 STATED_AMOUNT_RATE_MISMATCH, che indica entrambi i valori), ogni ripartizione deve tornare con il proprio totale, e currencyCode non può essere la valuta della fattura stessa (400 SAME_CURRENCY). rateDate è YYYY-MM-DD, non nel futuro e al massimo un giorno dopo la data della fattura. UBL: cbc:PaymentCurrencyCode con cac:PaymentExchangeRate; cXML: Money@alternateCurrency/alternateAmount su DueAmount. Registrato come indicato; Pleaxy non converte nulla.

  • taxCurrencyAmountobject

    Facoltativo. Le imposte nella valuta legale del paese dell’acquirente, quando non è la valuta della fattura. Stessa struttura di paymentCurrencyAmount; amountBreakdown.taxes.totalAmount è obbligatorio e totalAmount è facoltativo. Richiede taxAmount. UBL: il cac:TaxTotal di cbc:TaxCurrencyCode con cac:TaxExchangeRate, oppure, senza di esso (EN 16931 BT-111), un cambio ricavato dai due totali delle imposte; cXML: Money@alternateAmount su Tax. Un cambio ricavato ha rateSource "derived" e non viene verificato rispetto agli importi da cui deriva. Solo a scopo di visualizzazione.

Restituisce

201 Created con l’oggetto mostrato nella risposta.

Più dettagli

Inviata come corpo application/json con un connectionId; lo stesso percorso senza connectionId è SubmitInvoice. Sostituisce POST /v1/workspaces/{regionId}/invoices/manual, che ora restituisce 410 ROUTE_MERGED. Registra una fattura per una controparte attiva di ListInvoiceCounterparties: un Fornitore che fattura a uno dei suoi acquirenti, o un Acquirente che inserisce la fattura di uno dei suoi fornitori. La fattura viene memorizzata nel workspace dell’acquirente, nella valuta dell’acquirente, così entrambe le parti la vedono. Il server calcola l’importo di ogni riga come qty × unitPrice + charge − discount, e il totale come le righe, meno gli sconti a livello di fattura, più le maggiorazioni a livello di fattura, più taxAmount. Ogni valore calcolato viene arrotondato (metà per eccesso) all’unità minima della valuta dell’acquirente: al centesimo per USD ed EUR, all’unità intera per JPY (3 × 333,33 JPY dà un importo di riga di 1.000). Quel totale è l’importo che viene riconciliato, approvato, confrontato con i tetti e pagato. Con poId la fattura è "pending" quando esiste un dato di fatturazione attivo per il provider dell’OdA, altrimenti "unverified" con unverifiedReason "no_billing_connection" (solo nella vista acquirente); senza poId è "unverified" con unverifiedReason "no_purchase_order". Un Acquirente che inserisce una fattura non può approvarla, risolverla, esportarla o registrarne il pagamento, a meno che nessun altro nel workspace possa farlo, e pagarla con Stripe richiede sempre un’altra persona.

Chiamanti Acquirente: una sessione con accesso effettuato o una X-Api-Key di un workspace acquirente. Chi l’ha registrata, e per una chiave anche la persona che ha creato la chiave, non può approvarla, risolverla, esportarla o registrarne il pagamento, a meno che una persona con accesso effettuato sia l’unica nel workspace a poterlo fare; pagarla con Stripe richiede sempre un’altra persona. Chiamanti Fornitore: solo sessione con accesso effettuato; una chiave API fornitore riceve 400 SUPPLIER_DIRECT_INVOICE_RETIRED.

Campi della risposta

  • sourcestring

    Sempre "manual" per questo endpoint.

  • amountnumber

    Il totale da pagare: le righe al netto dei propri sconti e maggiorazioni, meno gli sconti a livello di fattura, più le maggiorazioni a livello di fattura, più taxAmount. Riconciliazione, approvazione, autonomia, tetti contrattuali e saldo lo usano tutti.

  • lineItemsArray

    Ogni riga così come è memorizzata. amount è l’importo netto della riga, al netto delle imposte; discount e charge compaiono solo su una riga che li ha.

  • adjustmentsArray

    Sconti e maggiorazioni a livello di fattura. Assente se non ce ne sono.

  • taxAmountnumber

    L’imposta indicata, già inclusa in amount. Solo a scopo di visualizzazione: nessuna decisione la legge. Assente se non ne è stata indicata nessuna.

  • currencystring

    La valuta dell’acquirente.

Errori

  • 400 Bad Request - Il corpo non supera la convalida (inclusi più di 20 adjustments, un taxAmount negativo, o più di 2 cifre decimali su uno sconto, una maggiorazione, un adjustment o taxAmount), INVOICE_DOCUMENT_INVALID (un unitPrice negativo; uno sconto di riga superiore alla riga: "Line 2's discount (12.00 USD) is more than the line (10.00 USD). Check lineItems[1].discount."; un totale al netto degli sconti non maggiore di 0: "The invoice total after discounts must be greater than zero."; un totale superiore a 1.000.000.000.000.000; oppure più cifre decimali di quante la valuta dell’acquirente ne consenta su uno sconto, una maggiorazione, un adjustment o taxAmount ("lineItems[0].discount must be a whole number in JPY.")), invoiceDate è fuori intervallo (INVOICE_DATE_OUT_OF_RANGE), la controparte non è ancora collegata (COUNTERPARTY_NOT_ACTIVE), poId non può essere fatturato (PO_NOT_INVOICEABLE), poLineNo è una riga che l’OdA non ha (INVOICE_PO_LINE_UNKNOWN) o è inviato insieme a billsNoPoLine (INVOICE_PO_LINE_CONTRADICTORY), oppure currency non è quella dell’acquirente (INVOICE_CURRENCY_MISMATCH).
  • 404 Not Found - Nessuna controparte con questo connectionId è visibile al chiamante.
  • 409 Conflict - Questo fornitore ha già una fattura con questo numero (INVOICE_NUMBER_TAKEN).
  • 400 Bad Request - Il corpo contiene un amount (AMOUNT_NOT_ACCEPTED: "Leave amount off: Pleaxy computes the total from the line items."), oppure un Fornitore ha chiamato con una chiave API (SUPPLIER_DIRECT_INVOICE_RETIRED).
  • 403 Forbidden - La credenziale non dà accesso a questo workspace, oppure il ruolo procurement di un chiamante Acquirente non può creare fatture.
  • 422 Unprocessable Entity - La controparte è il profilo acquirente o fornitore del chiamante stesso (SELF_DEALING).
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
POST /v1/workspaces/{regionId}/invoices
Richiesta
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"
}
Risposta · 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 } } ]
}

Recuperare i tassi di cambio

Restituisce i tassi di cambio usati per confrontare gli importi con i tuoi limiti.

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

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

I tassi che Pleaxy usa solo per confrontare ordini e fatture in altre valute con le tue soglie di approvazione, le condizioni sugli importi, i limiti di approvazione automatica, le regole di automazione e i limiti di spesa. Importi, fatture e pagamenti non vengono mai convertiti. Una riga per ogni valuta usata da ordini, fatture e fornitori: il cambio di riferimento verso la valuta del tuo workspace (un tasso giornaliero di Exchange Rate API, usato finché non ha più di 3 giorni). I workspace non possono impostare tassi propri. Senza un tasso aggiornato, un documento in quella valuta passa per tutti i passaggi di approvazione e non viene mai approvato automaticamente. Una catena costruita con un tasso lo registra come approval.fx: { from, to, rate, source: provider | none, asOf, controlAmount, supplierStated? }. Quando una fattura indica un proprio valore nella valuta del tuo workspace (il suo paymentCurrencyAmount, o il suo totale al cambio di taxCurrencyAmount), controlAmount è il maggiore tra quel valore e il valore al cambio di riferimento, così un tasso indicato basso non può abbassare l’instradamento; supplierStated { amount, rateSource, rateDate } mostra il valore della fattura. Senza un cambio di riferimento aggiornato, la catena passa comunque per tutti i passaggi di approvazione, mai in base al valore della fattura. Una fattura il cui tasso indicato si discosta dal cambio di riferimento di più di warningPct al suo arrivo riporta rateWarnings (solo nella vista acquirente); non la bloccano mai. Rates By Exchange Rate API (https://www.exchangerate-api.com).

Solo sessione con accesso effettuato, con accesso 'view' alle impostazioni di approvazione. Una chiave API riceve 403 HUMAN_SESSION_REQUIRED: i termini del fornitore dei tassi non consentono di offrire i suoi tassi tramite un’API.

Errori

  • 403 Forbidden - Una chiave API (HUMAN_SESSION_REQUIRED), un chiamante Fornitore, o un ruolo procurement senza 'view' sulle impostazioni di approvazione.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
GET /v1/workspaces/{regionId}/exchange-rates
Richiesta
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/exchange-rates" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Risposta · 200 OK
{
   "workspaceCurrency": "string",
   "warningPct": number,
   "rows": [
      { "currency": "string", "providerRate": number, "providerAsOf": "string" }
   ],
   "provider": { "asOf": "string", "fresh": boolean, "attribution": { "text": "string", "url": "string" } }
}

Impostare l’avviso sul tasso di cambio

Imposta quando il tasso di cambio indicato da una fattura riceve un avviso.

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

Corpo

  • warningPctnumberObbligatorio

    Da 0 a 100.

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

Imposta di quanto, in percentuale, il tasso indicato da una fattura (il cambio del suo paymentCurrencyAmount o taxCurrencyAmount) può discostarsi dal cambio di riferimento (un tasso giornaliero aggiornato di Exchange Rate API) prima che la fattura riporti rateWarnings. Valore predefinito 5. Verificato all’arrivo di una fattura; le fatture già ricevute mantengono i loro avvisi. Un avviso non blocca mai una fattura. Senza un cambio di riferimento aggiornato non c’è nulla da confrontare e nessun avviso.

Solo sessione con accesso effettuato (una chiave API riceve 403 HUMAN_SESSION_REQUIRED), con accesso 'edit' alle impostazioni di approvazione: gli amministratori.

Errori

  • 400 Bad Request - warningPct mancante, o non è un numero da 0 a 100.
  • 403 Forbidden - Una chiave API, un chiamante Fornitore, o un ruolo procurement senza 'edit' sulle impostazioni di approvazione.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
PUT /v1/workspaces/{regionId}/exchange-rates
Richiesta
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
}
Risposta · 200 OK
{
   "warningPct": number
}

Recuperare il cambio di riferimento

Restituisce il cambio di riferimento per una data.

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

Parametri

  • fromstringObbligatorio

    Codice ISO 4217: la valuta della fattura.

  • tostringObbligatorio

    Codice ISO 4217: la valuta di pagamento o d’imposta.

  • datestring

    YYYY-MM-DD, la data della fattura. Valore predefinito: oggi.

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

Il cambio di riferimento per 1 from in to alla data di una fattura: il tasso giornaliero di Exchange Rate API per quella data, o il più recente dei 3 giorni precedenti, mai quello di un giorno successivo. Senza data, quello di oggi, finché non ha più di 3 giorni. Il modulo Nuova fattura lo usa per suggerire il cambio di una valuta di pagamento o d’imposta; la fattura registra il tasso e i valori inviati, qualunque siano, e Pleaxy verifica che siano coerenti. reference è assente quando non c’è un tasso (stessa valuta, una valuta sconosciuta, o nessuna rilevazione per quella data). Rates By Exchange Rate API (https://www.exchangerate-api.com).

Solo sessione con accesso effettuato, con accesso 'create' alle fatture. Una chiave API riceve 403 HUMAN_SESSION_REQUIRED: i termini del fornitore dei tassi non consentono di offrire i suoi tassi tramite un’API.

Errori

  • 400 Bad Request - from o to non è un codice ISO 4217 di 3 lettere, oppure date non è nel formato YYYY-MM-DD.
  • 403 Forbidden - Una chiave API (HUMAN_SESSION_REQUIRED), oppure un ruolo senza 'create' sulle fatture.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
GET /v1/workspaces/{regionId}/reference-rate
Richiesta
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/reference-rate" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Risposta · 200 OK
{
   "reference": {
      "from": "string",
      "to": "string",
      "rate": number,
      "date": "string",
      "source": "string",
      "attribution": { "text": "string", "url": "string" }
   }
}

Impostare le valute di un fornitore

Imposta le valute in cui un fornitore fattura e viene pagato.

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

Parametri

  • connectionIdstringObbligatorio

    La connessione con il fornitore.

Corpo

  • billingCurrencystring | null

    ISO 4217. Solo per un fornitore senza account Pleaxy; uno con account imposta da sé le proprie valute.

  • paymentCurrencystring | null

    ISO 4217. Per un fornitore con account, una valuta in cui accetta pagamenti.

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

Imposta due valori predefiniti per un fornitore: "Valuta di fatturazione" (billingCurrency), la valuta in cui ti fattura un fornitore senza account Pleaxy, usata per i suoi nuovi ordini e fatture; e "Valuta di pagamento" (paymentCurrency), la valuta in cui di solito lo paghi, suggerita come valuta di pagamento di una nuova fattura. Se assente, il campo resta invariato; null lo rimuove. Gli ordini e le fatture esistenti mantengono le loro valute. Il fornitore non vede né l’uno né l’altro.

Sessione con accesso effettuato o X-Api-Key di un workspace acquirente, con accesso 'edit' ai fornitori: administrator o contracts-and-suppliers.

Errori

  • 400 Bad Request - Un codice che non è ISO 4217, billingCurrency per un fornitore con account (BILLING_CURRENCY_SUPPLIER_OWNED), oppure un paymentCurrency che non accetta (PAYMENT_CURRENCY_NOT_ACCEPTED).
  • 403 Forbidden - Un chiamante Fornitore, oppure un ruolo procurement senza 'edit' sui fornitori.
  • 404 Not Found - Questa connessione non esiste in questo workspace.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
PUT /v1/workspaces/{regionId}/supplier-connections/{connectionId}/currencies
Richiesta
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
}
Risposta · 200 OK
{
   "id": "string",
   "supplierName": "string",
   "billingCurrency": "string",
   "paymentCurrency": "string"
}

Impostare il feed di fatture

Attiva o disattiva le fatture automatiche di un fornitore.

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

Parametri

  • connectionIdstringObbligatorio

    La connessione con il fornitore.

Corpo

  • enabledbooleanObbligatorio

    true per accettare le fatture automatiche di questo fornitore, false per interromperle.

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

Attiva o disattiva le fatture automatiche di un fornitore (SubmitFeedInvoice) per una connessione approvata. Sono attive dal momento in cui approvi l’onboarding del fornitore (le connessioni approvate prima del 9 ottobre 2026 mantengono il valore che avevano); questo è il pulsante di arresto. Disattivarle fa rifiutare la richiesta immediatamente successiva del fornitore; le fatture già ricevute restano in Fatture e riconciliazione e continuano il loro percorso di approvazione. Il fornitore riceve una notifica (invoice_feed_changed). Impostare il valore già presente non cambia nulla. Restituisce la connessione con invoiceFeedEnabled, invoiceFeedUpdatedAt e invoiceFeedUpdatedBy. ListInvoiceCounterparties mostra l’impostazione attuale e lo stato di preparazione di ogni connessione.

Solo sessione con accesso effettuato (una chiave API riceve 403), con accesso 'edit' alle fatture: administrator o finance.

Errori

  • 400 Bad Request - La connessione non è ancora approvata (COUNTERPARTY_NOT_ACTIVE), oppure enabled non è un booleano.
  • 403 Forbidden - Una chiave API invece di una sessione con accesso effettuato, un chiamante Fornitore, oppure un ruolo procurement senza 'edit' sulle fatture (read-only, contracts-and-suppliers, relationships, requisitions).
  • 404 Not Found - Nel workspace non esiste alcuna connessione con questo id.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
PUT /v1/workspaces/{regionId}/supplier-connections/{connectionId}/invoice-feed
Richiesta
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
}
Risposta · 200 OK
{
   "id": "string",
   "supplierName": "string",
   "status": "approved",
   "invoiceFeedEnabled": boolean,
   "invoiceFeedUpdatedAt": "string",
   "invoiceFeedUpdatedBy": "string"
}

Elencare i tentativi del feed

Elenca i tentativi di fatturazione automatica su una connessione.

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

Parametri

  • connectionIdstringObbligatorio

    La connessione con il fornitore.

  • beforestring

    Il cursore dell’ultima riga della pagina che hai, per ottenere la pagina successiva. 50 righe per pagina.

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

Il registro dei tentativi delle fatture automatiche di una connessione: ogni chiamata a SubmitFeedInvoice o ValidateFeedInvoice che ha raggiunto la connessione, dalla più recente, con la risposta di Pleaxy. Un rifiuto avvenuto prima che la connessione fosse nota (nessuna chiave, ambito errato, limite di frequenza della chiave, una connessione che non è del chiamante) non può essere attribuito a una connessione e non viene registrato. Il documento stesso non viene mai memorizzato. Il fornitore legge le proprie connessioni; l’acquirente legge i fornitori che ha approvato; entrambi vedono le stesse righe. Le righe vengono conservate per 90 giorni. La connessione stessa (ListSupplierConnections, ListInvoiceCounterparties con ?perConnection=true) riporta l’ultimo di ogni tipo: feedLastAttemptAt, feedLastAcceptedAt, feedAcceptedCount, feedLastRefusedAt, feedLastRefusedCode, feedLastValidAt, feedValidCount.

Sessione con accesso effettuato o chiave API. Un chiamante Acquirente ha bisogno dell’accesso 'view' ai fornitori.

Campi della risposta

  • modestring

    "submit" per la route reale, "validate" per quella di test.

  • formatstring

    Noto una volta analizzato il corpo; assente quando la chiamata è stata rifiutata prima.

  • outcomestring

    "accepted" (201, fattura creata), "replayed" (200, di nuovo lo stesso documento), "valid" (un test superato), "refused" (qualsiasi errore dopo che la connessione era nota, compreso un feed disattivato).

  • status, code, messagenumber, string, string

    La risposta ricevuta dal chiamante: lo stato HTTP e, in caso di rifiuto, il suo codice e il messaggio così come restituiti.

  • messageId, paramsstring, object

    In caso di rifiuto, messageId e params dell’errore così come restituiti, per mostrarlo nella lingua del tuo lettore. Assente sulle righe registrate prima che venissero conservati.

  • invoiceNumberstring

    Il tuo numero di fattura, se l’analisi è arrivata fin lì.

  • invoiceIdstring

    La fattura creata o ripetuta; in un test superato, la fattura già indicata da un numero ripetuto.

  • creditNoteIdstring

    La nota di credito creata o ripetuta, quando il documento era una nota di credito; invoiceNumber è allora il suo numero.

  • keyIdstring

    L’id della chiave API (mai il suo segreto), da confrontare con ListApiKeys.

  • beforestring

    Il cursore dell’ultima riga quando potrebbero esserci righe meno recenti; assente nell’ultima pagina.

Errori

  • 400 Bad Request - before non è un cursore di una pagina precedente.
  • 403 Forbidden - Il ruolo procurement di un chiamante Acquirente non può visualizzare i fornitori (requisitions).
  • 404 Not Found - Nessuna connessione con questo id è tua.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
GET /v1/workspaces/{regionId}/supplier-connections/{connectionId}/feed-attempts
Richiesta
curl "$PLEAXY_API_BASE_URL/v1/workspaces/reg_01k5x8p9j3q7vn2mhb4tzc6rde.supplier/supplier-connections/SC-1A2B3C4D/feed-attempts" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Risposta · 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"
    }
  ]
}

Eseguire la riconciliazione di una fattura

Confronta una fattura con il consumo cloud misurato.

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

Restituisce

201 Created con l’oggetto mostrato nella risposta.

Più dettagli

Esegue la riconciliazione a 3 vie: confronta l’importo fatturato (amount) con il consumo misurato (usageAmount, in usageCurrency, la valuta del provider, da una connessione di fatturazione attiva). Viene confrontato solo un dato reale: una fattura pending meno recente senza un dato di consumo reale diventa invece "unverified" (unverifiedReason "no_billing_connection"), senza catena di approvazione. Solo un dato proveniente da una fattura AWS emessa consente all’autonomia o a una regola di automazione di approvarla senza l’intervento di nessuno; una riconciliazione con qualsiasi altra fonte viene inviata a una persona. Entro la tolleranza (3%) la fattura diventa matched e viene costruita una catena di approvazione. Fuori tolleranza, si risolve automaticamente come matched se lo scostamento rientra nell’autonomia, altrimenti diventa discrepancy (discrepancyReason "amount") e attende ResolveInvoiceDiscrepancy. Pleaxy non converte le valute: quando il consumo è in una valuta diversa da quella della fattura, non viene confrontato nulla e non si applica alcuna autonomia o regola di automazione: la fattura diventa discrepancy con discrepancyReason "currency" e richiede ResolveInvoiceDiscrepancy. Una fattura relativa a un ordine d’acquisto che non riguarda un provider cloud non ha consumi da confrontare: viene creata come pending con matchBasis "purchase_order" quando supera i controlli su OdA e contratto, e questa chiamata ne costruisce la catena di approvazione: matched, sempre con un approvatore umano, mai con l’autonomia o una regola di automazione. Una fattura creata come "unverified" (unverifiedReason "no_billing_connection") prima di allora viene verificata di nuovo rispetto al suo OdA e contratto: matched, oppure discrepancy con discrepancyReason "controls". Il richiedente della catena di approvazione è il chiamante autenticato (una chiave API viene registrata come apikey:<keyId>), mai un nome passato nella richiesta; la richiesta non accetta un corpo.

Campi della risposta

  • matchStatusstring

    "matched" o "discrepancy" dopo l’esecuzione della riconciliazione, oppure "unverified" per una fattura pending meno recente senza un dato di consumo reale.

  • discrepancyReasonstring

    Impostato solo in caso di discrepanza: "amount" (fuori tolleranza), "currency" (consumo in un’altra valuta, mai confrontato) o "controls" (viola il suo OdA o contratto).

  • matchBasisstring

    "purchase_order" quando la fattura è stata riconciliata con un ordine d’acquisto che non riguarda un provider cloud anziché con il consumo. Assente in una riconciliazione con il consumo.

Errori

  • 400 Bad Request - Il matchStatus della fattura non è "pending" (né "unverified" su un ordine d’acquisto che non riguarda un provider cloud). Per qualsiasi altra fattura non verificata (nessun ordine d’acquisto o nessuna connessione di fatturazione): "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." Altrimenti: "Invoice '{invoiceId}' has already been matched (result: {matchStatus})."
  • 404 Not Found - Nel workspace non esiste alcuna fattura con questo id.
  • 409 Conflict - Un’altra esecuzione o decisione è avvenuta in contemporanea; rileggi la fattura.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/run-match
Richiesta
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/run-match" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Risposta · 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 } } ]
}

Risolvere una discrepanza di una fattura

Invia in approvazione una fattura con discrepanza già esaminata.

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

Restituisce

201 Created con l’oggetto mostrato nella risposta.

Più dettagli

Intervento manuale per una fattura esaminata da una persona: avvia una normale catena di approvazione (senza autonomia) per una fattura con discrepanza o non verificata. Una discrepanza diventa "matched"; una fattura non verificata resta "unverified" con la sua catena in attesa, perché nulla è stato verificato. Il richiedente della catena di approvazione è il chiamante autenticato (una chiave API viene registrata come apikey:<keyId>), mai un nome passato nella richiesta; la richiesta non accetta un corpo.

Una chiave API può risolvere una discrepanza di importo o di valuta. Solo una sessione con accesso effettuato può risolvere una fattura non verificata, per entrambi i valori di unverifiedReason; una chiave API riceve 403 HUMAN_REVIEW_REQUIRED.

Errori

  • 400 Bad Request - Il matchStatus della fattura non è né "discrepancy" né "unverified".
  • 403 Forbidden - HUMAN_REVIEW_REQUIRED: la fattura non è verificata e il chiamante è una chiave API ("An unverified invoice has nothing to match it against, so a person must review it. Sign in to Pleaxy to resolve it."). Nulla viene modificato.
  • 404 Not Found - Nel workspace non esiste alcuna fattura con questo id.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/resolve-discrepancy
Richiesta
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/resolve-discrepancy" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Risposta · 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 } } ]
}

Approvare una fattura

Approva il passaggio di approvazione corrente di una fattura.

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

Restituisce

201 Created con l’oggetto mostrato nella risposta.

Più dettagli

Fa avanzare di una fase la catena di approvazione della fattura. Può chiamarlo solo il dipendente indicato dal passaggio corrente: nessun ruolo, permesso o diritto di amministratore sostituisce l’essere indicati, e una chiave API non può mai esserlo. Un’approvazione completata invia al fornitore una notifica invoice_approved. Non accetta un corpo e agisce come il chiamante autenticato (una chiave API agisce come apikey:<keyId>).

Solo sessione con accesso effettuato. Qualsiasi altro chiamante, chiave API compresa, riceve 403 HUMAN_APPROVAL_REQUIRED prima che venga letto qualsiasi cosa.

Errori

  • 400 Bad Request - La fattura non ha alcuna fase di approvazione in attesa.
  • 403 Forbidden - Codice HUMAN_APPROVAL_REQUIRED. Il chiamante è una chiave API. I passaggi di approvazione indicano un dipendente specifico, e una chiave non può mai esserlo, quindi una chiave non può né approvare né rifiutare un passaggio. Chiedi al dipendente indicato dal passaggio di agire in Pleaxy.
  • 403 Forbidden - Codice APPROVER_NOT_ASSIGNED. Il passaggio corrente non ha alcun approvatore assegnato, quindi nessuno può agire su di esso. Prima un amministratore deve assegnarne uno con ReassignPurchaseOrderApprovalStage / ReassignInvoiceApprovalStage.
  • 403 Forbidden - Il chiamante non è il dipendente indicato dal passaggio corrente. Solo quel dipendente può approvarlo o rifiutarlo: nessun ruolo o permesso sostituisce l’essere indicati.
  • 404 Not Found - Nel workspace non esiste alcuna fattura con questo id.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/approve
Richiesta
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/approve" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Risposta · 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 } } ]
}

Rifiutare una fattura

Rifiuta una fattura, con un motivo visibile al fornitore.

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

Corpo

  • reasonCodestringObbligatorio

    Uno tra amount_incorrect, not_ordered_or_not_received, duplicate, missing_or_wrong_po, wrong_billing_entity, other. Il fornitore ne vede l’etichetta.

  • reasonstringObbligatorio

    La nota che il fornitore vede: cosa deve correggere. Gli a capo diventano spazi, e i caratteri di controllo e invisibili vengono rimossi. Dopodiché deve contenere almeno 10 lettere o cifre e al massimo 500 caratteri. Testo semplice; mai mostrato come link. Non includere dati personali o commenti interni.

Restituisce

201 Created con l’oggetto mostrato nella risposta.

Più dettagli

Rifiuta la fattura alla sua fase di approvazione corrente, con un motivo visibile al fornitore. Può chiamarlo solo il dipendente indicato dal passaggio corrente. Una fattura non verificata o con discrepanza che non ha ancora una catena di approvazione è un caso a parte: qualsiasi acquirente con invoices:edit può rifiutarla, tranne l’acquirente che l’ha inserita. Solo sessioni con accesso effettuato: una chiave API non può rifiutare. Il fornitore vede il motivo e la nota parola per parola, ma non chi ha rifiutato, e riceve una notifica che indica solo il motivo. Il rifiuto viene memorizzato sulla fattura come `rejection`. Rifiutare una fattura che detiene l’impegno del suo ordine d’acquisto riapre quell’ordine nella stessa scrittura, così il fornitore può inviare una fattura corretta a fronte di esso: riceve l’id INV-<PO suffix>-R<n> e `replacesInvoiceId`, e richiede un nuovo numero di fattura, perché la fattura rifiutata mantiene il proprio.

Errori

  • 400 Bad Request - La fattura non ha alcuna fase di approvazione in attesa.
  • 400 Bad Request - Codice INVOICE_REJECTION_REASON_INVALID. reasonCode manca o non è uno dei sei codici, oppure reason manca, non è una stringa, ha meno di 10 lettere o cifre, o supera i 500 caratteri dopo la pulizia.
  • 403 Forbidden - Codice HUMAN_APPROVAL_REQUIRED: "Rejecting needs you, signed in to Pleaxy." Il chiamante è una chiave API. Il rifiuto è una decisione visibile al fornitore, quindi richiede una persona che ha effettuato l’accesso.
  • 403 Forbidden - Codice APPROVER_NOT_ASSIGNED. Il passaggio corrente non ha alcun approvatore assegnato, quindi nessuno può agire su di esso. Prima un amministratore deve assegnarne uno con ReassignPurchaseOrderApprovalStage / ReassignInvoiceApprovalStage.
  • 403 Forbidden - Il chiamante non è il dipendente indicato dal passaggio corrente. Solo quel dipendente può approvarlo o rifiutarlo: nessun ruolo o permesso sostituisce l’essere indicati.
  • 404 Not Found - Nel workspace non esiste alcuna fattura con questo id.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/reject
Richiesta
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"
}
Risposta · 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 } } ]
}

Riassegnare una fase di approvazione di una fattura

Assegna un passaggio di approvazione in attesa a un’altra persona.

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

Corpo

  • stageIdstringObbligatorio

    Id del passaggio in attesa da riassegnare. Può trovarsi in qualsiasi gruppo della catena, non solo in quello corrente.

  • approverEmployeeKeystringObbligatorio

    Chiave dipendente (sub di Cognito) del nuovo approvatore. Deve essere un membro acquirente di questo workspace e non l’amministratore che esegue l’azione.

  • reasonstring

    Il motivo della riassegnazione del passaggio, fino a 280 caratteri. Mostrato nella cronologia delle approvazioni.

Restituisce

201 Created con l’oggetto mostrato nella risposta.

Più dettagli

L’equivalente per le fatture di ReassignPurchaseOrderApprovalStage: indirizza un passaggio in attesa della catena di approvazione di questa fattura a un altro dipendente indicato per nome. Solo per amministratori (approvalSettings:edit), solo da sessioni con accesso effettuato, limitato al documento e registrato nella cronologia delle approvazioni. È così che si sblocca una fattura collegata a un fornitore che, in modo prudenziale, è finita su un passaggio "Approvazione manuale" non assegnato.

Errori

  • 400 Bad Request - La catena è già approvata o rifiutata; il passaggio è già stato approvato o rifiutato; il nuovo approvatore non è un dipendente di questo workspace; il nuovo approvatore ha emesso l’ordine / inserito la fattura, è escluso per separazione dei compiti, ha già superato il limite di spesa con la propria autorità o occupa già un altro posto nello stesso passaggio; oppure il passaggio è la revisione del limite di spesa, il cui approvatore è un dato di audit congelato (modificalo in Impostazioni › Limiti di spesa).
  • 403 Forbidden - Il chiamante non ha approvalSettings:edit (amministratore), oppure ha indicato se stesso come nuovo approvatore: assegnare a sé un passaggio attivo rende una sola persona l’intera catena, senza traccia di policy. Codice HUMAN_APPROVAL_REQUIRED quando il chiamante è una chiave API: solo un amministratore che ha effettuato l’accesso può riassegnare un passaggio di approvazione.
  • 404 Not Found - Nel workspace non esiste alcun documento con questo id, oppure la catena non ha alcun passaggio con questo stageId.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/approval/reassign
Richiesta
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"
}
Risposta · 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 } } ]
}

Registrare un pagamento

Registra che una fattura è stata pagata al di fuori di Pleaxy.

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

Corpo

  • methodstringObbligatorio

    Come è stato pagato: ach, wire, check, card o other.

  • paymentDatestringObbligatorio

    YYYY-MM-DD in cui è stato inviato il pagamento. Non successiva a oggi nel fuso orario del workspace acquirente, e non precedente alla data della fattura.

  • referencestringObbligatorio

    Il riferimento della banca o dello strumento di pagamento, ad esempio una traccia ACH o un numero di assegno, da 1 a 64 caratteri dopo la pulizia. Il fornitore lo vede. Mai un numero di conto bancario.

  • currencystring

    Solo per un pagamento in una valuta diversa da quella dell’importo dovuto: ISO 4217. Richiede amount e rate.

  • amountnumber

    Con currency: quanto è stato pagato, in currency. L’importo dovuto × rate, entro lo 0,5% o un’unità minima.

  • ratenumber

    Con currency: 1 {valuta dell’importo dovuto} = rate {currency}, il cambio a cui è stato effettuato il pagamento.

  • rateDatestring

    Con currency: YYYY-MM-DD a cui si riferisce il cambio, non successiva a oggi. Valore predefinito: paymentDate.

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

    Un avviso di pagamento per il fornitore, inviato con la notifica del pagamento: una nota, una prova di pagamento caricata con RequestRemittanceUpload, o entrambe. Stesse regole di SendRemittance.

  • confirmReplacedboolean

    True per registrarlo comunque quando la fattura è sostituita (storno e rifatturazione) e le sue note di credito non la coprono interamente: pagare sia questa sia la fattura che la sostituisce significa pagare due volte.

Restituisce

201 Created con l’oggetto mostrato nella risposta.

Più dettagli

Registra che una fattura approvata è stata pagata al di fuori di Pleaxy, con metodo, data e riferimento. Non sposta denaro e non verifica che il pagamento sia avvenuto. Un pagamento copre l’intero importo dovuto: il paymentCurrencyAmount.totalAmount della fattura quando ne indica uno, altrimenti il suo amount, in quella valuta. Non è possibile registrare un pagamento parziale. Pagato in una valuta diversa da quella dell’importo dovuto? Invia anche amount, currency e rate: l’importo deve essere pari all’importo dovuto × rate, entro lo 0,5% o un’unità minima, e viene registrato come paidAmount; Pleaxy non converte nulla. La fattura risulta pagata, e il fornitore viene avvisato che l’acquirente ha registrato il pagamento e riceve un avviso di pagamento contrassegnato come registrato dall’acquirente e non effettuato tramite Pleaxy. Funziona anche su una fattura esportata, di cui completa l’esportazione. Registrare di nuovo gli stessi dati risponde 200 con alreadyRecorded: true e non cambia nulla. Facoltativamente, invia al fornitore anche un avviso di pagamento (remittance), come fa SendRemittance.

Una sessione con accesso effettuato con accesso 'edit' alle fatture. Modificato il 2026-09-24, una correzione di sicurezza all’interno della v1: una chiave API non può registrare un pagamento (403 HUMAN_SESSION_REQUIRED). La persona che ha inserito la fattura, e i membri del profilo del fornitore, non possono registrarne il pagamento.

Errori

  • 400 Bad Request - Un campo manca o non è valido (codici PAYMENT_METHOD_INVALID, PAYMENT_DATE_INVALID, PAYMENT_DATE_IN_FUTURE, PAYMENT_DATE_BEFORE_INVOICE, PAYMENT_REFERENCE_INVALID), l’importo pagato non è coerente (PAID_AMOUNT_SAME_CURRENCY: currency è la valuta stessa dell’importo dovuto, quindi ometti amount, currency e rate; PAID_AMOUNT_INVALID: amount o rate mancante o non maggiore di 0, oppure un rateDate non valido; PAID_AMOUNT_RATE_MISMATCH: amount non è pari all’importo dovuto × rate), l’avviso di pagamento non è valido (come per SendRemittance), oppure il corpo contiene un campo non accettato.
  • 403 Forbidden - Codice HUMAN_SESSION_REQUIRED: il chiamante è una chiave API. Oppure un rifiuto per separazione dei compiti: il chiamante ha inserito la fattura o è membro del profilo del fornitore.
  • 404 Not Found - Nel workspace non esiste alcuna fattura con questo id.
  • 409 Conflict - Codice PAYMENT_ALREADY_RECORDED (è già registrato un pagamento diverso: ritiralo prima), STRIPE_PAYMENT_IN_PROGRESS (è stato avviato un pagamento tramite Pleaxy con Stripe), EXPORT_COOLING_OFF (la sua esportazione è stata ritirata; riprova il giorno lavorativo successivo), REPLACED_UNCREDITED (la fattura è sostituita e le sue note di credito non la coprono interamente: verifica con il fornitore, poi invia confirmReplaced: true) oppure PAYMENT_CHANGED.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/payment-record
Richiesta
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
}
Risposta · 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 } } ]
}

Ritirare la registrazione di un pagamento

Ritira un pagamento registrato.

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

Corpo

  • confirmbooleanObbligatorio

    Deve essere true.

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

Ritira la registrazione di un pagamento da parte dell’acquirente. La fattura risulta di nuovo non pagata e il fornitore viene informato che la registrazione è stata ritirata. Non annulla né storna il pagamento stesso. L’avviso di pagamento viene quindi contrassegnato come Ritirato.

Una sessione con accesso effettuato con accesso 'edit' alle fatture; una chiave API riceve 403 HUMAN_SESSION_REQUIRED.

Errori

  • 403 Forbidden - Codice HUMAN_SESSION_REQUIRED, oppure un rifiuto per separazione dei compiti.
  • 404 Not Found - Non esiste alcuna fattura con questo id, oppure codice NO_PAYMENT_RECORD: non è registrato alcun pagamento per essa.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
DELETE /v1/workspaces/{regionId}/invoices/{invoiceId}/payment-record
Richiesta
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
}
Risposta · 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 } } ]
}

Esportare le fatture per il pagamento

Esporta in CSV le fatture approvate e non pagate per il tuo ciclo di pagamenti.

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

Corpo

  • invoiceIdsstring[]

    Facoltativo: esporta solo queste fatture, da 1 a 1.000 id. Se omesso (o con un corpo vuoto), tutte le fatture idonee. Qualsiasi altro campo restituisce 400.

  • confirmReplacedboolean

    Con invoiceIds: esporta comunque una fattura sostituita (storno e rifatturazione) che le sue note di credito non coprono interamente. Senza invoiceIds, una fattura del genere viene sempre esclusa.

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

Scarica in CSV le fatture approvate e non pagate per il tuo ciclo di pagamenti, a partire dalla scadenza più vicina, fino a 1.000: tutte le fatture idonee, o solo quelle che indichi in invoiceIds (una non idonea viene esclusa). Ogni fattura esportata resta bloccata finché il suo pagamento non viene registrato o l’esportazione non viene ritirata, così non può essere esportata o registrata due volte. Il file non contiene coordinate bancarie. Il fornitore non vede l’esportazione. Header di risposta: X-Pleaxy-Export-Id, X-Pleaxy-Export-Count, X-Pleaxy-Export-Truncated.

Una sessione con accesso effettuato con accesso 'edit' alle fatture; una chiave API riceve 403 HUMAN_SESSION_REQUIRED.

Errori

  • 403 Forbidden - Codice HUMAN_SESSION_REQUIRED.
  • 400 Bad Request - Il corpo non è vuoto, {} o { invoiceIds, confirmReplaced }, oppure invoiceIds è vuoto, contiene più di 1.000 id o uno più lungo di 64 caratteri.
  • 409 Conflict - Codice REPLACED_UNCREDITED: una fattura indicata in invoiceIds è sostituita e le sue note di credito non la coprono interamente. Invia confirmReplaced: true per esportarla comunque.
  • 422 Unprocessable Entity - Codice NOTHING_TO_EXPORT: nessuna fattura approvata e non pagata è idonea.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
POST /v1/workspaces/{regionId}/invoices/payment-export
Richiesta
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
}
Risposta · 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.

Recuperare un’esportazione di pagamenti

Scarica di nuovo un’esportazione di pagamenti.

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

Parametri

  • exportIdstringObbligatorio

    X-Pleaxy-Export-Id di ExportInvoicesForPayment.

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

Scarica di nuovo un’esportazione: lo stesso CSV, ricostruito dalle fatture ancora esportate con quell’id di esportazione. Per quando un download non è riuscito dopo che le fatture erano state bloccate.

Errori

  • 404 Not Found - Codice EXPORT_NOT_FOUND: nessuna fattura risulta ancora esportata con questo id.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
GET /v1/workspaces/{regionId}/invoices/payment-exports/{exportId}
Richiesta
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/payment-exports/{exportId}" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Risposta · 200 OK
text/csv

Ritirare un’esportazione di pagamenti

Riprende una fattura da un’esportazione di pagamenti.

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

Corpo

  • confirmNotPaidbooleanObbligatorio

    Deve essere true: il tuo ciclo di pagamenti non ha pagato questa fattura.

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

Riprende una fattura dalla sua esportazione, dopo che hai confermato che il tuo ciclo di pagamenti non l’ha pagata. Pleaxy non può vedere né annullare nulla nel tuo strumento di pagamento. La fattura torna ad Approvata, ma non può essere esportata o registrata di nuovo fino al giorno lavorativo successivo, e l’esportazione seguente la contrassegna con previously_exported_at.

Una sessione con accesso effettuato con accesso 'edit' alle fatture; una chiave API riceve 403 HUMAN_SESSION_REQUIRED.

Errori

  • 403 Forbidden - Codice HUMAN_SESSION_REQUIRED, oppure un rifiuto per separazione dei compiti.
  • 404 Not Found - Nel workspace non esiste alcuna fattura con questo id.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
DELETE /v1/workspaces/{regionId}/invoices/{invoiceId}/payment-export
Richiesta
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
}
Risposta · 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 } } ]
}

Recuperare l’avviso di pagamento

Scarica in PDF l’avviso di pagamento di un pagamento.

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

L’avviso di pagamento di un pagamento registrato, in PDF. È contrassegnato come registrato dall’acquirente e non effettuato tramite Pleaxy, e non è una ricevuta né una prova di pagamento. Contrassegnato come Rivisto dopo una nuova registrazione e come Ritirato dopo un ritiro. Invia Accept: application/pdf. Un fornitore i cui acquirenti condividono un id di fattura aggiunge ?buyer=<ID del workspace dell’acquirente>.

Errori

  • 404 Not Found - Nessuna fattura con questo id, oppure codice NO_PAYMENT_RECORD: per essa non è mai stato registrato alcun pagamento.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
GET /v1/workspaces/{regionId}/invoices/{invoiceId}/remittance-advice
Richiesta
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/remittance-advice" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Risposta · 200 OK
application/pdf

Richiedere il caricamento di un avviso di pagamento

Restituisce un URL per caricare una prova di pagamento.

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

Corpo

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

    Il tipo del file.

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

Un URL prefirmato per caricare una prova di pagamento, ad esempio la ricevuta del bonifico della banca, per una fattura approvata o pagata. Esegui il PUT del file su uploadUrl con lo stesso Content-Type entro 5 minuti, fino a maxBytes (10 MB), poi invia il suo fileId con SendRemittance o nel remittance di RecordPayment. Un caricamento non allegato a nulla viene eliminato dopo un paio di giorni.

Una sessione con accesso effettuato con accesso 'edit' alle fatture; una chiave API riceve 403 HUMAN_SESSION_REQUIRED. Le stesse regole di separazione dei compiti di RecordPayment.

Errori

  • 400 Bad Request - contentType non è un PDF, PNG o JPEG ("A remittance file must be a PDF, PNG or JPEG.").
  • 403 Forbidden - Codice HUMAN_SESSION_REQUIRED, oppure un rifiuto per separazione dei compiti.
  • 404 Not Found - Nel workspace non esiste alcuna fattura con questo id.
  • 409 Conflict - Codice REMITTANCE_NEEDS_PAYMENT: la fattura non è ancora approvata o pagata.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/remittance-upload
Richiesta
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"
}
Risposta · 200 OK
{
   "fileId": "string",
   "uploadUrl": "string",
   "maxBytes": number
}

Inviare un avviso di pagamento

Invia al fornitore una prova di pagamento o una nota.

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

Corpo

  • notestring

    Fino a 1.000 caratteri dopo la pulizia, per il fornitore. Finisce nella notifica del fornitore, che arriva anche al suo canale Slack o Teams quando è instradata lì.

  • file{ fileId, fileName }

    Una prova di pagamento, ad esempio la ricevuta del bonifico della banca: il fileId di RequestRemittanceUpload, dopo il PUT del file sul suo uploadUrl, e un fileName da 1 a 200 caratteri.

Restituisce

201 Created con l’oggetto mostrato nella risposta.

Più dettagli

Invia al fornitore un avviso di pagamento per una fattura pagata: una prova di pagamento, una nota, o entrambe. Il fornitore riceve una notifica (invoice_remittance_sent, con la nota) e lo legge nei remittances della fattura, senza sapere chi l’ha inviato; GetRemittanceFile apre il file. Fino a 20 per fattura, e ciascuno resta anche quando la registrazione di un pagamento viene ritirata. Non è l’avviso di pagamento che Pleaxy genera dalla registrazione del pagamento (GetRemittanceAdvice), né le remittanceInstructions del fornitore.

Una sessione con accesso effettuato con accesso 'edit' alle fatture; una chiave API riceve 403 HUMAN_SESSION_REQUIRED. Le stesse regole di separazione dei compiti di RecordPayment.

Campi della risposta

  • remittancesArray

    Ogni avviso di pagamento inviato per la fattura, dal meno recente: { id (RM-…), sentAt, sentByName, note?, file?: { fileName, contentType, sizeBytes } }.

Errori

  • 400 Bad Request - Codice REMITTANCE_EMPTY (né una nota né un file), REMITTANCE_NOTE_INVALID (oltre 1.000 caratteri), REMITTANCE_FILE_NAME_INVALID, REMITTANCE_UPLOAD_INCOMPLETE (il fileId non è uno caricato per questa fattura, o il caricamento non è terminato: "The proof of payment hasn't finished uploading. Attach it again.") oppure REMITTANCE_FILE_TOO_LARGE (oltre 10 MB).
  • 403 Forbidden - Codice HUMAN_SESSION_REQUIRED, oppure un rifiuto per separazione dei compiti.
  • 404 Not Found - Nel workspace non esiste alcuna fattura con questo id.
  • 409 Conflict - Codice REMITTANCE_NEEDS_PAYMENT (non è ancora registrato alcun pagamento: registralo prima), REMITTANCE_LIMIT (ne ha già 20), oppure PAYMENT_CHANGED.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/remittance
Richiesta
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" }
}
Risposta · 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 } } ]
}

Recuperare il file di un avviso di pagamento

Restituisce un link temporaneo alla prova di pagamento di un avviso di pagamento.

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

  • remittanceIdstringObbligatorio

    L’avviso di pagamento, ad es. "RM-1A2B3C4D", preso dai remittances della fattura.

  • buyerstring

    Solo per i chiamanti Fornitore, e solo dopo un 409 *_ID_AMBIGUOUS: l’ID del workspace dell’acquirente (che termina con .buyer) o il suo id di regione, preso dall’elenco buyers del 409. Viene considerato solo il documento di quell’acquirente; se lì non c’è, la risposta è 404. Un ID del workspace .supplier restituisce 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."). Ignorato per un chiamante Acquirente.

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

Un link, valido per 5 minuti, alla prova di pagamento allegata a un avviso di pagamento, aperta direttamente nel browser. Il fornitore legge gli avvisi di pagamento che l’acquirente ha inviato sulla sua fattura; la stessa ricerca di GetInvoice.

Errori

  • 404 Not Found - Nessuna fattura con questo id, oppure codice REMITTANCE_NOT_FOUND: la fattura non ha alcun avviso di pagamento con questo id che contenga un file.
  • 409 Conflict - Solo per i chiamanti Fornitore. Codice INVOICE_ID_AMBIGUOUS: più di uno dei tuoi acquirenti ha una tua fattura con questo id (gli id sono univoci solo all’interno di un acquirente), quindi Pleaxy non tira a indovinare quale intendi. Nulla viene letto o modificato. Il campo buyers del corpo elenca l’ID del workspace e il nome di ogni acquirente: ripeti la chiamata con ?buyer=<quell’ID del workspace>.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
GET /v1/workspaces/{regionId}/invoices/{invoiceId}/remittances/{remittanceId}/file
Richiesta
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/remittances/{remittanceId}/file" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Risposta · 200 OK
{
   "url": "string",
   "fileName": "string",
   "contentType": "application/pdf" | "image/png" | "image/jpeg"
}

Recuperare un pagamento Stripe

Restituisce lo stato di un pagamento con carta o bonifico tramite Pleaxy (non ancora disponibile).

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

Restituisce

200 OK con l’oggetto mostrato nella risposta.

Più dettagli

Non ancora disponibile: il pagamento tramite Pleaxy non è attivo, quindi la risposta è available: false con reason not_configured. Una volta attivo, indica se questa fattura può essere pagata tramite Pleaxy con Stripe, o perché no, ed eventuali pagamenti Stripe in corso. quote è quanto pagherebbe l’acquirente: la fattura più la commissione di Stripe per il bonifico (0,8%, fino a un massimo di $5), a carico dell’acquirente affinché il fornitore riceva l’intero importo della fattura.

Errori

  • 404 Not Found - Nel workspace non esiste alcuna fattura con questo id.
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
GET /v1/workspaces/{regionId}/invoices/{invoiceId}/stripe-payment
Richiesta
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/stripe-payment" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Risposta · 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" }
}

Avviare un pagamento Stripe

Avvia il pagamento di una fattura tramite Pleaxy (non ancora disponibile).

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

  • confirmReplacedboolean

    true per pagarla comunque quando la fattura è sostituita (storno e rifatturazione) e le sue note di credito non la coprono interamente.

Restituisce

201 Created con l’oggetto mostrato nella risposta.

Più dettagli

Non ancora disponibile: il pagamento tramite Pleaxy non è attivo, quindi la risposta è 503. Una volta attivo, avvia il pagamento integrale di una fattura approvata tramite Pleaxy, con bonifico bancario statunitense tramite Stripe, e restituisce l’url di una pagina Stripe Checkout. Il pagamento avviene sull’account Stripe del fornitore: il denaro passa dal conto bancario dell’acquirente al fornitore e mai attraverso Pleaxy. L’acquirente paga la fattura più la commissione di Stripe, così il fornitore riceve l’intero importo della fattura; Pleaxy non addebita nulla. La fattura resta bloccata mentre Checkout è aperto (fino a un’ora) e viene contrassegnata come pagata quando Stripe conferma il bonifico. Riprende un Checkout aperto; risponde { state } senza url quando un pagamento è già in elaborazione o concluso.

Una sessione con accesso effettuato con accesso 'edit' alle fatture; una chiave API riceve 403 HUMAN_SESSION_REQUIRED. Le stesse regole di separazione dei compiti di RecordPayment.

Errori

  • 403 Forbidden - Codice HUMAN_SESSION_REQUIRED, oppure un rifiuto per separazione dei compiti.
  • 409 Conflict - Codice PAYMENT_ALREADY_RECORDED, PAYMENT_ACTIVE (esportata o registrata: ritira prima quell’operazione), REPLACED_UNCREDITED (la fattura è sostituita e le sue note di credito non la coprono interamente: aggiungi ?confirmReplaced=true per pagarla comunque) oppure PAYMENT_CHANGED.
  • 422 Unprocessable Entity - Codice STRIPE_SUPPLIER_NOT_ON_PLEAXY, STRIPE_SUPPLIER_NOT_CONNECTED, STRIPE_UNSUPPORTED_CURRENCY o STRIPE_AMOUNT_TOO_SMALL.
  • 503 Service Unavailable - Il pagamento tramite Pleaxy non è attivo ("Paying suppliers through Pleaxy isn't available yet.").
  • 401 Unauthorized - Non è stata presentata alcuna credenziale, oppure il token Bearer o il valore di X-Api-Key è mancante, non valido, scaduto o revocato.
  • 403 Forbidden - Il token Bearer o la chiave API del chiamante non dà accesso a questo workspace (regionId), oppure non ha il ruolo richiesto.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/stripe-payment
Richiesta
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/stripe-payment" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Risposta · 201 Created
{
   "url": "string",
   "state": "checkout_open" | "processing" | "succeeded"
}

Saldare una fattura

Ritirato: usa invece RecordPayment.

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

Parametri

  • invoiceIdstringObbligatorio

    L’identificativo della fattura.

Restituisce

410 Gone con l’oggetto mostrato nella risposta.

Più dettagli

Ritirato. Risponde sempre 410 SETTLE_REPLACED e non modifica nulla. Registra un pagamento effettuato al di fuori di Pleaxy con RecordPayment.

Modificato il 2026-09-24, una correzione di sicurezza all’interno della v1: il saldo è stato limitato alle sessioni con accesso effettuato e poi ritirato; non paga mai nulla.

Errori

  • 410 Gone - Codice SETTLE_REPLACED, sempre.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/settle
Richiesta
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/settle" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Risposta · 410 Gone
{
   "statusCode": 410,
   "error": "Gone",
   "code": "SETTLE_REPLACED",
   "message": "string",
   "messageId": "invoices.settleReplaced",
   "params": { }
}
Contattaci