Referencia de la API

Facturas

Facturas de proveedores a compradores, desde su llegada hasta la conciliación, la aprobación y el pago.

Más sobre este recurso

La factura de un proveedor se crea al convertir una orden de compra (source: "po-flip") o al registrarla para un comprador conectado (source: "manual", consulta CreateInvoice), o el proveedor la envía desde su sistema de facturación con una clave de API (source: "feed", consulta SubmitFeedInvoice) cuando ese comprador activa las facturas automatizadas. Un comprador también puede registrar una directamente (source: "direct", consulta SubmitInvoice), como JSON, cXML (InvoiceDetailRequest) o UBL 2.1 (<Invoice>). Toda factura vive en el espacio de trabajo del comprador y pasa por conciliación, aprobación y liquidación. Una factura está "pending" cuando hay una cifra de consumo real con la que conciliarla: una orden de compra y una conexión de facturación en vivo para el proveedor de la orden de compra con una factura sincronizada. usageAmount, usageCurrency y tolerancePct solo están presentes en ese caso, y en el resultado "matched" o "discrepancy". Si no, está "unverified", con unverifiedReason "no_purchase_order" o "no_billing_connection" (solo en la vista del comprador; ausente en facturas antiguas, que se interpretan como "no_purchase_order"), o "debit_note" para una nota de débito sobre la orden de compra de un proveedor de nube, que se suma a una factura ya cobrada y por eso no se puede comparar con la factura del mes. Un llamador proveedor ve matchStatus tal cual, pero nunca unverifiedReason ni los campos de consumo. Una factura no verificada nunca se concilia ni se aprueba automáticamente: una persona la revisa con ResolveInvoiceDiscrepancy.

Listar facturas

Lista facturas y, opcionalmente, notas de crédito y de débito.

GET/v1/workspaces/{regionId}/invoices

Parámetros

  • fromstring

    Fecha/marca de tiempo ISO 8601: solo se devuelven los elementos creados en esta fecha o después.

  • tostring

    Fecha/marca de tiempo ISO 8601: solo se devuelven los elementos creados en esta fecha o antes.

  • documentTypestring

    Por defecto, lo que se paga: las facturas y las notas de débito que las modifican. invoice (solo facturas), debit_note, credit_note (los mismos elementos que ListCreditNotes) o all (todos los tipos, de la más reciente a la más antigua). Cada elemento lleva documentType. Cualquier otro valor es 400 DOCUMENT_TYPE_INVALID.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Lista facturas, sin un orden concreto, o, con documentType, notas de crédito o ambas: las facturas y las notas de crédito son un único recurso de documentos, y cada elemento indica cuál es en documentType. Un llamador comprador obtiene las facturas que recibió su espacio de trabajo; un llamador proveedor obtiene las facturas que emitió a compradores conectados, esté cada una en el espacio de trabajo de comprador que esté. Opcionalmente se limita a un rango de createdAt mediante from/to: pasa los límites de un mes natural para obtener una vista mensual. Un llamador proveedor recibe una vista reducida de cada factura (consulta GetInvoice): se ocultan los detalles internos de conciliación del comprador y el flujo de aprobación completo.

Errores

  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
GET /v1/workspaces/{regionId}/invoices
Solicitud
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 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 } } ]
   }
]

Obtener factura

Recupera una factura.

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura, o el de una nota de crédito (CN-…).

  • buyerstring

    Solo para llamadores proveedores, y solo necesario después de un 409 *_ID_AMBIGUOUS: el ID del espacio de trabajo del comprador (que termina en .buyer) o el id de región, de la lista buyers del 409. Solo se considera el documento de ese comprador; si no hay ninguno allí, es un 404. Un ID del espacio de trabajo .supplier da 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."). Se ignora para un llamador comprador.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Obtiene una sola factura por su id o, si se da el id de una nota de crédito (CN-…), esa nota de crédito, con la forma de GetCreditNote; documentType indica cuál es. Para un llamador comprador, regionId es el propio espacio de trabajo de la factura. Para un llamador proveedor, regionId es el propio espacio de trabajo del proveedor y la factura se busca entre las facturas entrantes de la organización, sin importar qué espacio de trabajo de comprador la emitió: la misma búsqueda que usa ListSupplierWorkspace. GET …/invoices/{invoiceId}/pdf admite el mismo parámetro de consulta buyer.

Campos de la respuesta

  • replacesInvoiceIdsArray<string>

    Abono y refacturación: las facturas y notas de débito que esta factura reemplaza. Ausente si no hay ninguna.

  • replacedByInvoiceIdsArray<string>

    Las facturas que reemplazan a esta. Ausente si no hay ninguna.

  • replacementobject

    Comprador, solo en lecturas de una sola factura, en una factura reemplazada que no se rechazó: creditedInFull y uncredited, su importe menos sus notas de crédito aceptadas y pendientes, en su moneda. Mientras uncredited sea mayor que 0, pagarla además de su reemplazo supone pagar dos veces, y RecordPayment, StartStripePayment y ExportInvoicesForPayment piden confirmReplaced.

  • uncreditedOriginalsArray

    Comprador, solo en lecturas de una sola factura, en un reemplazo: las facturas que reemplaza que sus notas de crédito no cubren por completo. Ausente si no hay ninguna.

Errores

  • 404 Not Found - No existe ninguna factura con este id en el espacio de trabajo del llamador.
  • 409 Conflict - Solo para llamadores proveedores. Código INVOICE_ID_AMBIGUOUS: más de uno de tus compradores tiene una factura tuya con este id (los ids solo son únicos dentro de un comprador), así que Pleaxy no adivina a cuál te refieres. No se lee ni se cambia nada. El campo buyers del cuerpo lista el ID del espacio de trabajo y el nombre de cada comprador: repite la llamada con ?buyer=<ese ID del espacio de trabajo>.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
GET /v1/workspaces/{regionId}/invoices/{invoiceId}
Solicitud
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 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 } } ]
}

Obtener actividad de factura

Devuelve el historial de una factura, del más antiguo al más reciente.

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

  • buyerstring

    Solo para llamadores proveedores, y solo necesario después de un 409 *_ID_AMBIGUOUS: el ID del espacio de trabajo del comprador (que termina en .buyer) o el id de región, de la lista buyers del 409. Solo se considera el documento de ese comprador; si no hay ninguno allí, es un 404. Un ID del espacio de trabajo .supplier da 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."). Se ignora para un llamador comprador.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

El historial de una factura, del más antiguo al más reciente: su llegada, las comprobaciones y conciliaciones que se ejecutaron sobre ella, los pasos de aprobación, el rechazo, los pagos, los recordatorios y los comentarios. Cada entrada tiene un tipo y datos estructurados, nunca una frase, para que puedas redactarla tú. La mayoría de las entradas se leen de la propia factura, así que una factura antigua también tiene historial. Un llamador proveedor solo obtiene la llegada de la factura, su resultado, los pagos registrados, los recordatorios y los comentarios compartidos.

Campos de la respuesta

  • idstring

    Estable para el mismo historial, para que sepas qué entradas ya has visto.

  • kind, datastring, object

    received: data.source, enteredBy, submittedFormat, fileName. corrects: data.invoiceId, la factura rechazada que reemplaza. control_findings (solo comprador): data.codes. match (solo comprador): data.result (matched, discrepancy o unverified) y data.reason. sent_for_approval (solo comprador): data.from (discrepancy o unverified). approval (solo comprador): data.action, data.stage y data.to para una reasignación. approved. rejected: data.reasonCode y data.reason. payment: data.action, method, paymentDate, reference. reminder: data.autonomy cuando el espacio de trabajo lo envió por su cuenta. comment: el propio comentario, en comment.

Errores

  • 404 Not Found - No existe ninguna factura con este id en el espacio de trabajo del llamador.
  • 409 Conflict - Solo para llamadores proveedores. Código INVOICE_ID_AMBIGUOUS: más de uno de tus compradores tiene una factura tuya con este id (los ids solo son únicos dentro de un comprador), así que Pleaxy no adivina a cuál te refieres. No se lee ni se cambia nada. El campo buyers del cuerpo lista el ID del espacio de trabajo y el nombre de cada comprador: repite la llamada con ?buyer=<ese ID del espacio de trabajo>.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
GET /v1/workspaces/{regionId}/invoices/{invoiceId}/activity
Solicitud
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/activity" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 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
         }
      }
   ]
}

Listar comentarios de factura

Lista los comentarios de una factura.

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

  • buyerstring

    Solo para llamadores proveedores, y solo necesario después de un 409 *_ID_AMBIGUOUS: el ID del espacio de trabajo del comprador (que termina en .buyer) o el id de región, de la lista buyers del 409. Solo se considera el documento de ese comprador; si no hay ninguno allí, es un 404. Un ID del espacio de trabajo .supplier da 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."). Se ignora para un llamador comprador.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Los comentarios de una factura, del más antiguo al más reciente: los internos de tu propio lado y todos los compartidos. Un comentario que su autor eliminó permanece en el hilo con el cuerpo vacío, para que siga constando que se dijo algo y cuándo. Misma búsqueda que GetInvoice, así que un proveedor accede a las facturas que emitió.

Campos de la respuesta

  • visibilitystring

    internal: solo el lado del autor. shared: lo leen tanto el comprador como el proveedor.

  • authorKey, mentionsstring, Array

    Solo en los comentarios de tu propio lado: quién lo escribió, por clave de empleado, y a quién mencionó. El otro lado ve authorName y authorOrgName.

  • bodystring

    Texto plano con sus saltos de línea. Vacío si el autor lo eliminó; deletedAt indica entonces cuándo.

  • viewerIsAuthorboolean

    Si lo escribió el llamador y, por tanto, puede eliminarlo. Siempre false para una clave de API.

Errores

  • 404 Not Found - No existe ninguna factura con este id en el espacio de trabajo del llamador.
  • 409 Conflict - Solo para llamadores proveedores. Código INVOICE_ID_AMBIGUOUS: más de uno de tus compradores tiene una factura tuya con este id (los ids solo son únicos dentro de un comprador), así que Pleaxy no adivina a cuál te refieres. No se lee ni se cambia nada. El campo buyers del cuerpo lista el ID del espacio de trabajo y el nombre de cada comprador: repite la llamada con ?buyer=<ese ID del espacio de trabajo>.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
GET /v1/workspaces/{regionId}/invoices/{invoiceId}/comments
Solicitud
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/comments" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 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
      }
   ]
}

Agregar comentario a factura

Agrega un comentario a una factura.

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

  • buyerstring

    Solo para llamadores proveedores, y solo necesario después de un 409 *_ID_AMBIGUOUS: el ID del espacio de trabajo del comprador (que termina en .buyer) o el id de región, de la lista buyers del 409. Solo se considera el documento de ese comprador; si no hay ninguno allí, es un 404. Un ID del espacio de trabajo .supplier da 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."). Se ignora para un llamador comprador.

