POST /api/v1/invoices y además genera el PDF, envía el correo al cliente y avisa por webhook.
URL base
Mismos endpoints, bodies y respuestas en ambos; cambian solo la URL y la key. Detalle en Ambientes.
Autenticación
HeaderX-API-Key en cada request. Respuestas 401 (key ausente, inválida o tenant inactivo), 403 (credencial sin alcance) y 429 (más de 20 credenciales inválidas por minuto desde tu IP, esperar Retry-After) con JSON mínimo { "error": true, "message": "..." }. Detalle en Autenticación.
Formato de respuesta
WrapperApiResponse en todas las respuestas. Los campos nulos no se serializan.
- Éxito
- Error
Códigos en Errores.
Content-Type: application/json en todo request con body. La versión va en la URL (/api/v1/); un cambio incompatible se publica como /api/v2/ con aviso previo.
Paginación
page y size de la respuesta son los efectivamente servidos (size puede ser menor al pedido).
Flujo de emisión
- Validación (HTTP
400si falla): campos requeridos (NIT, razón social, método de pago, detalles), formato de NIT (7-15 dígitos, algoritmo del SIN), códigos SIAT (actividad, producto, unidad de medida), montos positivos y coherentes (subtotal = cantidad × precio − descuento). - La respuesta sale apenas el SIN acepta. PDF (A4 y ticket), subida a storage, correo y notificación por chat se entregan después, por una cola con reintentos. Las URLs
pdfUrl/ticketUrl/xmlUrlya son válidas: si pedís el PDF antes de que esté guardado, se genera en el momento (tarda más, nunca 404). El webhookinvoice.emittedpuede llegar antes que el correo. - Cada cambio de estado dispara un webhook si hay un endpoint suscrito.
Estados de una factura
Estado actual contra el SIAT:
GET /api/v1/invoices/{id}/status (Estado de factura).
Tipos de documento sector
Todos los tipos de documento (excepto notas de crédito/débito) usanPOST /api/v1/invoices. El sector se elige con documentSectorType (numérico) en el body, validado contra los sectores autorizados de tu empresa; si se omite, se usa el sector por defecto del punto de venta. Las notas usan POST /api/v1/invoices/{id}/credit-note (Crear nota).
✅ = implementado y emitiendo. — = en el catálogo SIAT pero no habilitado: la emisión responde
422 SECTOR_NOT_SUPPORTED. Los campos adicionales de cada sector están en su página.