Skip to main content
Esta funcionalidad está en habilitación. Para activarla en tu empresa, escríbenos por el chat del panel de administración: el proceso incluye cargar tu resolución de la DIAN y completar la habilitación de tu empresa como facturador electrónico.

Qué hace

OnePay emite la factura electrónica a nombre de tu empresa ante la DIAN, con tu resolución y tu numeración, y le entrega el documento a tu cliente. Es el mismo endpoint que FacturasPOST /v1/invoices — y el mismo recurso. Lo que cambia es si mandas items: En los dos casos la factura obtiene su cobro asociado, aparece en el mismo listado y se consulta por la misma URL.
Si ya facturas en otro sistema y solo necesitas recaudar, no cambia nada para ti: seguí mandando el mismo payload de siempre. items es aditivo.

Cuándo se timbra

El parámetro más importante de la integración es stamp_policy, porque decide en qué momento el documento existe ante la DIAN.
none no es lo mismo que manual. Con manual la intención es emitir más tarde; con none no se emite nunca. La diferencia importa: una factura “pendiente de emitir” que en realidad nunca se va a emitir es indistinguible de una que alguien olvidó.Con none la factura existe igual, con sus líneas y su cobro — simplemente no hay documento fiscal. Y como no lo va a haber, no se te exigen los datos fiscales del cliente: dirección, dígito de verificación ni responsabilidades fiscales.
none es el valor por defecto. Si no mandas stamp_policy, la factura NO se emite ante la DIAN.Es deliberado: emitir un documento con efectos tributarios tiene que ser una decisión explícita. Si se te olvida el parámetro, el resultado es una factura sin emitir —que puedes emitir después con /stamp— y no un documento ante la DIAN que haya que anular con una nota crédito.
Con on_issue el documento se emite antes de saber si te van a pagar. Si el cobro falla o lo reembolsas, tienes una factura viva ante la DIAN por una venta que no ocurrió, y la única salida legal es una nota crédito.OnePay la emite automáticamente al reembolsar, pero si tu operación no necesita facturar por anticipado, on_payment te evita el problema entero.

Datos que exige el receptor

La DIAN no acepta una factura con el receptor incompleto. Lo que se exige depende del tipo de documento: Si falta algo, la API responde 422 con todos los campos faltantes de una vez, no con el primero:

Flujo

El timbrado es asíncrono. La DIAN puede tardar segundos o minutos, así que POST /v1/invoices responde de inmediato con fiscal_status: null y el resultado te llega por webhook. No hagas polling contra el endpoint de detalle esperando el CUFE.

Ejemplo completo de implementación

Un ISP que cobra internet mensual y quiere que OnePay emita sus facturas.

Paso 1 — Carga tu resolución de la DIAN

Una sola vez, con los datos que aparecen en tu resolución del portal MUISCA.
Queda en draft. Actívala cuando la hayamos validado:
Carga también una resolución con document_type: "credit_note" y su propio prefijo. Las notas crédito llevan numeración aparte, y sin ella no vas a poder anular ni devolver.

Paso 2 — Asegura que tu cliente tenga los datos fiscales

Paso 3 — Previsualiza los totales

Útil para mostrar el detalle en tu propia interfaz antes de emitir. No crea nada.
Todos los montos van en centavos. 8990000 son $89.900 COP. Es el mismo criterio de entrada y de salida, y evita que un decimal mal redondeado haga que la DIAN rechace el documento.

Paso 4 — Crea la factura

El Idempotency-Key no es opcional en la práctica: sin él, un reintento de tu lado por un timeout de red crea dos facturas, que es IVA declarado dos veces y una nota crédito para arreglarlo.

Paso 5 — Escucha los webhooks

Con on_payment, cuando tu cliente pague, OnePay timbra y te avisa:
Si la DIAN rechaza:
Guarda el cufe y el xml_url en tu sistema. El XML es el documento legal; el PDF es solo su representación gráfica.
Fíjate en totals y en amount: los totales fiscales van en centavos y agrupados aparte, mientras que amount es el monto en pesos de siempre, el que ya leen tus integraciones. Están separados a propósito — mezclar las dos unidades en el mismo nivel es la forma más fácil de cobrar cien veces de más.

Paso 6 — Devoluciones

Si tienes que devolver dinero, emite una nota crédito. OnePay ya la emite sola cuando reembolsas un cobro, pero también puedes hacerlo directo:
Omite amount para anular la factura completa. Puedes emitir varias notas parciales sobre la misma factura; OnePay no deja que la suma supere el total.

Errores

Todos traen un code estable sobre el que puedes ramificar sin leer el mensaje.

Preguntas frecuentes

OnePay te avisa al 80% y al 95% del rango consumido, y 30 días antes de que venza la resolución. Carga la siguiente resolución con anticipación y actívala: puedes tener varias cargadas, pero solo una activa por prefijo y tipo de documento.Si te quedas sin folios, el timbrado falla con resolution_not_activatable y las facturas se siguen creando pero no se emiten.
No automáticamente. Las facturas que importas desde tu sistema de gestión no se timbran: OnePay asume que ya las emitiste tú. Si quieres migrar tu facturación a OnePay, escríbenos — hay que apagar la emisión en tu sistema anterior primero, o terminarías facturando dos veces la misma venta.
Puedes usar cualquiera de las dos formas. Con tax.behavior: "inclusive" el unit_amount ya trae el impuesto y OnePay lo desagrega; con "exclusive" (por defecto) el impuesto se suma encima.El XML de la DIAN siempre lleva base e impuesto por separado, así que la desagregación ocurre igual — la diferencia es solo cómo nos mandas el precio.
Sí. En vez de description y unit_amount, manda price_id de un Precio y OnePay resuelve nombre, monto e impuesto. Puedes mezclar líneas del catálogo con líneas sueltas en la misma factura, y sobreescribir el impuesto de una línea puntual sin duplicar el producto.
Usa tu API key de pruebas. El entorno de pruebas tiene su propia resolución y su propia numeración, completamente separada de producción.