Cuerpo

  • bodystringObligatorio

    Texto plano, hasta 2000 caracteres. Se conservan los saltos de línea; se eliminan los caracteres de control, de texto bidireccional e invisibles.

  • visibility"internal" | "shared"Obligatorio

    internal: solo tu propio equipo. shared: el otro lado también lo lee y responde. Los comentarios de un proveedor siempre son compartidos.

  • mentionsstring[]

    Hasta 10 claves de empleado de personas de tu propio espacio de trabajo a las que notificar (consulta ListEmployees). La notificación nunca incluye el texto del comentario.

Devuelve

201 Created con el objeto que se muestra en la respuesta.

Más detalles

Comenta una factura: de forma interna para tu equipo o compartida con el otro lado, por ejemplo un comprador que pregunta al proveedor por una línea. Los comentarios nunca se editan. Se notifica (invoice_comment) a las personas que mencionas, a quienes comentaron antes desde tu lado y, en un comentario compartido, al otro lado; la notificación nunca incluye el texto.

Solo sesión iniciada. Una clave de API recibe 403 HUMAN_SESSION_REQUIRED.

Errores

  • 400 Bad Request - Un cuerpo vacío ("Write something before you post the comment."), más de 2000 caracteres, más de 10 menciones, una mención de alguien que no está en tu espacio de trabajo, una visibilidad distinta de internal o shared, un comentario interno de un proveedor ("A supplier's comments are always shared with the buyer.") o un comentario compartido en un documento cuyo proveedor no está en Pleaxy (publícalo como internal).
  • 403 Forbidden - Código HUMAN_SESSION_REQUIRED: el llamador es una clave de API ("Comments are written by people. Sign in to Pleaxy to post one.").
  • 404 Not Found - No existe ninguna factura con este id en el espacio de trabajo del llamador.
  • 409 Conflict - Solo para llamadores proveedores. Código INVOICE_ID_AMBIGUOUS: más de uno de tus compradores tiene una factura tuya con este id (los ids solo son únicos dentro de un comprador), así que Pleaxy no adivina a cuál te refieres. No se lee ni se cambia nada. El campo buyers del cuerpo lista el ID del espacio de trabajo y el nombre de cada comprador: repite la llamada con ?buyer=<ese ID del espacio de trabajo>.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/comments
Solicitud
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" ]
}
Respuesta · 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
}

Eliminar comentario de factura

Elimina uno de tus comentarios en una factura.

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

  • commentIdstringObligatorio

    El comentario, p. ej. "CMT-1760313600000-3f9a1c2e".

  • buyerstring

    Solo para llamadores proveedores, y solo necesario después de un 409 *_ID_AMBIGUOUS: el ID del espacio de trabajo del comprador (que termina en .buyer) o el id de región, de la lista buyers del 409. Solo se considera el documento de ese comprador; si no hay ninguno allí, es un 404. Un ID del espacio de trabajo .supplier da 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."). Se ignora para un llamador comprador.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Retira tu propio comentario: se elimina su texto y el hilo conserva que se hizo un comentario. Eliminarlo de nuevo no cambia nada.

Solo sesión iniciada. Una clave de API recibe 403 HUMAN_SESSION_REQUIRED.

Errores

  • 403 Forbidden - Código HUMAN_SESSION_REQUIRED: el llamador es una clave de API ("Comments are written by people. Sign in to Pleaxy to post one.").
  • 403 Forbidden - El comentario no es tuyo ("Only the person who wrote a comment can delete it.").
  • 404 Not Found - No hay ningún comentario con este id que puedas ver en este documento ("Comment {commentId} not found."), o no existe ese documento.
  • 409 Conflict - Solo para llamadores proveedores. Código INVOICE_ID_AMBIGUOUS: más de uno de tus compradores tiene una factura tuya con este id (los ids solo son únicos dentro de un comprador), así que Pleaxy no adivina a cuál te refieres. No se lee ni se cambia nada. El campo buyers del cuerpo lista el ID del espacio de trabajo y el nombre de cada comprador: repite la llamada con ?buyer=<ese ID del espacio de trabajo>.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
DELETE /v1/workspaces/{regionId}/invoices/{invoiceId}/comments/{commentId}
Solicitud
curl -X DELETE "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/comments/{commentId}" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 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
}

Registrar factura

Registra el documento de factura de un proveedor, en JSON, cXML o UBL.

POST/v1/workspaces/{regionId}/invoices

Cuerpo

  • invoiceNumberstring

    Número de factura proporcionado por el proveedor, que se usa para descartar envíos duplicados por reintentos dentro de la región.

  • poIdstring

    Id de la orden de compra de Pleaxy que esta factura cumple, p. ej. "PO-AB12CD34". Omítelo para enviar una factura independiente.

  • supplierstringObligatorio

    Nombre visible del proveedor o contraparte.

  • amountnumberObligatorio

    Total de la factura. Debe ser mayor que 0.

  • currencystring

    Código ISO 4217 (aquí, o como currencyID de UBL / currency de Money de cXML). Debe ser la moneda de la región, y una factura contra una orden de compra debe estar en la moneda de la orden. Pleaxy no convierte monedas.

  • dueInDaysnumber

    Condiciones de pago en días. Por defecto, las condiciones de pago predeterminadas del contrato al que pertenece la orden de compra o, si no, 30.

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

    Desglose opcional de la factura por líneas.

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

    Una línea de IA: qué factura y el mes de uso (YYYY-MM; si se omite, el mes anterior a invoiceDate), con qty en la unidad del medidor (millones de tokens, horas). Cada línea de IA se asocia a la línea de IA de la orden con el mismo alcance y se compara con la condición del contrato, la tarifa y el informe de uso del proveedor; lo que incumple aparece como hallazgos ai_*.

  • poLineNonumber

    Con poId: la línea de la orden de compra que factura esta factura, como en CreateInvoice. Los documentos XML lo indican por línea (UBL cac:OrderLineReference/cbc:LineID, cXML InvoiceDetailItemReference@lineNumber).

  • billsNoPoLineboolean

    Con poId: true cuando la factura no factura ninguna de las líneas de la orden de compra, como en CreateInvoice. No se combina con poLineNo.

  • remittanceInstructionsobject

    Dónde debe pagar el comprador; se guarda con la factura y nunca se cambia después: { method, payeeName, bankName?, iban?, accountNumber?, bic?, routingNumber?, mailingAddress?, paymentReference?, notes? }. method es bank_transfer (necesita iban o accountNumber), wire (iban o accountNumber, más bic o routingNumber), ach (accountNumber y un routingNumber ABA de 9 dígitos), check (mailingAddress) u other (notes). Pleaxy nunca lo verifica; se avisa al comprador cuando el beneficiario o la cuenta difieren de la factura anterior de este proveedor.

  • pdfBase64string

    PDF de la factura codificado en Base64.

Devuelve

201 Created con el objeto que se muestra en la respuesta.

Más detalles

Operación de comprador: registra directamente el documento de factura de un proveedor, sin una conversión previa de una orden de compra creada en Pleaxy. Un cuerpo JSON con connectionId corresponde a CreateInvoice. El cuerpo JSON de abajo (proveedor e importe, sin connectionId) está obsoleto y se acepta hasta v2. Un llamador proveedor recibe 400 SUPPLIER_DIRECT_INVOICE_RETIRED (una factura enviada así no llegaba a ningún comprador); los proveedores usan CreateInvoice o FlipPurchaseOrderToInvoice. Acepta tres formatos de solicitud, seleccionados por Content-Type: application/json (un cuerpo CreateInvoiceDto), o application/xml / text/xml con un InvoiceDetailRequest de cXML o un documento Invoice de UBL 2.1 (detectado automáticamente a partir del XML analizado). Si se da poId, se valida contra una orden de compra existente en estado awaiting_fulfillment y la factura queda "pending" cuando existe una cifra de facturación en vivo para el proveedor de la orden de compra y, si no, "unverified" con unverifiedReason "no_billing_connection"; si se omite, la factura empieza como "unverified" con unverifiedReason "no_purchase_order". Un documento XML recibe la misma asignación de descuentos, cargos e impuestos, el mismo rechazo de líneas negativas y la misma conciliación de totales que SubmitFeedInvoice, y un fallo es 400 INVOICE_DOCUMENT_INVALID. El cuerpo JSON no cambia.

Solo para llamadores compradores: llama con una sesión iniciada o con una X-Api-Key con permisos acotados de un espacio de trabajo de comprador (consulta Claves de API). Los llamadores proveedores siempre reciben 400. Usa CreateInvoice en su lugar.

Campos de la respuesta

  • idstring

    Identificador de la factura. "INV-<PO suffix>" cuando se dio poId y, si no, un "INV-XXXXXXXX" aleatorio.

  • matchStatusstring

    "pending" si se dio poId y existe una cifra de facturación en vivo para su proveedor; "unverified" en caso contrario.

  • unverifiedReasonstring

    Se define cuando matchStatus es "unverified": "no_purchase_order" o "no_billing_connection".

  • currencystring

    La moneda en la que se registra la factura, en mayúsculas.

  • sourcestring

    Siempre "direct" para este endpoint.

  • submittedFormatstring

    "json", "cxml" o "ubl", según el Content-Type de la solicitud.

Errores

  • 400 Bad Request (SUPPLIER_DIRECT_INVOICE_RETIRED) - El llamador es un proveedor. Se devuelve para cualquier tipo de contenido y credencial, antes de analizar o validar el cuerpo como factura, y no se guarda nada. Antes se sigue aplicando el límite de tamaño de la solicitud, y un cuerpo que no es JSON válido recibe el 400 genérico del analizador de JSON. Consulta ListInvoiceCounterparties y CreateInvoice.
  • 400 Bad Request - amount no es mayor que cero, el cuerpo JSON no supera la validación, la orden de compra indicada no está en estado awaiting_fulfillment, el cuerpo XML no es cXML/UBL reconocible o contiene una declaración DOCTYPE o de entidad (INVOICE_DOCUMENT_INVALID; se permite la referencia estándar a la DTD externa de cXML), o no se puede aceptar la moneda de la factura: no es la moneda de la región ("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 no es la de la orden de compra indicada ("This invoice is in GBP, but PO-AB12CD34 is in EUR. Ask the supplier to reissue it in EUR - Pleaxy doesn't convert currencies."). Los dos rechazos por moneda llevan el código INVOICE_CURRENCY_MISMATCH e INVOICE_PO_CURRENCY_MISMATCH.
  • 404 Not Found - Se dio poId, pero no existe ninguna orden de compra con ese id en el espacio de trabajo.
  • 409 Conflict - invoiceNumber ya lo usó otra factura de este espacio de trabajo, o la orden de compra indicada ya tiene una factura.
  • 415 Unsupported Media Type - El encabezado Content-Type es distinto de application/json, application/xml o text/xml.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o el rol de compras de un llamador comprador no tiene acceso 'create' a las facturas: solo lo tienen administrator y finance ("Your procurement role ('read-only') doesn't have 'create' access to 'invoices'"; a una clave de API también se le indica que se vuelva a crear con un rol que lo conceda). Con un regionId sin sufijo, un llamador que tiene ambos perfiles se trata como comprador; usa el ID del espacio de trabajo .supplier para actuar como proveedor.
POST /v1/workspaces/{regionId}/invoices
Solicitud
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"
  }'
