Ir al contenido

API

En esta página

Obtener

Recupera una factura por su ID, revisa su estado de pago y confirmación, y concílialo con tu propia referencia externa de pedido.

GET/v1/invoices/:invoice_id

Clave de API: Payment

Devuelve el estado actual de una factura. Usa el mismo contrato de respuesta que la creación de facturas; el objeto payment aparece en cuanto se eligen token y red.

Respuesta (200 OK)

{
  "invoice_id": "inv_5CcyDYmMUGtzYL10q0Iimr",
  "project_id": "prj_xFukZuAJZR06pLVBh3uwzv",
  "status": "paid",
  "is_final": true,
  "is_test": false,
  "payment_url": "https://checkout.paymos.io/invoice/inv_5CcyDYmMUGtzYL10q0Iimr",
  "order": {
    "external_id": "order-12345",
    "client_id": "customer-67890",
    "amount": "50.00",
    "currency": "USDT",
    "network": "TRC20"
  },
  "payment": {
    "currency": "USDT",
    "network": "TRC20",
    "chain_id": 728126428,
    "contract_address": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
    "expected": "50.00",
    "address": "TLfGqSVPbET2KFczh3xb12Ja2RKfMCBPgp",
    "exchange_rate": "1.000000",
    "paid": "50.00",
    "remaining": "0",
    "fee": "0.50",
    "net": "49.50",
    "transfers": [
      {
        "tx_hash": "abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890",
        "amount": "50.00",
        "status": "confirmed",
        "created_at": 1739280712,
        "confirmed_at": 1739280912,
        "required_confirmations": 19,
        "estimated_confirmation_at": 1739280772,
        "explorer_url": "https://tronscan.org/#/transaction/abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890"
      }
    ]
  },
  "created_at": 1739280600,
  "updated_at": 1739280912,
  "expires_at": 1739284200,
  "completed_at": 1739280912
}

Campos de pago

Cuando payment está presente, contiene:

Campo Tipo Descripción
payment.currency string Símbolo del activo cripto elegido para pagar (por ejemplo, USDT, USDC)
payment.network string Código de la red blockchain (por ejemplo, ERC20, TRC20, BEP20, POLYGON, BASE, TON, SOL)
payment.chain_id integer Identificador numérico de cadena según las convenciones de EIP-155, TRON o TON (por ejemplo, 1 para la red principal de Ethereum, 728126428 para Tron)
payment.contract_address string? Identificador del token en cadena: dirección de contrato en EVM y Tron, jetton master en TON, SPL mint en Solana. Es opcional en el esquema porque una moneda nativa no tiene ese identificador; ninguna moneda nativa figura entre los activos aceptados, así que en una factura real el campo siempre trae valor. GET /v1/payment-channel-deposits/:id enuncia la misma regla para su propio contract_address
payment.expected string Importe en cripto que el cliente debe enviar
payment.address string? Dirección de depósito a la que paga el cliente. Mientras la factura sigue en awaiting_client el objeto payment entero no está en la respuesta, así que este campo nunca llega como null en una factura pendiente: sencillamente todavía no hay payment que leer
payment.exchange_rate string? Tipo de cambio de fiat a cripto con el que se calculó expected
payment.paid string? Suma de las transferencias entrantes confirmadas
payment.remaining string? Importe pendiente que el cliente todavía debe enviar (expected - paid, nunca negativo). Solo aparece cuando se ha confirmado al menos una transferencia
payment.fee string? Comisión de la plataforma descontada de paid
payment.net string? Importe que corresponde al comercio (paid - fee)
payment.transfers array? Detalle de cada transferencia; aparece cuando se ha detectado al menos una transferencia en cadena. Mira más abajo.

Campos de una transferencia

Cada entrada de payment.transfers[]:

Campo Tipo Descripción
tx_hash string Hash de la transacción en cadena (formato propio de cada red)
amount string Importe transferido en cripto
status string confirming (a la espera de confirmaciones) o confirmed
created_at unix timestamp Momento en que nuestro procesador vio la transferencia por primera vez en un bloque procesado. Es la hora del reloj de nuestro servidor, no la marca temporal del bloque en cadena: divergen si el procesamiento iba con retraso. Usa este campo (y no el created_at de primer nivel de la factura) en la fórmula de «segundos restantes» de más abajo.
confirmed_at unix timestamp? Momento en que la transferencia alcanzó el número de confirmaciones requerido. null mientras siga pendiente
required_confirmations integer? Confirmaciones que esta transferencia necesita para llegar a confirmed, según el tramo de valor en USD de su importe. null en toda red que se asiente con el compromiso finalized de la propia cadena en lugar de con un recuento de bloques: hoy BNB Smart Chain, Polygon, Solana, Avalanche y Plasma. Ramifica por el null, no por una lista de redes: qué cadenas confirman por finalidad es un parámetro operativo y puede cambiar
estimated_confirmation_at unix timestamp? Momento en que se espera que la transferencia quede liquidada. En las redes que cuentan bloques se calcula al detectarla como transfer.created_at + required_confirmations × network_block_time; en las redes de finalidad, donde no hay recuento de bloques, es transfer.created_at más la finalidad típica de esa cadena, para que la espera se pueda pintar igual. Es un valor fijo: NO se desplaza entre peticiones, devuelve lo mismo en cada consulta hasta que la transferencia se confirma (o hasta que cambia su tramo en USD). Para los «segundos restantes», calcula en el cliente max(0, estimated_confirmation_at − now).
explorer_url string? Enlace directo a esta transacción en el explorador de bloques de la red (Tronscan, Etherscan, Tonviewer, etc.). null si la red no tiene explorador público configurado. Puedes mostrarlo tal cual como enlace pulsable, sin transformación alguna.

Estados de la factura

Toda factura informa de un status en forma de cadena. Ese mismo valor alimenta la respuesta de la Merchant API, el flujo SSE de la página de pago y el contenido del webhook: hay una sola fuente de verdad. La tabla siguiente es la referencia por estado: cuándo aparece el valor, si es final y cuál es la condición exacta que lo produce. Para el diagrama de transiciones y las dos formas de crear una factura, consulta Flujo de pago.

Un estado final es definitivo: la factura se queda ahí y ya no vuelve a moverse. Cinco estados son finales: paid, paid_over, underpaid, expired y cancelled.

Estado Final Cuándo se aplica
awaiting_client No Estado inicial de toda factura. Todavía no se ha elegido token ni red, así que no existe dirección de depósito. La cancelación solo se permite aquí
awaiting_payment No Token, red y dirección de depósito quedan fijados. Paymos vigila la dirección a la espera de una transferencia entrante
confirming No Una transferencia ha llegado a la cadena y acumula las confirmaciones que exige su tramo de importe
underpaid_waiting No Ha entrado menos del importe esperado y la factura sigue abierta esperando el resto. Solo se alcanza cuando allow_multiple_payments vale true
underpaid La factura se cerró con menos de lo debido: o venció por debajo del importe esperado, o un único pago se quedó corto con allow_multiple_payments en false
expired El plazo venció sin recibir nada, o en el flujo fiat se agotó la ventana de selección de token antes de elegir uno
cancelled El comercio canceló la factura mientras seguía en awaiting_client

Errores

Consulta Códigos de error para el catálogo completo. La URI de type en cada respuesta de error enlaza directamente con la fila correspondiente.