Respuesta · 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"
}

Listar contrapartes de factura

Lista a quién puedes facturar o quién puede facturarte.

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

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Las contrapartes activas a las que el llamador puede facturar mediante CreateInvoice: para un llamador comprador, sus proveedores aprobados; para un llamador proveedor, los compradores que lo aprobaron. Cada entrada lleva el id de conexión que hay que pasar como connectionId, la moneda del comprador y las órdenes de compra abiertas entre exactamente ese par.

Solo sesión iniciada. Una clave de API recibe 403.

Campos de la respuesta

  • connectionIdstring

    La conexión de proveedor que se factura: el connectionId de CreateInvoice.

  • namestring

    El nombre de la contraparte: el del proveedor para un llamador comprador, el del comprador para un llamador proveedor.

  • currencystring

    La moneda del comprador. Toda factura a esta contraparte se registra en ella.

  • openPurchaseOrdersArray

    Órdenes de compra pendientes de cumplimiento con un importe por facturar, entre exactamente este comprador y este proveedor: los poIds que acepta CreateInvoice. invoicedAmount es lo que tomaron facturas anteriores, antes de impuestos (ausente si ninguna lo hizo). lines son las líneas de la orden de compra que una factura puede facturar (su poLineNo): el importe de cada una y lo que tomaron de ella facturas anteriores (consumed), antes de impuestos. defaultDueInDays son las condiciones de pago predeterminadas del contrato al que pertenece la orden de compra, para prellenar dueInDays de una factura (ausente si no tiene). billToCompanyName es la empresa a la que factura el proveedor de la orden de compra (su billToParty; ausente en órdenes antiguas). paidDeposits son facturas pagadas de la orden de compra que una factura aún puede descontar como anticipo (deductions[].sourceInvoiceId): lo que se debía en cada una y cuánto aún no descuenta ninguna factura, impuestos incluidos (ausente si no hay ninguna).

  • invoiceFeedEnabledboolean

    Solo para llamadores compradores: true cuando las facturas automatizadas de este proveedor están activadas (consulta SetInvoiceFeed). Activadas desde la aprobación; si no aparece, están desactivadas.

  • invoiceFeedUpdatedAtstring

    Solo para llamadores compradores: cuándo se activaron o desactivaron por última vez las facturas automatizadas. Ausente si nunca se hizo.

  • feedReadinessstring

    Solo para llamadores compradores con ?perConnection=true: en qué punto están las facturas automatizadas de esta conexión: "off" (el interruptor), "untested" (todavía no ha pasado nada), "tested" (pasó una llamada a ValidateFeedInvoice), "live" (se aceptó al menos una factura). La vista del propio proveedor (ListSupplierConnections) también puede indicar "no_key" y "not_connected".

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

    Solo para llamadores compradores con ?perConnection=true: el reflejo del registro de intentos (ListFeedAttempts), una vez que se ha llamado al feed.

Errores

  • 403 Forbidden - El llamador se autenticó con una clave de API en lugar de una sesión iniciada ("This action requires a logged-in user session, not an API key"), su credencial no da acceso a este espacio de trabajo, o el rol de compras de un llamador comprador no puede crear facturas.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
GET /v1/workspaces/{regionId}/invoices/counterparties
Solicitud
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/counterparties" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 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"
      }
   ]
}

Crear factura

Crea una factura para un comprador o proveedor conectado.

POST/v1/workspaces/{regionId}/invoices

Cuerpo

  • documentTypestring

    invoice (el valor predeterminado), debit_note o credit_note. Con credit_note, el resto del cuerpo es el de CreateCreditNote (un campo desconocido da 400) y la respuesta es la nota de crédito. Con debit_note es una factura que modifica otra al alza: indica amendsInvoiceId (o amendsInvoiceNumber, el número del proveedor); connectionId se puede omitir. Toma la contraparte, la orden de compra, la línea de la orden de compra y la moneda de la original (otra orden de compra u otra moneda da 400 DEBIT_NOTE_INVALID), consume saldo de la orden de compra y se aprueba y paga como cualquier factura. Se concilia con la orden de compra, salvo en la orden de compra de un proveedor de nube, donde empieza como no verificada con unverifiedReason "debit_note" para que la revise una persona. La original debe ser una factura de este proveedor a este comprador (si no, 404 DEBIT_NOTE_ORIGINAL_NOT_FOUND), no rechazada y que no sea a su vez una nota de débito. Cualquier otro valor es 400 DOCUMENT_TYPE_INVALID.

  • amendsInvoiceIdstring

    Solo nota de débito: el id de Pleaxy de la factura que modifica.

  • amendsInvoiceNumberstring

    Solo nota de débito: el número del proveedor de la factura que modifica, cuando no se conoce el id de Pleaxy.

  • replacesInvoiceIdsArray<string>

    Una factura de reemplazo (abono y refacturación: el proveedor abona las facturas por completo y las vuelve a facturar): los ids de Pleaxy de las facturas y notas de débito que reemplaza, de 1 a 20, todas de este proveedor. Puede facturar otra orden de compra u otra moneda que ellas. Cada original la lista entonces en replacedByInvoiceIds. Una factura desconocida o de otro proveedor da 404 REPLACES_NOT_FOUND; una nota de crédito, o reemplazos en una nota de débito, dan 400 REPLACES_INVALID.

  • replacesInvoiceNumbersArray<string>

    Una factura de reemplazo: los números del proveedor de las facturas que reemplaza, cuando no se conocen los ids de Pleaxy. De 1 a 20.

  • connectionIdstringObligatorio

    La contraparte a la que se factura: un connectionId de ListInvoiceCounterparties.

  • poIdstring

    Una orden de compra abierta entre exactamente este comprador y este proveedor, de openPurchaseOrders de la contraparte.

  • invoiceNumberstringObligatorio

    De 1 a 64 caracteres: letras, dígitos, '.', '_', '/' y '-', empezando por una letra o un dígito. Único por proveedor dentro del espacio de trabajo del comprador, sin distinguir mayúsculas.

  • invoiceDatestringObligatorio

    YYYY-MM-DD. No puede ser futura ni de hace más de 365 días.

  • dueInDaysnumber

    Condiciones de pago en días, de 0 a 365. Por defecto, las condiciones de pago predeterminadas del contrato al que pertenece la orden de compra (defaultDueInDays de ListInvoiceCounterparties) o, si no, 30.

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

    De 1 a 100 líneas. description tiene de 1 a 200 caracteres, qty es mayor que 0 y como máximo 1.000.000, unitPrice va de 0 a 1.000.000.000. Una reducción es un descuento, nunca un precio negativo: un unitPrice negativo da 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 y charge son totales opcionales de la línea, de 0 o más y sin más decimales de los que permite la moneda del comprador (2 para USD y EUR, ninguno para JPY: si no, 400, p. ej. "taxAmount must be a whole number in JPY."), y el descuento de la línea no puede superar qty × unitPrice + charge. No se acepta null: omite un campo que no aplica. El total después de descuentos debe ser mayor que 0, y el total, como máximo 1.000.000.000.000.000. La línea de la orden de compra que factura la factura se indica una sola vez, en la factura (poLineNo o billsNoPoLine), nunca en sus líneas: el poLineNo o billsNoPoLine propio de una línea se ignora. Incluye el envío y la manipulación en adjustments en lugar de como una línea.

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

    Una línea de IA: qué factura y el mes de uso (YYYY-MM; si se omite, el mes anterior a invoiceDate), con qty en la unidad del medidor (millones de tokens, horas). Cada línea de IA se asocia a la línea de IA de la orden con el mismo alcance y se compara con la condición del contrato, la tarifa y el informe de uso del proveedor; lo que incumple aparece como hallazgos ai_*.

  • poLineNonumber

    Con poId: la línea de la orden de compra que factura esta factura, por su lineNo (de GetPurchaseOrder o de openPurchaseOrders[].lines de ListInvoiceCounterparties). Una factura factura una sola línea de la orden de compra, y todas sus líneas se comparan con ella; para facturar varias líneas de la orden de compra, envía una factura por cada una. Las líneas nunca se asocian a líneas de la orden de compra por su descripción. Contra una orden de compra de una sola línea, una factura que no la indica factura esa línea. Contra una orden de compra de varias líneas, una factura que no indica ninguna es una "discrepancy" (po_line_unassigned) que debe resolver una persona, porque no se pudo comprobar el límite ni el precio de ninguna línea. Un lineNo que la orden de compra no tiene da 400 INVOICE_PO_LINE_UNKNOWN. No se combina con billsNoPoLine (400 INVOICE_PO_LINE_CONTRADICTORY). Una nota de débito sin ella toma la de su original.

  • billsNoPoLineboolean

    Con poId: true cuando la factura no factura ninguna de las líneas de la orden de compra, como un extra no pedido o una tarifa puntual. Solo consume el saldo de la orden de compra, y la factura nunca se aprueba automáticamente. No se combina con poLineNo.

  • adjustmentsArray<{ type, description, amount }>

    Descuentos y cargos a nivel de factura, antes de impuestos. Como máximo 20. type es "discount" o "charge"; description tiene de 1 a 200 caracteres y se guarda sin caracteres de control, saltos de línea ni controles de texto bidireccional; amount es una magnitud positiva, de 0,01 o más, sin más decimales de los que permite la moneda del comprador (type da el signo).

  • taxAmountnumber

    Impuesto total de la factura, tal como lo indica el proveedor. Está incluido en el total de la factura. Pleaxy no calcula impuestos. 0 o más, sin más decimales de los que permite la moneda del comprador. Omítelo cuando la factura no indica impuestos; null se rechaza.

  • currencystring

    ISO 4217, opcional. Solo se comprueba: debe ser la moneda del comprador, que es siempre la que se guarda.

  • pdfBase64string

    PDF de la factura codificado en Base64, hasta 8MB.

  • remittanceInstructionsobject

    Dónde debe pagar el comprador; se guarda con la factura y nunca se cambia después: { method, payeeName, bankName?, iban?, accountNumber?, bic?, routingNumber?, mailingAddress?, paymentReference?, notes? }. method es bank_transfer (necesita iban o accountNumber), wire (iban o accountNumber, más bic o routingNumber), ach (accountNumber y un routingNumber ABA de 9 dígitos), check (mailingAddress) u other (notes). Pleaxy nunca lo verifica; se avisa al comprador cuando el beneficiario o la cuenta difieren de la factura anterior de este proveedor.

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

    Opcional. Impuestos que el comprador retiene de lo que paga (retenciones, p. ej. ISR retenido), en la moneda de la factura. Reducen el importe adeudado, nunca el total ni su impuesto. Junto con las deducciones, deben ser menos que el total. Como máximo 20.

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

    Opcional. Lo que ya se pagó de la factura después de impuestos: kind "prepayment" para un depósito o anticipo que pagó el comprador (necesita una reference, o un sourceInvoiceId que indique tu factura pagada de la misma orden de compra, cuya referencia y fecha de pago se completan entonces y que la orden de compra consume una sola vez), o kind "credit" para un crédito que aplicaste en la factura. Reducen el importe adeudado, nunca el total ni su impuesto. Junto con las retenciones, deben ser menos que el total; no se combina con paymentCurrencyAmount. Como máximo 20. UBL: cbc:PrepaidAmount; cXML: DepositAmount.

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

    Opcional. Impuestos por tipo en la moneda de la factura, p. ej. [{ "description": "IVA", "rate": 21, "amount": 199.50 }, { "description": "Percepción IIBB", "amount": 28.50 }]. rate es un porcentaje y es opcional. Deben sumar taxAmount, que entonces es obligatorio (400 TAX_BREAKDOWN_MISMATCH). Como máximo 20. Solo informativo. UBL: los TaxSubtotals del TaxTotal en la moneda del documento, que se conservan cuando cuadran.

  • paymentCurrencyAmountobject

    Opcional. Solo cuando la factura indica el importe adeudado en otra moneda (p. ej. AWS facturando a un cliente argentino en ARS); entonces totalAmount es el importe adeudado, que usan las cuentas por pagar, los pagos y el registro de pago: { currencyCode, totalAmount, totalAmountBeforeTax?, amountBreakdown?: { subTotalAmount?, discounts?, fees?, taxes? }, currencyExchangeDetails: { rate, rateDate?, rateSource?, sourceCurrencyCode?, targetCurrencyCode? } }, la misma forma que PaymentCurrencyAmount de AWS Invoicing. rate es 1 unidad de la moneda de la factura = rate currencyCode, tal como figura en la factura. Omítelo cuando la factura se convierte al tipo de la fecha de pago. Cada cifra indicada debe estar dentro del 0,5% (o de una unidad menor) de la cifra de la factura × rate (400 STATED_AMOUNT_RATE_MISMATCH, con ambas cifras), cada desglose debe sumar su total, y currencyCode no puede ser la moneda de la propia factura (400 SAME_CURRENCY). rateDate es YYYY-MM-DD, no futura y como máximo un día posterior a la fecha de la factura. UBL: cbc:PaymentCurrencyCode con cac:PaymentExchangeRate; cXML: Money@alternateCurrency/alternateAmount en DueAmount. Se registra tal como se indica; Pleaxy no convierte nada.

  • taxCurrencyAmountobject

    Opcional. Impuestos en la moneda de curso legal del país del comprador cuando no es la moneda de la factura. Misma forma que paymentCurrencyAmount; amountBreakdown.taxes.totalAmount es obligatorio y totalAmount es opcional. Necesita taxAmount. UBL: el cac:TaxTotal de cbc:TaxCurrencyCode con cac:TaxExchangeRate o, sin él (EN 16931 BT-111), un tipo derivado de los dos totales de impuestos; cXML: Money@alternateAmount en Tax. Un tipo derivado tiene rateSource "derived" y no se comprueba con los importes de los que salió. Solo informativo.

Devuelve

201 Created con el objeto que se muestra en la respuesta.

Más detalles

Se envía como cuerpo application/json con un connectionId; la misma ruta sin él es SubmitInvoice. Reemplazó a POST /v1/workspaces/{regionId}/invoices/manual, que ahora devuelve 410 ROUTE_MERGED. Registra una factura para una contraparte activa de ListInvoiceCounterparties: un proveedor que factura a uno de sus compradores, o un comprador que registra la factura de uno de sus proveedores. La factura se guarda en el espacio de trabajo del comprador, en la moneda del comprador, para que ambos lados la vean. El servidor calcula el importe de cada línea como qty × unitPrice + charge − discount, y el total como las líneas, menos los descuentos a nivel de factura, más los cargos a nivel de factura, más taxAmount. Cada cifra calculada se redondea hacia arriba desde la mitad a la unidad menor de la moneda del comprador: al céntimo para USD y EUR, a unidades enteras para JPY (3 × 333,33 JPY da un importe de línea de 1000). Ese total es el importe que se concilia, se aprueba, se limita y se paga. Con poId queda "pending" cuando existe una cifra de facturación en vivo para el proveedor de la orden de compra y, si no, "unverified" con unverifiedReason "no_billing_connection" (solo en la vista del comprador); sin poId queda "unverified" con unverifiedReason "no_purchase_order". Un comprador que registra una factura no puede aprobarla, resolverla, exportarla ni registrar su pago, salvo que nadie más en el espacio de trabajo pueda hacerlo, y pagarla con Stripe siempre requiere a otra persona.

Llamadores compradores: una sesión iniciada o una X-Api-Key de un espacio de trabajo de comprador. Quien la registró y, en el caso de una clave, también la persona que creó la clave no pueden aprobarla, resolverla, exportarla ni registrar su pago, salvo que una persona con sesión iniciada sea la única del espacio de trabajo que podría hacerlo; pagarla con Stripe siempre requiere a otra persona. Llamadores proveedores: solo sesión iniciada; una clave de API de proveedor recibe 400 SUPPLIER_DIRECT_INVOICE_RETIRED.

Campos de la respuesta

  • sourcestring

    Siempre "manual" para este endpoint.

  • amountnumber

    El total a pagar: las líneas después de sus propios descuentos y cargos, menos los descuentos a nivel de factura, más los cargos a nivel de factura, más taxAmount. Lo usan la conciliación, la aprobación, la autonomía, los topes de contrato y la liquidación.

  • lineItemsArray

    Cada línea tal como se guardó. amount es la línea neta, antes de impuestos; discount y charge solo aparecen en una línea que los tiene.

  • adjustmentsArray

    Descuentos y cargos a nivel de factura. Ausente si no hay ninguno.

  • taxAmountnumber

    El impuesto indicado, ya incluido en amount. Solo informativo: ninguna decisión lo lee. Ausente si no se indicó ninguno.

  • currencystring

    La moneda del comprador.

Errores

  • 400 Bad Request - El cuerpo no supera la validación (incluidos más de 20 ajustes, un taxAmount negativo o más de 2 decimales en un descuento, cargo, ajuste o taxAmount), INVOICE_DOCUMENT_INVALID (un unitPrice negativo; un descuento de línea mayor que su línea: "Line 2's discount (12.00 USD) is more than the line (10.00 USD). Check lineItems[1].discount."; un total después de descuentos que no es mayor que 0: "The invoice total after discounts must be greater than zero."; un total superior a 1.000.000.000.000.000; o más decimales de los que permite la moneda del comprador en un descuento, cargo, ajuste o taxAmount ("lineItems[0].discount must be a whole number in JPY.")), invoiceDate está fuera de rango (INVOICE_DATE_OUT_OF_RANGE), la contraparte aún no está conectada (COUNTERPARTY_NOT_ACTIVE), poId no se puede facturar (PO_NOT_INVOICEABLE), poLineNo es una línea que la orden de compra no tiene (INVOICE_PO_LINE_UNKNOWN) o viene con billsNoPoLine (INVOICE_PO_LINE_CONTRADICTORY), o currency no es la del comprador (INVOICE_CURRENCY_MISMATCH).
  • 404 Not Found - El llamador no ve ninguna contraparte con este connectionId.
  • 409 Conflict - Este proveedor ya tiene una factura con este número (INVOICE_NUMBER_TAKEN).
  • 400 Bad Request - El cuerpo tiene un amount (AMOUNT_NOT_ACCEPTED: "Leave amount off: Pleaxy computes the total from the line items."), o llamó un proveedor con una clave de API (SUPPLIER_DIRECT_INVOICE_RETIRED).
  • 403 Forbidden - La credencial no da acceso a este espacio de trabajo, o el rol de compras de un llamador comprador no puede crear facturas.
  • 422 Unprocessable Entity - La contraparte es el propio perfil de comprador o proveedor del llamador (SELF_DEALING).
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
POST /v1/workspaces/{regionId}/invoices
Solicitud
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"
}
Respuesta · 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 } } ]
}

Obtener tipos de cambio

Devuelve los tipos de cambio que se usan para comparar importes con tus límites.

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

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Los tipos que Pleaxy usa solo para comparar órdenes y facturas en otras monedas con tus umbrales de aprobación, condiciones de importe, límites de aprobación automática, reglas de automatización y límites de gasto. Los importes, las facturas y los pagos nunca se convierten. Una fila por cada moneda que usan tus órdenes, facturas y proveedores: el tipo de referencia a la moneda de tu espacio de trabajo (un tipo diario de Exchange Rate API, que se usa mientras tenga como máximo 3 días de antigüedad). Los espacios de trabajo no pueden definir sus propios tipos. Sin un tipo reciente, un documento en esa moneda pasa por todos los pasos de aprobación y nunca se aprueba automáticamente. Una cadena construida con un tipo lo registra como approval.fx: { from, to, rate, source: provider | none, asOf, controlAmount, supplierStated? }. Cuando una factura indica su propia cifra en la moneda de tu espacio de trabajo (su paymentCurrencyAmount, o su total al tipo de su taxCurrencyAmount), controlAmount es la mayor entre esa cifra y la cifra al tipo de referencia, de modo que un tipo indicado bajo no puede rebajar el enrutamiento; supplierStated { amount, rateSource, rateDate } muestra la cifra de la factura. Sin un tipo de referencia reciente, la cadena sigue pasando por todos los pasos de aprobación, nunca según la cifra de la factura. Una factura cuyo tipo indicado se aleja más de warningPct del tipo de referencia cuando llega lleva rateWarnings (solo en la vista del comprador); nunca la bloquean. Tipos de Exchange Rate API (https://www.exchangerate-api.com).

Solo sesión iniciada, con acceso 'view' a la configuración de aprobación. Una clave de API recibe 403 HUMAN_SESSION_REQUIRED: las condiciones del proveedor de tipos no permiten ofrecer sus tipos a través de una API.

Errores

  • 403 Forbidden - Una clave de API (HUMAN_SESSION_REQUIRED), un llamador proveedor o un rol de compras sin 'view' en la configuración de aprobación.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
GET /v1/workspaces/{regionId}/exchange-rates
Solicitud
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/exchange-rates" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 200 OK
{
   "workspaceCurrency": "string",
   "warningPct": number,
   "rows": [
      { "currency": "string", "providerRate": number, "providerAsOf": "string" }
   ],
   "provider": { "asOf": "string", "fresh": boolean, "attribution": { "text": "string", "url": "string" } }
}

Configurar advertencia de tipo de cambio

Define cuándo el tipo de cambio propio de una factura recibe una advertencia.

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

Cuerpo

  • warningPctnumberObligatorio

    De 0 a 100.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Define cuánto, en porcentaje, puede alejarse el tipo indicado por una factura (el tipo de su paymentCurrencyAmount o taxCurrencyAmount) del tipo de referencia (un tipo diario reciente de Exchange Rate API) antes de que la factura lleve rateWarnings. Por defecto, 5. Se comprueba cuando llega una factura; las facturas ya recibidas conservan sus advertencias. Una advertencia nunca bloquea una factura. Sin un tipo de referencia reciente no hay nada que comparar ni advertencia.

Solo sesión iniciada (una clave de API recibe 403 HUMAN_SESSION_REQUIRED), con acceso 'edit' a la configuración de aprobación: administradores.

Errores

  • 400 Bad Request - Falta warningPct o no es un número de 0 a 100.
  • 403 Forbidden - Una clave de API, un llamador proveedor o un rol de compras sin 'edit' en la configuración de aprobación.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
PUT /v1/workspaces/{regionId}/exchange-rates
Solicitud
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
}
Respuesta · 200 OK
{
   "warningPct": number
}

Obtener tipo de referencia

Devuelve el tipo de cambio de referencia para una fecha.

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

Parámetros

  • fromstringObligatorio

    Código ISO 4217: la moneda de la factura.

  • tostringObligatorio

    Código ISO 4217: la moneda de pago o de impuestos.

  • datestring

    YYYY-MM-DD, la fecha de la factura. Por defecto, hoy.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

El tipo de referencia de 1 from a to en la fecha de una factura: el tipo diario de Exchange Rate API para esa fecha, o el más reciente de los 3 días anteriores, nunca el de un día posterior. Sin fecha, el de hoy, mientras tenga como máximo 3 días de antigüedad. El formulario Nueva factura lo usa para sugerir el tipo de una moneda de pago o de impuestos; la factura registra el tipo y las cifras que se envíen, y Pleaxy comprueba que concuerden. reference no aparece cuando no hay tipo (misma moneda, una moneda desconocida o ninguna instantánea para esa fecha). Tipos de Exchange Rate API (https://www.exchangerate-api.com).

Solo sesión iniciada, con acceso 'create' a las facturas. Una clave de API recibe 403 HUMAN_SESSION_REQUIRED: las condiciones del proveedor de tipos no permiten ofrecer sus tipos a través de una API.

Errores

  • 400 Bad Request - from o to no es un código ISO 4217 de 3 letras, o date no tiene el formato YYYY-MM-DD.
  • 403 Forbidden - Una clave de API (HUMAN_SESSION_REQUIRED) o un rol sin 'create' en las facturas.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
GET /v1/workspaces/{regionId}/reference-rate
Solicitud
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/reference-rate" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 200 OK
{
   "reference": {
      "from": "string",
      "to": "string",
      "rate": number,
      "date": "string",
      "source": "string",
      "attribution": { "text": "string", "url": "string" }
   }
}

Configurar monedas de proveedor

Define las monedas en las que un proveedor factura y cobra.

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

Parámetros

  • connectionIdstringObligatorio

    La conexión de proveedor.

Cuerpo

  • billingCurrencystring | null

    ISO 4217. Solo para un proveedor sin cuenta en Pleaxy; uno con cuenta define sus propias monedas.

  • paymentCurrencystring | null

    ISO 4217. Para un proveedor con cuenta, una en la que acepte cobrar.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Define dos valores predeterminados para un proveedor: "Factura en" (billingCurrency), la moneda en la que te factura un proveedor sin cuenta en Pleaxy, que se usa para sus nuevas órdenes y facturas; y "Pagar en" (paymentCurrency), la moneda en la que sueles pagarle, que se sugiere como moneda de pago de una nueva factura. Si falta, el campo no cambia; null lo elimina. Las órdenes y facturas existentes conservan sus monedas. El proveedor nunca ve ninguna de las dos.

Sesión iniciada o X-Api-Key de un espacio de trabajo de comprador, con acceso 'edit' a los proveedores: administrator o contracts-and-suppliers.

Errores

  • 400 Bad Request - Un código que no es ISO 4217, billingCurrency para un proveedor con cuenta (BILLING_CURRENCY_SUPPLIER_OWNED) o una paymentCurrency que no acepta (PAYMENT_CURRENCY_NOT_ACCEPTED).
  • 403 Forbidden - Un llamador proveedor o un rol de compras sin 'edit' en los proveedores.
  • 404 Not Found - No existe esa conexión en este espacio de trabajo.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
PUT /v1/workspaces/{regionId}/supplier-connections/{connectionId}/currencies
Solicitud
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
}
Respuesta · 200 OK
{
   "id": "string",
   "supplierName": "string",
   "billingCurrency": "string",
   "paymentCurrency": "string"
}

Configurar feed de facturas

Activa o desactiva las facturas automatizadas de un proveedor.

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

Parámetros

  • connectionIdstringObligatorio

    La conexión de proveedor.

Cuerpo

  • enabledbooleanObligatorio

    true para aceptar las facturas automatizadas de este proveedor, false para detenerlas.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Activa o desactiva las facturas automatizadas (SubmitFeedInvoice) de un proveedor para una conexión aprobada. Están activadas desde el momento en que apruebas la incorporación del proveedor (las conexiones aprobadas antes del 9 de octubre de 2026 conservan el valor que tenían); este es el botón de parada. Desactivarlas rechaza la siguiente solicitud del proveedor; las facturas ya recibidas permanecen en Facturas y conciliación y siguen avanzando en la aprobación. Se notifica al proveedor (invoice_feed_changed). Definir el valor que ya tiene no cambia nada. Devuelve la conexión con invoiceFeedEnabled, invoiceFeedUpdatedAt e invoiceFeedUpdatedBy. ListInvoiceCounterparties muestra la configuración actual y el estado de preparación de cada conexión.

Solo sesión iniciada (una clave de API recibe 403), con acceso 'edit' a las facturas: administrator o finance.

Errores

  • 400 Bad Request - La conexión aún no está aprobada (COUNTERPARTY_NOT_ACTIVE), o enabled no es un booleano.
  • 403 Forbidden - Una clave de API en lugar de una sesión iniciada, un llamador proveedor o un rol de compras sin 'edit' en las facturas (read-only, contracts-and-suppliers, relationships, requisitions).
  • 404 Not Found - No existe ninguna conexión con este id en el espacio de trabajo.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
PUT /v1/workspaces/{regionId}/supplier-connections/{connectionId}/invoice-feed
Solicitud
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
}
Respuesta · 200 OK
{
   "id": "string",
   "supplierName": "string",
   "status": "approved",
   "invoiceFeedEnabled": boolean,
   "invoiceFeedUpdatedAt": "string",
   "invoiceFeedUpdatedBy": "string"
}

Listar intentos de feed

Lista los intentos de facturas automatizadas de una conexión.

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

Parámetros

  • connectionIdstringObligatorio

    La conexión de proveedor.

  • beforestring

    El cursor de la última fila de la página que tienes, para obtener la siguiente. 50 filas por página.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

El registro de intentos de las facturas automatizadas de una conexión: cada llamada a SubmitFeedInvoice o ValidateFeedInvoice que llegó a la conexión, de la más reciente a la más antigua, con lo que respondió Pleaxy. Un rechazo anterior a conocer la conexión (sin clave, ámbito incorrecto, el límite de frecuencia de la clave, una conexión que no es del llamador) no se puede atribuir a ninguna y no se registra. El documento en sí nunca se guarda. El proveedor lee sus propias conexiones; el comprador, las de los proveedores que aprobó; ambos ven las mismas filas. Las filas se conservan 90 días. La propia conexión (ListSupplierConnections, ListInvoiceCounterparties con ?perConnection=true) refleja la última de cada tipo: feedLastAttemptAt, feedLastAcceptedAt, feedAcceptedCount, feedLastRefusedAt, feedLastRefusedCode, feedLastValidAt, feedValidCount.

Sesión iniciada o clave de API. Un llamador comprador necesita acceso 'view' a los proveedores.

Campos de la respuesta

  • modestring

    "submit" para la ruta real, "validate" para la de prueba.

  • formatstring

    Se conoce una vez analizado el cuerpo; ausente si la llamada se rechazó antes.

  • outcomestring

    "accepted" (201, se creó una factura), "replayed" (200, el mismo documento otra vez), "valid" (una prueba superada), "refused" (cualquier error una vez conocida la conexión, incluido un feed desactivado).

  • status, code, messagenumber, string, string

    La respuesta que recibió el llamador: el estado HTTP y, en un rechazo, su código y su mensaje tal como se devolvieron.

  • messageId, paramsstring, object

    En un rechazo, el messageId y los params del error tal como se devolvieron, para mostrarlo en el idioma de tu lector. Ausente en filas registradas antes de que se guardaran.

  • invoiceNumberstring

    Tu número de factura, si el análisis llegó hasta ahí.

  • invoiceIdstring

    La factura creada o reenviada; en una prueba superada, la factura que ya identifica un número reenviado.

  • creditNoteIdstring

    La nota de crédito creada o reenviada, cuando el documento era una nota de crédito; invoiceNumber es entonces su número.

  • keyIdstring

    El id de la clave de API (nunca su secreto), para cotejarlo con ListApiKeys.

  • beforestring

    El cursor de la última fila cuando puede haber filas más antiguas; ausente en la última página.

Errores

  • 400 Bad Request - before no es un cursor de una página anterior.
  • 403 Forbidden - El rol de compras de un llamador comprador no puede ver proveedores (requisitions).
  • 404 Not Found - Ninguna conexión con este id es tuya.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
GET /v1/workspaces/{regionId}/supplier-connections/{connectionId}/feed-attempts
Solicitud
curl "$PLEAXY_API_BASE_URL/v1/workspaces/reg_01k5x8p9j3q7vn2mhb4tzc6rde.supplier/supplier-connections/SC-1A2B3C4D/feed-attempts" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 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"
    }
  ]
}

Ejecutar conciliación de factura

Compara una factura con el consumo de nube medido.

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

Devuelve

201 Created con el objeto que se muestra en la respuesta.

Más detalles

Ejecuta la conciliación a 3 bandas: compara el importe facturado (amount) con el consumo medido (usageAmount, en usageCurrency, la moneda propia del proveedor, de una conexión de facturación en vivo). Solo se compara una cifra real: una factura pendiente antigua sin cifra de consumo real pasa a "unverified" (unverifiedReason "no_billing_connection"), sin cadena de aprobación. Solo una cifra de una factura de AWS emitida permite que la autonomía o una regla de automatización la apruebe sin que nadie intervenga; una conciliación con cualquier otra fuente se envía a una persona. Dentro de la tolerancia (3%), la factura pasa a matched y se construye una cadena de aprobación. Fuera de la tolerancia, se resuelve automáticamente como matched si el exceso cumple los requisitos de autonomía; si no, pasa a discrepancy (discrepancyReason "amount") y espera a ResolveInvoiceDiscrepancy. Pleaxy no convierte monedas: cuando el consumo está en una moneda distinta de la de la factura, no se compara nada y no se aplica ninguna autonomía ni regla de automatización; la factura pasa a discrepancy con discrepancyReason "currency" y necesita ResolveInvoiceDiscrepancy. Una factura contra una orden de compra que no es de un proveedor de nube no tiene consumo que comparar: se crea como pending con matchBasis "purchase_order" cuando supera las comprobaciones de su orden de compra y su contrato, y esta operación construye su cadena de aprobación: matched, siempre con un aprobador humano, nunca con autonomía ni regla de automatización. Una que se creó como "unverified" (unverifiedReason "no_billing_connection") antes de eso se vuelve a comprobar con su orden de compra y su contrato: matched, o discrepancy con discrepancyReason "controls". El solicitante de la cadena de aprobación es el llamador autenticado (una clave de API se registra como apikey:<keyId>), nunca un nombre que se pase; la solicitud no lleva cuerpo.

Campos de la respuesta

  • matchStatusstring

    "matched" o "discrepancy" después de ejecutar la conciliación, o "unverified" para una factura pendiente antigua sin cifra de consumo real.

  • discrepancyReasonstring

    Solo se define en una discrepancia: "amount" (fuera de tolerancia), "currency" (consumo en otra moneda, nunca comparado) o "controls" (incumple su orden de compra o su contrato).

  • matchBasisstring

    "purchase_order" cuando la factura se concilió con una orden de compra que no es de un proveedor de nube en lugar de con el consumo. Ausente en una conciliación por consumo.

Errores

  • 400 Bad Request - El matchStatus de la factura no es "pending" (ni "unverified" contra una orden de compra que no es de un proveedor de nube). Para cualquier otra factura no verificada (sin orden de compra o sin conexión de facturación): "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." En otro caso: "Invoice '{invoiceId}' has already been matched (result: {matchStatus})."
  • 404 Not Found - No existe ninguna factura con este id en el espacio de trabajo.
  • 409 Conflict - Otra ejecución o decisión se produjo a la vez; vuelve a leer la factura.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/run-match
Solicitud
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/run-match" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 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 } } ]
}

Resolver discrepancia de factura

Envía a aprobación una factura con discrepancia ya revisada.

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

Devuelve

201 Created con el objeto que se muestra en la respuesta.

Más detalles

Anulación manual para una factura que ha revisado una persona: inicia una cadena de aprobación normal (sin autonomía) para una factura con discrepancia o no verificada. Una discrepancia pasa a "matched"; una factura no verificada sigue como "unverified" con su cadena pendiente, porque no se comprobó nada. El solicitante de la cadena de aprobación es el llamador autenticado (una clave de API se registra como apikey:<keyId>), nunca un nombre que se pase; la solicitud no lleva cuerpo.

Una clave de API puede resolver una discrepancia de importe o de moneda. Solo una sesión iniciada puede resolver una factura no verificada, con cualquier unverifiedReason; una clave de API recibe 403 HUMAN_REVIEW_REQUIRED.

Errores

  • 400 Bad Request - El matchStatus de la factura no es "discrepancy" ni "unverified".
  • 403 Forbidden - HUMAN_REVIEW_REQUIRED: la factura no está verificada y el llamador es una clave de API ("An unverified invoice has nothing to match it against, so a person must review it. Sign in to Pleaxy to resolve it."). No se cambia nada.
  • 404 Not Found - No existe ninguna factura con este id en el espacio de trabajo.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/resolve-discrepancy
Solicitud
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/resolve-discrepancy" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 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 } } ]
}

Aprobar factura

Aprueba el paso de aprobación actual de una factura.

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

Devuelve

201 Created con el objeto que se muestra en la respuesta.

Más detalles

Hace avanzar una etapa la cadena de aprobación de la factura. Solo puede llamarlo el empleado que indica el paso actual: ningún rol, permiso ni derecho de administrador sustituye a estar nombrado, y una clave de API nunca puede estar nombrada. Una aprobación completada envía al proveedor una notificación invoice_approved. No lleva cuerpo y actúa como el llamador autenticado (una clave de API actúa como apikey:<keyId>).

Solo sesión iniciada. Cualquier otro llamador, incluida una clave de API, recibe 403 HUMAN_APPROVAL_REQUIRED antes de que se lea nada.

Errores

  • 400 Bad Request - La factura no tiene ninguna etapa de aprobación pendiente.
  • 403 Forbidden - Código HUMAN_APPROVAL_REQUIRED. El llamador es una clave de API. Los pasos de aprobación nombran a un empleado concreto y una clave nunca puede serlo, así que una clave no puede aprobar ni rechazar un paso. Pide al empleado que indica el paso que actúe sobre él en Pleaxy.
  • 403 Forbidden - Código APPROVER_NOT_ASSIGNED. El paso actual no tiene aprobador asignado, así que nadie puede actuar sobre él. Un administrador debe asignar uno antes con ReassignPurchaseOrderApprovalStage / ReassignInvoiceApprovalStage.
  • 403 Forbidden - El llamador no es el empleado que indica el paso actual. Solo ese empleado puede aprobarlo o rechazarlo: ningún rol ni permiso sustituye a estar nombrado.
  • 404 Not Found - No existe ninguna factura con este id en el espacio de trabajo.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/approve
Solicitud
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/approve" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 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 } } ]
}

Rechazar factura

Rechaza una factura, con un motivo que ve el proveedor.

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

Cuerpo

  • reasonCodestringObligatorio

    Uno de amount_incorrect, not_ordered_or_not_received, duplicate, missing_or_wrong_po, wrong_billing_entity, other. El proveedor ve su etiqueta.

  • reasonstringObligatorio

    La nota que ve el proveedor: qué debe corregir. Los saltos de línea pasan a ser espacios y se eliminan los caracteres de control e invisibles. Después debe tener al menos 10 letras o números y como máximo 500 caracteres. Texto plano; nunca se muestra como enlace. No incluyas datos personales ni comentarios internos.

Devuelve

201 Created con el objeto que se muestra en la respuesta.

Más detalles

Rechaza la factura en su etapa de aprobación actual, con un motivo que ve el proveedor. Solo puede llamarlo el empleado que indica el paso actual. Una factura no verificada o con discrepancia que aún no tiene cadena de aprobación es un caso aparte: cualquier comprador con invoices:edit puede rechazarla, salvo el comprador que la registró. Solo sesiones iniciadas: una clave de API no puede rechazar. El proveedor ve el motivo y la nota palabra por palabra, pero no quién la rechazó, y recibe una notificación que indica solo el motivo. El rechazo se guarda en la factura como `rejection`. Rechazar una factura que ocupa la orden de compra reabre esa orden de compra en la misma escritura, para que el proveedor pueda enviar contra ella una factura corregida: esta recibe el id INV-<PO suffix>-R<n> y `replacesInvoiceId`, y necesita un número de factura nuevo, porque la factura rechazada conserva el suyo.

Errores

  • 400 Bad Request - La factura no tiene ninguna etapa de aprobación pendiente.
  • 400 Bad Request - Código INVOICE_REJECTION_REASON_INVALID. Falta reasonCode o no es uno de los seis códigos, o falta reason, no es una cadena, tiene menos de 10 letras o números o supera los 500 caracteres una vez limpiado.
  • 403 Forbidden - Código HUMAN_APPROVAL_REQUIRED: "Rejecting needs you, signed in to Pleaxy." El llamador es una clave de API. Rechazar es una decisión que ve el proveedor, así que necesita a una persona con sesión iniciada.
  • 403 Forbidden - Código APPROVER_NOT_ASSIGNED. El paso actual no tiene aprobador asignado, así que nadie puede actuar sobre él. Un administrador debe asignar uno antes con ReassignPurchaseOrderApprovalStage / ReassignInvoiceApprovalStage.
  • 403 Forbidden - El llamador no es el empleado que indica el paso actual. Solo ese empleado puede aprobarlo o rechazarlo: ningún rol ni permiso sustituye a estar nombrado.
  • 404 Not Found - No existe ninguna factura con este id en el espacio de trabajo.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/reject
Solicitud
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"
}
Respuesta · 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 } } ]
}

Reasignar etapa de aprobación de factura

Asigna un paso de aprobación pendiente a otra persona.

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

Cuerpo

  • stageIdstringObligatorio

    Id del paso pendiente que se reasigna. Puede estar en cualquier grupo de la cadena, no solo en el actual.

  • approverEmployeeKeystringObligatorio

    Clave de empleado (sub de Cognito) del nuevo aprobador. Debe ser un miembro comprador de este espacio de trabajo y no el administrador que actúa.

  • reasonstring

    Por qué se reasignó el paso, hasta 280 caracteres. Se muestra en el historial de aprobación.

Devuelve

201 Created con el objeto que se muestra en la respuesta.

Más detalles

El equivalente para facturas de ReassignPurchaseOrderApprovalStage: hace que un paso pendiente de la cadena de aprobación de esta factura apunte a otro empleado nombrado. Solo para administradores (approvalSettings:edit), solo con sesión iniciada, limitado al documento y registrado en el historial de aprobación. Así se desbloquea una factura vinculada a un proveedor que, por cierre seguro, quedó en un paso "Aprobación manual" sin asignar.

Errores

  • 400 Bad Request - La cadena ya está aprobada o rechazada; el paso ya se aprobó o rechazó; el nuevo aprobador no es empleado de este espacio de trabajo; el nuevo aprobador creó la orden o registró la factura, está excluido por separación de funciones, ya superó el límite de gasto con su propia autoridad o ya ocupa otro puesto en el mismo paso; o el paso es la revisión del límite de gasto, cuyo aprobador es un hecho de auditoría fijo (cámbialo en Configuración › Límites de gasto).
  • 403 Forbidden - El llamador no tiene approvalSettings:edit (administrador) o se nombró a sí mismo como nuevo aprobador: asignarte un paso activo convierte a una sola persona en toda la cadena sin rastro de política. Código HUMAN_APPROVAL_REQUIRED cuando el llamador es una clave de API: solo un administrador con sesión iniciada puede reasignar un paso de aprobación.
  • 404 Not Found - No existe ningún documento con este id en el espacio de trabajo, o la cadena no tiene ningún paso con este stageId.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/approval/reassign
Solicitud
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"
}
Respuesta · 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 } } ]
}

Registrar pago

Registra que una factura se pagó fuera de Pleaxy.

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

Cuerpo

  • methodstringObligatorio

    Cómo se pagó: ach, wire, check, card u other.

  • paymentDatestringObligatorio

    YYYY-MM-DD en que se envió el pago. No posterior a hoy en la zona horaria del espacio de trabajo del comprador, ni anterior a la fecha de la factura.

  • referencestringObligatorio

    La referencia del banco o de la herramienta de pago, como un número de rastreo ACH o un número de cheque, de 1 a 64 caracteres una vez limpiada. El proveedor la ve. Nunca un número de cuenta bancaria.

  • currencystring

    Solo para un pago en una moneda distinta de la del importe adeudado: ISO 4217. Necesita amount y rate.

  • amountnumber

    Con currency: lo que se pagó, en currency. El importe adeudado × rate, con un margen del 0,5% o de una unidad menor.

  • ratenumber

    Con currency: 1 {moneda del importe adeudado} = rate {currency}, el tipo al que se hizo el pago.

  • rateDatestring

    Con currency: YYYY-MM-DD al que corresponde el tipo, no posterior a hoy. Por defecto, paymentDate.

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

    Un aviso de pago para el proveedor, enviado con la notificación del pago: una nota, un comprobante de pago subido con RequestRemittanceUpload, o ambos. Mismas reglas que SendRemittance.

  • confirmReplacedboolean

    True para registrarlo igualmente cuando la factura está reemplazada (abono y refacturación) y sus notas de crédito no la cubren por completo: pagarla además de su reemplazo supone pagar dos veces.

Devuelve

201 Created con el objeto que se muestra en la respuesta.

Más detalles

Registra que una factura aprobada se pagó fuera de Pleaxy, con el método, la fecha y la referencia. No mueve dinero ni comprueba que el pago se haya hecho. Un pago cubre el importe adeudado completo: el paymentCurrencyAmount.totalAmount de la factura cuando indica uno y, si no, su amount, en esa moneda. No se puede registrar un pago parcial. ¿Se pagó en una moneda distinta de la del importe adeudado? Envía también amount, currency y rate: el importe debe ser el importe adeudado × rate, con un margen del 0,5% o de una unidad menor, y se registra como paidAmount; Pleaxy no convierte nada. La factura figura como pagada, y se notifica al proveedor que el comprador registró el pago, y recibe un aviso de pago marcado como registrado por el comprador y no realizado a través de Pleaxy. También funciona con una factura exportada, lo que completa su exportación. Registrar de nuevo los mismos datos responde 200 con alreadyRecorded: true y no cambia nada. Opcionalmente, envía con él un aviso de pago al proveedor (remittance), como hace SendRemittance.

Una sesión iniciada con acceso 'edit' a las facturas. Cambiado el 2026-09-24, una corrección de seguridad dentro de v1: una clave de API no puede registrar un pago (403 HUMAN_SESSION_REQUIRED). La persona que registró la factura y los miembros del perfil del proveedor no pueden registrar su pago.

Errores

  • 400 Bad Request - Falta un campo o no es válido (códigos PAYMENT_METHOD_INVALID, PAYMENT_DATE_INVALID, PAYMENT_DATE_IN_FUTURE, PAYMENT_DATE_BEFORE_INVOICE, PAYMENT_REFERENCE_INVALID), el importe pagado no encaja (PAID_AMOUNT_SAME_CURRENCY: currency es la propia moneda del importe adeudado, así que omite amount, currency y rate; PAID_AMOUNT_INVALID: falta amount o rate o no es mayor que 0, o rateDate no es válida; PAID_AMOUNT_RATE_MISMATCH: amount no es el importe adeudado × rate), el aviso de pago no es válido (como en SendRemittance) o el cuerpo lleva un campo que no se acepta.
  • 403 Forbidden - Código HUMAN_SESSION_REQUIRED: el llamador es una clave de API. O un rechazo por separación de funciones: el llamador registró la factura o es miembro del perfil del proveedor.
  • 404 Not Found - No existe ninguna factura con este id en el espacio de trabajo.
  • 409 Conflict - Código PAYMENT_ALREADY_RECORDED (ya hay registrado un pago distinto: retíralo primero), STRIPE_PAYMENT_IN_PROGRESS (se inició un pago a través de Pleaxy con Stripe), EXPORT_COOLING_OFF (su exportación se retiró; vuelve a intentarlo el siguiente día hábil), REPLACED_UNCREDITED (la factura está reemplazada y sus notas de crédito no la cubren por completo: compruébalo con el proveedor y luego envía confirmReplaced: true) o PAYMENT_CHANGED.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/payment-record
Solicitud
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
}
Respuesta · 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 } } ]
}

Retirar registro de pago

Retira un pago registrado.

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

Cuerpo

  • confirmbooleanObligatorio

    Debe ser true.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Retira el registro de un pago hecho por el comprador. La factura vuelve a figurar como impagada y se avisa al proveedor de que se retiró el registro. Esto no cancela ni revierte el pago en sí. El aviso de pago se marca entonces como Retirado.

Una sesión iniciada con acceso 'edit' a las facturas; una clave de API recibe 403 HUMAN_SESSION_REQUIRED.

Errores

  • 403 Forbidden - Código HUMAN_SESSION_REQUIRED, o un rechazo por separación de funciones.
  • 404 Not Found - No existe ninguna factura con este id, o código NO_PAYMENT_RECORD: no hay ningún pago registrado para ella.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
DELETE /v1/workspaces/{regionId}/invoices/{invoiceId}/payment-record
Solicitud
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
}
Respuesta · 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 } } ]
}

Exportar facturas para pago

Exporta en CSV las facturas aprobadas e impagadas para tu lote de pagos.

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

Cuerpo

  • invoiceIdsstring[]

    Opcional: exportar solo estas facturas, de 1 a 1000 ids. Si se omite (o el cuerpo está vacío), todas las facturas elegibles. Cualquier otro campo da 400.

  • confirmReplacedboolean

    Con invoiceIds: exportar igualmente una factura reemplazada (abono y refacturación) que sus notas de crédito no cubren por completo. Sin invoiceIds, una factura así siempre se omite.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Descarga en CSV las facturas aprobadas e impagadas para tu propio lote de pagos, primero por fecha de vencimiento, hasta 1000: todas las facturas elegibles, o solo las que indiques en invoiceIds (una no elegible se omite). Cada factura exportada queda bloqueada hasta que se registra su pago o se retira la exportación, para que no se pueda exportar ni registrar dos veces. El archivo no contiene datos bancarios. El proveedor no ve la exportación. Encabezados de respuesta: X-Pleaxy-Export-Id, X-Pleaxy-Export-Count, X-Pleaxy-Export-Truncated.

Una sesión iniciada con acceso 'edit' a las facturas; una clave de API recibe 403 HUMAN_SESSION_REQUIRED.

Errores

  • 403 Forbidden - Código HUMAN_SESSION_REQUIRED.
  • 400 Bad Request - El cuerpo no está vacío ni es {} o { invoiceIds, confirmReplaced }, o invoiceIds está vacío, tiene más de 1000 ids o uno de más de 64 caracteres.
  • 409 Conflict - Código REPLACED_UNCREDITED: una factura indicada en invoiceIds está reemplazada y sus notas de crédito no la cubren por completo. Envía confirmReplaced: true para exportarla igualmente.
  • 422 Unprocessable Entity - Código NOTHING_TO_EXPORT: no hay ninguna factura aprobada e impagada elegible.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
POST /v1/workspaces/{regionId}/invoices/payment-export
Solicitud
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
}
Respuesta · 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.

Obtener exportación de pagos

Vuelve a descargar una exportación de pagos.

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

Parámetros

  • exportIdstringObligatorio

    X-Pleaxy-Export-Id de ExportInvoicesForPayment.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Vuelve a descargar una exportación: el mismo CSV, reconstruido a partir de las facturas que siguen exportadas con ese id de exportación. Para cuando una descarga falló después de bloquear las facturas.

Errores

  • 404 Not Found - Código EXPORT_NOT_FOUND: ninguna factura sigue exportada con este id.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
GET /v1/workspaces/{regionId}/invoices/payment-exports/{exportId}
Solicitud
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/payment-exports/{exportId}" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 200 OK
text/csv

Retirar exportación de pagos

Saca una factura de una exportación de pagos.

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

Cuerpo

  • confirmNotPaidbooleanObligatorio

    Debe ser true: tu lote de pagos no ha pagado esta factura.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Saca una factura de su exportación, después de que confirmes que tu lote de pagos no la ha pagado. Pleaxy no puede ver ni cancelar nada en tu propia herramienta de pagos. La factura vuelve a Aprobada, pero no se puede exportar ni registrar de nuevo hasta el siguiente día hábil, y la siguiente exportación la marca con previously_exported_at.

Una sesión iniciada con acceso 'edit' a las facturas; una clave de API recibe 403 HUMAN_SESSION_REQUIRED.

Errores

  • 403 Forbidden - Código HUMAN_SESSION_REQUIRED, o un rechazo por separación de funciones.
  • 404 Not Found - No existe ninguna factura con este id en el espacio de trabajo.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
DELETE /v1/workspaces/{regionId}/invoices/{invoiceId}/payment-export
Solicitud
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
}
Respuesta · 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 } } ]
}

Obtener aviso de pago

Descarga en PDF el aviso de pago de un pago.

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

El aviso de pago de un pago registrado, en PDF. Está marcado como registrado por el comprador y no realizado a través de Pleaxy, y no es un recibo ni un comprobante de pago. Se marca como Revisado tras un nuevo registro y como Retirado tras una retirada. Envía Accept: application/pdf. Un proveedor cuyos compradores comparten un id de factura agrega ?buyer=<ID del espacio de trabajo del comprador>.

Errores

  • 404 Not Found - No hay ninguna factura con este id, o código NO_PAYMENT_RECORD: nunca se registró ningún pago para ella.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
GET /v1/workspaces/{regionId}/invoices/{invoiceId}/remittance-advice
Solicitud
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/remittance-advice" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 200 OK
application/pdf

Solicitar subida de comprobante de pago

Devuelve una URL para subir un comprobante de pago.

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

Cuerpo

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

    El tipo del archivo.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Una URL prefirmada para subir un comprobante de pago, como el justificante de transferencia del banco, de una factura aprobada o pagada. Haz PUT del archivo a uploadUrl con el mismo Content-Type en un plazo de 5 minutos, hasta maxBytes (10 MB), y luego envía su fileId con SendRemittance o con el campo remittance de RecordPayment. Una subida que no se adjunta a nada se elimina al cabo de un par de días.

Una sesión iniciada con acceso 'edit' a las facturas; una clave de API recibe 403 HUMAN_SESSION_REQUIRED. Las mismas reglas de separación de funciones que RecordPayment.

Errores

  • 400 Bad Request - contentType no es PDF, PNG ni JPEG ("A remittance file must be a PDF, PNG or JPEG.").
  • 403 Forbidden - Código HUMAN_SESSION_REQUIRED, o un rechazo por separación de funciones.
  • 404 Not Found - No existe ninguna factura con este id en el espacio de trabajo.
  • 409 Conflict - Código REMITTANCE_NEEDS_PAYMENT: la factura aún no está aprobada ni pagada.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/remittance-upload
Solicitud
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"
}
Respuesta · 200 OK
{
   "fileId": "string",
   "uploadUrl": "string",
   "maxBytes": number
}

Enviar comprobante de pago

Envía al proveedor un comprobante de pago o una nota.

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

Cuerpo

  • notestring

    Hasta 1000 caracteres una vez limpiada, para el proveedor. Va en la notificación del proveedor, que también recibe su canal de Slack o Teams cuando se enruta allí.

  • file{ fileId, fileName }

    Un comprobante de pago, como el justificante de transferencia del banco: el fileId de RequestRemittanceUpload, después de hacer PUT del archivo a su uploadUrl, y un fileName de 1 a 200 caracteres.

Devuelve

201 Created con el objeto que se muestra en la respuesta.

Más detalles

Envía al proveedor un aviso para una factura pagada: un comprobante de pago, una nota o ambos. Se notifica al proveedor (invoice_remittance_sent, con la nota), que lo lee en los remittances de la factura, sin saber quién lo envió; GetRemittanceFile abre el archivo. Hasta 20 por factura, y cada uno se conserva aunque se retire un registro de pago. No es el aviso de pago que Pleaxy genera a partir del registro de pago (GetRemittanceAdvice) ni las remittanceInstructions del proveedor.

Una sesión iniciada con acceso 'edit' a las facturas; una clave de API recibe 403 HUMAN_SESSION_REQUIRED. Las mismas reglas de separación de funciones que RecordPayment.

Campos de la respuesta

  • remittancesArray

    Todos los avisos enviados para la factura, del más antiguo al más reciente: { id (RM-…), sentAt, sentByName, note?, file?: { fileName, contentType, sizeBytes } }.

Errores

  • 400 Bad Request - Código REMITTANCE_EMPTY (ni nota ni archivo), REMITTANCE_NOTE_INVALID (más de 1000 caracteres), REMITTANCE_FILE_NAME_INVALID, REMITTANCE_UPLOAD_INCOMPLETE (el fileId no es uno subido para esta factura, o la subida no terminó: "The proof of payment hasn't finished uploading. Attach it again.") o REMITTANCE_FILE_TOO_LARGE (más de 10 MB).
  • 403 Forbidden - Código HUMAN_SESSION_REQUIRED, o un rechazo por separación de funciones.
  • 404 Not Found - No existe ninguna factura con este id en el espacio de trabajo.
  • 409 Conflict - Código REMITTANCE_NEEDS_PAYMENT (aún no hay ningún pago registrado: regístralo primero), REMITTANCE_LIMIT (ya tiene 20) o PAYMENT_CHANGED.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/remittance
Solicitud
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" }
}
Respuesta · 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 } } ]
}

Obtener archivo de comprobante de pago

Devuelve un enlace de corta duración al comprobante de pago de un aviso.

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

  • remittanceIdstringObligatorio

    El aviso, p. ej. "RM-1A2B3C4D", de los remittances de la factura.

  • buyerstring

    Solo para llamadores proveedores, y solo necesario después de un 409 *_ID_AMBIGUOUS: el ID del espacio de trabajo del comprador (que termina en .buyer) o el id de región, de la lista buyers del 409. Solo se considera el documento de ese comprador; si no hay ninguno allí, es un 404. Un ID del espacio de trabajo .supplier da 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."). Se ignora para un llamador comprador.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Un enlace, válido durante 5 minutos, al comprobante de pago que lleva un aviso, que se abre en línea. El proveedor lee los avisos que el comprador envió sobre su propia factura; la misma búsqueda que GetInvoice.

Errores

  • 404 Not Found - No hay ninguna factura con este id, o código REMITTANCE_NOT_FOUND: la factura no tiene ningún aviso con este id que lleve un archivo.
  • 409 Conflict - Solo para llamadores proveedores. Código INVOICE_ID_AMBIGUOUS: más de uno de tus compradores tiene una factura tuya con este id (los ids solo son únicos dentro de un comprador), así que Pleaxy no adivina a cuál te refieres. No se lee ni se cambia nada. El campo buyers del cuerpo lista el ID del espacio de trabajo y el nombre de cada comprador: repite la llamada con ?buyer=<ese ID del espacio de trabajo>.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
GET /v1/workspaces/{regionId}/invoices/{invoiceId}/remittances/{remittanceId}/file
Solicitud
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/remittances/{remittanceId}/file" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 200 OK
{
   "url": "string",
   "fileName": "string",
   "contentType": "application/pdf" | "image/png" | "image/jpeg"
}

Obtener pago con Stripe

Devuelve el estado de un pago con tarjeta o transferencia bancaria a través de Pleaxy (aún no disponible).

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

Devuelve

200 OK con el objeto que se muestra en la respuesta.

Más detalles

Aún no disponible: el pago a través de Pleaxy no está activado, así que responde available: false con reason not_configured. Cuando lo esté, indicará si esta factura se puede pagar a través de Pleaxy con Stripe, o por qué no, y cualquier pago con Stripe en curso. quote es lo que pagaría el comprador: la factura más la comisión de transferencia bancaria de Stripe (0,8%, con un máximo de $5), que cubre el comprador para que el proveedor reciba el importe completo de la factura.

Errores

  • 404 Not Found - No existe ninguna factura con este id en el espacio de trabajo.
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
GET /v1/workspaces/{regionId}/invoices/{invoiceId}/stripe-payment
Solicitud
curl "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/stripe-payment" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 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" }
}

Iniciar pago con Stripe

Inicia el pago de una factura a través de Pleaxy (aún no disponible).

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

  • confirmReplacedboolean

    true para pagarla igualmente cuando la factura está reemplazada (abono y refacturación) y sus notas de crédito no la cubren por completo.

Devuelve

201 Created con el objeto que se muestra en la respuesta.

Más detalles

Aún no disponible: el pago a través de Pleaxy no está activado, así que responde 503. Cuando lo esté, iniciará el pago completo de una factura aprobada a través de Pleaxy, por transferencia bancaria de EE. UU. con Stripe, y devolverá la url de una página de Stripe Checkout. El pago se hace en la propia cuenta de Stripe del proveedor: el dinero va de la cuenta bancaria del comprador al proveedor y nunca pasa por Pleaxy. El comprador paga la factura más la comisión de Stripe, para que el proveedor reciba el importe completo de la factura; Pleaxy no cobra nada. La factura queda bloqueada mientras Checkout está abierto (hasta una hora) y se marca como pagada cuando Stripe confirma la transferencia. Reanuda un Checkout abierto; responde { state } sin url cuando un pago ya se está procesando o está hecho.

Una sesión iniciada con acceso 'edit' a las facturas; una clave de API recibe 403 HUMAN_SESSION_REQUIRED. Las mismas reglas de separación de funciones que RecordPayment.

Errores

  • 403 Forbidden - Código HUMAN_SESSION_REQUIRED, o un rechazo por separación de funciones.
  • 409 Conflict - Código PAYMENT_ALREADY_RECORDED, PAYMENT_ACTIVE (exportada o registrada: retira eso primero), REPLACED_UNCREDITED (la factura está reemplazada y sus notas de crédito no la cubren por completo: agrega ?confirmReplaced=true para pagarla igualmente) o PAYMENT_CHANGED.
  • 422 Unprocessable Entity - Código STRIPE_SUPPLIER_NOT_ON_PLEAXY, STRIPE_SUPPLIER_NOT_CONNECTED, STRIPE_UNSUPPORTED_CURRENCY o STRIPE_AMOUNT_TOO_SMALL.
  • 503 Service Unavailable - El pago a través de Pleaxy no está activado ("Paying suppliers through Pleaxy isn't available yet.").
  • 401 Unauthorized - No se presentó ninguna credencial, o el token Bearer o el valor de X-Api-Key falta, no es válido, caducó o fue revocado.
  • 403 Forbidden - El token Bearer o la clave de API del llamador no da acceso a este espacio de trabajo (regionId), o no tiene el rol requerido.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/stripe-payment
Solicitud
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/stripe-payment" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 201 Created
{
   "url": "string",
   "state": "checkout_open" | "processing" | "succeeded"
}

Liquidar factura

Retirado: usa RecordPayment en su lugar.

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

Parámetros

  • invoiceIdstringObligatorio

    El identificador de la factura.

Devuelve

410 Gone con el objeto que se muestra en la respuesta.

Más detalles

Retirado. Siempre responde 410 SETTLE_REPLACED y no cambia nada. Registra un pago hecho fuera de Pleaxy con RecordPayment.

Cambiado el 2026-09-24, una corrección de seguridad dentro de v1: la liquidación se limitó a sesiones iniciadas y después se retiró; nunca paga nada.

Errores

  • 410 Gone - Código SETTLE_REPLACED, siempre.
POST /v1/workspaces/{regionId}/invoices/{invoiceId}/settle
Solicitud
curl -X POST "$PLEAXY_API_BASE_URL/v1/workspaces/{regionId}/invoices/{invoiceId}/settle" \
  -H "X-Api-Key: $PLEAXY_API_KEY"
Respuesta · 410 Gone
{
   "statusCode": 410,
   "error": "Gone",
   "code": "SETTLE_REPLACED",
   "message": "string",
   "messageId": "invoices.settleReplaced",
   "params": { }
}
Habla con nosotros