Manual de Integración API
Conecta tu tienda online o tu sistema con Facturador Web.
01Introducción
Esta API permite a un sistema externo (tienda online, ERP de terceros, etc.) registrar una venta en Facturador Web y luego firmar/emitir el DTE (Documento Tributario Electrónico) correspondiente ante el SII.
El flujo típico de integración es:
- Registrar la venta con sus ítems mediante
POST /api/save-sale. - Firmar el DTE con
GET /api/firmar/{identificador}— o bien firmarlo en el mismo paso anterior enviando"firmar": "Si". - El sistema entrega la URL del PDF/timbre generado, que puedes mostrar o enviar al cliente final.
También puedes crear cotizaciones con POST /api/crear/cotizacion: quedan listadas en Ventas > Cotizaciones y no consumen folios del SII.
Si tienes una tienda online, puedes crear pedidos web con POST /api/crear/pedido: llegan a Sitio WEB > Pedidos, en Nuevos pedidos, con su comprobante de pago para revisarlo y confirmarlo.
02Autenticación
Todas las rutas de esta API requieren un token de acceso propio de tu empresa. Lo generas tú mismo en Mi perfil, en el recuadro API token CMS, con el botón "Generar API token" (haz clic sobre el campo para copiarlo). Envíalo de alguna de estas formas:
También se acepta como parámetro ?api_token=TU_API_TOKEN en la URL, o como campo api_token en el cuerpo del POST.
HTTP 401. El límite de uso es de 60 peticiones por minuto.
03Registrar venta
Crea el borrador de la venta junto con sus ítems. Opcionalmente puede firmar el DTE en el mismo llamado.
Parámetros del cuerpo (JSON)
| Campo | Tipo | Descripción |
|---|---|---|
identificadorrequerido | string | ID de la venta en tu sistema externo. Se guarda como venta_externa_id y es lo que usarás para firmar el DTE después. |
doc_tributariorequerido | int | Tipo de documento a emitir. Ver tabla de tipos de documento. |
rutrequerido | string | RUT del cliente, formato 11111111-1. |
nombrerequerido | string | Nombre o razón social del cliente. |
emailopcional | string | Correo del cliente (se usa para el envío automático del DTE). |
telefonoopcional | string | Teléfono de contacto. |
direccionopcional | string | Dirección del cliente. |
ciudadopcional | string | Ciudad del cliente. |
comunas_id o comunaopcional | int / string | Comuna del cliente por ID o por nombre. Si no envías ninguna, queda la comuna de tu empresa. |
giroopcional | string | Giro comercial del cliente. |
formapago_idopcional | int | Forma de pago. Ver tabla de formas de pago. Por defecto 1 (Por pagar). |
valor_neto, valor_iva, valor_exento, valor_bruto, valor_totalopcional | number | Totales de la venta. Para documentos exentos (34/41) solo se usa valor_total. |
detailrequerido | array | Listado de ítems de la venta (ver tabla siguiente). Sin este campo la venta no se crea. |
firmaropcional | string | Envía "Si" para firmar el DTE inmediatamente después de crear la venta, en el mismo llamado. |
Cada elemento de detail
| Campo | Tipo | Descripción |
|---|---|---|
nombrerequerido | string | Nombre/descripción del producto o servicio. |
descripcionopcional | string | Detalle adicional del ítem. |
codigoopcional | string | Código/SKU del producto. Si se omite, se genera uno automático. |
productos_idopcional | int | ID de un producto ya existente en Facturador Web, si aplica. |
cantidadrequerido | number | Cantidad del ítem. |
neto, ivarequerido* | number | Valor neto e IVA por unidad (no el total de la línea). No aplica para documentos exentos (34/41). |
valorrequerido | number | Valor total por unidad (neto + IVA si es afecto). El sistema multiplica por cantidad internamente al calcular los totales de la venta. |
Ejemplo con curl
curl -X POST "https://sistema.facturadorweb.cl/api/save-sale" \
-H "Authorization: Bearer TU_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"identificador": "PEDIDO-1001",
"doc_tributario": 39,
"rut": "11111111-1",
"nombre": "Cliente de prueba",
"email": "cliente@correo.cl",
"telefono": "912345678",
"direccion": "Calle Falsa 123",
"ciudad": "Santiago",
"comunas_id": 295,
"giro": "Particular",
"formapago_id": 9,
"detail": [
{ "nombre": "Producto A", "cantidad": 2, "neto": 1000, "iva": 190, "valor": 1190 },
{ "nombre": "Producto B", "cantidad": 1, "neto": 5000, "iva": 950, "valor": 5950 }
],
"firmar": "Si"
}'Ejemplo de respuesta
Cuando la venta queda guardada la respuesta siempre trae su id en el sistema, también si la firma falla ("status": "warning"): el borrador queda guardado con ese id. Si no se guardó nada, la respuesta es un error sin id.
04Firmar DTE
Firma y emite el DTE de una venta creada previamente. {identificador} es el mismo valor que enviaste en el campo identificador al registrar la venta.
Ejemplo con curl
curl "https://sistema.facturadorweb.cl/api/firmar/PEDIDO-1001" \
-H "Authorization: Bearer TU_API_TOKEN"identificador: cada firma consume un folio del SII. Si necesitas reintentar por una falla de red, primero confirma con soporte si el DTE ya fue timbrado.
05Crear cotización
Crea una cotización con sus ítems. Queda listada en Ventas > Cotizaciones igual que las que se hacen a mano en el sistema. Una cotización no se firma ni consume folios del SII.
Parámetros del cuerpo (JSON)
| Campo | Tipo | Descripción |
|---|---|---|
rutrequerido | string | RUT del cliente. Acepta con o sin puntos (11.111.111-1 o 11111111-1). |
nombrerequerido | string | Nombre o razón social del cliente. |
detallesrequerido | array | Ítems de la cotización, al menos uno (ver tabla siguiente). |
venta_externa_idopcional | string | ID de la cotización en tu sistema. Si lo envías y repites el llamado, se actualiza la misma cotización en vez de duplicarla: úsalo para reintentos. |
documentotributario_idopcional | int | Documento que se emitiría: 33 factura (por defecto), 39 boleta, 34 factura exenta, 41 boleta exenta. Con 34 o 41 todo el detalle va exento. |
fechaopcional | date | Formato YYYY-MM-DD. Por defecto la fecha de hoy. |
comuna o comunas_idopcional | string / int | Comuna por nombre o por ID. Si no envías ninguno queda la comuna de tu empresa. |
email, telefono, celular, direccion, ciudad, giroopcional | string | Datos de contacto del cliente que salen impresos en la cotización. |
condicionesdepago, atencion, titulo, comentario, pie_cotizacionopcional | string | Textos que se muestran en la cotización. |
formapago_id, centro_costos_idopcional | int | Forma de pago (ver tabla, por defecto 30) y centro de costos. |
Cada elemento de detalles
| Campo | Tipo | Descripción |
|---|---|---|
descripcionrequerido | string | Nombre del producto o servicio. |
cantidadrequerido | number | Cantidad del ítem. |
totalrequerido | number | Precio unitario bruto, con IVA incluido. También se acepta como precio o valor_unitario. El neto y el IVA los calcula el sistema. |
codigo, detalle, unidad_medidaopcional | string | Código/SKU, detalle adicional y unidad de medida (por defecto UN). |
afecto_ivaopcional | 0 / 1 | Envía 0 para dejar esa línea exenta. Por defecto 1. |
descuentoopcional | number | Descuento unitario del ítem. |
Ejemplo con curl
curl -X POST "https://sistema.facturadorweb.cl/api/crear/cotizacion" \
-H "Authorization: Bearer TU_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"venta_externa_id": "COT-2001",
"rut": "11111111-1",
"nombre": "Cliente de prueba",
"email": "cliente@correo.cl",
"telefono": "912345678",
"direccion": "Calle Falsa 123",
"comuna": "Santiago",
"giro": "Servicios",
"documentotributario_id": 33,
"condicionesdepago": "30 dias",
"detalles": [
{ "codigo": "P1", "descripcion": "Producto uno", "cantidad": 2, "total": 11900 },
{ "codigo": "P2", "descripcion": "Producto dos", "cantidad": 1, "total": 5950, "afecto_iva": 0 }
]
}'Ejemplo de respuesta
Responde 201 al crear y 200 cuando actualizó una cotización existente. Si faltan campos obligatorios responde 422 con el detalle en errores.
url_cotizacion es un link público: puedes enviárselo al cliente para que vea la cotización y descargue su PDF sin tener usuario en el sistema. El sistema además registra si la abrió.
06Crear pedido web
Registra un pedido de tu tienda online con sus productos y, si ya lo pagaron, el comprobante de pago. Llega a Sitio WEB > Pedidos en la pestaña que indiques con estado: por defecto Nuevos pedidos (Por Pagar). Desde ahí revisas el comprobante y presionas Confirmar Pago, que crea la venta en el sistema (y la firma, si tu sitio lo tiene configurado).
Parámetros del cuerpo (JSON)
| Campo | Tipo | Descripción |
|---|---|---|
rutrequerido | string | RUT del cliente, con o sin puntos. |
nombrerequerido | string | Nombre o razón social del cliente. |
correorequerido | string | Correo del cliente. También se acepta como email. |
telefonorequerido | string | Teléfono del cliente. |
detallesrequerido | array | Productos del pedido, al menos uno (ver tabla siguiente). |
codigoopcional | string | ID del pedido en tu tienda. Si repites el llamado con el mismo código no se crea otro: responde el pedido que ya existe y, si envías un estado más avanzado, lo mueve de pestaña. Úsalo para reintentos y para avanzar el pedido. |
estadoopcional | string | Pestaña donde queda el pedido: nuevo (por defecto, Nuevos pedidos), atendido (Pedidos Atendidos) o entregado (Pedidos Entregados). Ver estados del pedido. |
documentorequerido | int / string | Documento que se emitirá al confirmar el pago: 39 Boleta Electrónica, 33 Factura Electrónica, 41 Boleta Exenta Electrónica o 34 Factura Exenta Electrónica. Con 34 o 41 todo el detalle va exento, sin IVA. También se aceptan las palabras Boleta y Factura, por compatibilidad. |
giroopcional | string | Giro del cliente, necesario si pide factura. |
direccion, ciudadopcional | string | Dirección de despacho del cliente. |
comuna o comunas_idopcional | string / int | Comuna por nombre o por ID. Si no envías ninguna queda la comuna de tu empresa. |
retiroopcional | string | Domicilio, Sucursal o Tienda. Por defecto Domicilio si envías dirección y Tienda si no. |
forma_pagoopcional | string | Cómo pagó el cliente: transferencia (por defecto), webpay, flow, mercadopago. |
costo_envio, descuentoopcional | int | Costo de despacho y descuento del pedido, en pesos. |
pagoopcional | object | Pago informado y su comprobante (ver objeto pago). |
Cada elemento de detalles
| Campo | Tipo | Descripción |
|---|---|---|
nombrerequerido | string | Nombre del producto. |
cantidadrequerido | int | Cantidad, mínimo 1. |
valorrequerido | number | Precio unitario con IVA incluido. El total del pedido se calcula solo: suma de valor × cantidad + costo_envio − descuento. |
descripcionopcional | string | Detalle adicional del producto. |
productos_idopcional | int | ID del producto en Facturador Web, si existe. Al confirmar el pago se usa para descontar stock. |
Objeto pago (comprobante)
| Campo | Tipo | Descripción |
|---|---|---|
comprobanteopcional | string (base64) | Archivo del comprobante en base64 (se acepta data URI). Imagen JPG, PNG o WEBP de hasta 15 MB, o PDF de hasta 5 MB. Las imágenes se optimizan al recibirlas: quedan como JPG de hasta 1.600 px por lado, con la orientación corregida. Los PDF se guardan tal cual. |
comprobante_nombreopcional | string | Nombre del archivo, por ejemplo transferencia.pdf. |
montoopcional | number | Monto pagado. No puede ser mayor al total del pedido. |
fechaopcional | date | Fecha del pago, formato YYYY-MM-DD. Por defecto hoy. |
operacionopcional | string | Número de transferencia, voucher u operación. |
multipart/form-data con el archivo en pago[comprobante] y el resto como pago[monto], detalles[0][nombre], etc. Si algún dato viene malo el pedido no se crea: la respuesta es HTTP 422 con el detalle en errores.
Estados del pedido (estado)
| Valor | Pestaña en Sitio WEB > Pedidos | Estado que muestra |
|---|---|---|
nuevo | Nuevos pedidos | Por Pagar |
atendido | Pedidos Atendidos | Pagado |
entregado | Pedidos Entregados | Pagado y Entregado |
atendido o entregado el pedido solo queda ubicado en esa pestaña: no se crea la venta en el sistema, no se descuenta stock y no se envían correos al cliente. Úsalos para registrar pedidos que ya gestionaste por otro lado. Si quieres que el sistema genere la venta, envía el pedido como nuevo y confírmalo con Confirmar Pago.
Para avanzar un pedido ya enviado, repite el llamado con el mismo codigo y el nuevo estado: pasa de nuevo a atendido y de ahí a entregado. Nunca retrocede, no modifica pedidos cancelados y el resto de los datos del pedido no cambia.
Mover un pedido ya creado (atendido / entregado)
Si el pedido ya existe en Facturador Web y solo necesitas cambiarlo de pestaña, no lo vuelvas a enviar completo: usa este endpoint con el id que te devolvió al crearlo. También acepta tu propio codigo en vez del id.
| Campo | Tipo | Descripción |
|---|---|---|
estadoobligatorio | string | atendido (queda en Pedidos Atendidos, estado Pagado) o entregado (queda en Pedidos Entregados, estado Pagado y Entregado). |
notificaropcional | boolean | Decide si se le envía el correo al cliente por este cambio de estado. Por defecto false: no se envía ningún correo. Con true, al mover a atendido sale el correo de pago recibido y al mover a entregado el de pedido entregado. El correo solo se manda si el pedido realmente cambió de estado, y la respuesta te dice en correo_enviado si salió o no. |
nuevo y usa Confirmar Pago en Sitio WEB > Pedidos.
El estado nunca retrocede: si el pedido ya está en Pagado y Entregado y pides atendido, responde 200 sin cambiar nada y con "movido": false. Los pedidos cancelados, rechazados o que son cotización no se mueven (responde 422).
Ejemplo con curl (cambio de estado)
curl -X POST "https://sistema.facturadorweb.cl/api/pedido/145/estado" \
-H "Authorization: Bearer TU_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"estado": "entregado",
"notificar": true
}'Ejemplo de respuesta (cambio de estado)
Si el ERP ya registró la venta de ese pedido con Confirmar Pago, la respuesta trae venta_id (el id en operacionestributarias), el folio en venta_folio y venta_firmada. Mientras el pedido no tenga venta, venta_id y venta_folio vienen en null y venta_firmada en false: este endpoint no crea la venta. Si quedó como borrador sin firmar, trae el venta_id del borrador con venta_folio en null y venta_firmada en false.
Ejemplo con curl
curl -X POST "https://sistema.facturadorweb.cl/api/crear/pedido" \
-H "Authorization: Bearer TU_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"codigo": "TIENDA-3001",
"estado": "nuevo",
"rut": "11111111-1",
"nombre": "Cliente de prueba",
"correo": "cliente@correo.cl",
"telefono": "912345678",
"direccion": "Calle Falsa 123",
"comuna": "Santiago",
"documento": 39,
"forma_pago": "transferencia",
"costo_envio": 3500,
"detalles": [
{ "nombre": "Producto A", "cantidad": 2, "valor": 11900 },
{ "nombre": "Producto B", "cantidad": 1, "valor": 5950, "productos_id": 1520 }
],
"pago": {
"monto": 33250,
"fecha": "2026-09-15",
"operacion": "TRX-558812",
"comprobante_nombre": "transferencia.pdf",
"comprobante": "JVBERi0xLjQK... (archivo en base64)"
}
}'Ejemplo de respuesta
Responde 201 al crear el pedido y 200 si ya existía un pedido con ese codigo: no se crea otro y, si enviaste un estado más avanzado, se mueve de pestaña (el message lo indica, por ejemplo "El pedido ya existía y se movió a Pagado").
Respuestas: siempre un id o un error
Todas las respuestas son JSON. Si el pedido quedó guardado trae "status": "success" y el id del pedido; si no, trae "status": "error" y el motivo en message, sin id. Revisa siempre el código HTTP:
| HTTP | Resultado | Qué hacer |
|---|---|---|
201 | Pedido creado. Trae id. | Guarda el id junto a tu codigo. |
200 | Ya existía un pedido con ese codigo. Trae el id del existente. | Nada: no se duplicó. Si enviaste un estado más avanzado, ya se movió. |
401 | Token ausente o inválido. | Envía Authorization: Bearer TU_API_TOKEN con un token vigente. |
403 | El token no tiene una empresa válida. | Genera un token nuevo en Mi perfil. |
405 | Método no permitido. | Usa POST. |
422 | Datos inválidos. Trae el detalle por campo en errores. | Corrige y vuelve a enviar: no se guardó nada. |
429 | Superaste el límite de peticiones por minuto. | Espera un momento y reintenta con el mismo codigo. |
500 | Error interno al guardar. | Reintenta con el mismo codigo; si persiste, avisa a soporte. |
07Tipos de documento (doc_tributario)
| Código | Documento |
|---|---|
| 33 | Factura Electrónica |
| 34 | Factura Exenta Electrónica |
| 39 | Boleta Electrónica |
| 41 | Boleta Exenta Electrónica |
| 52 | Guía de Despacho Electrónica |
| 56 | Nota de Débito Electrónica |
| 61 | Nota de Crédito Electrónica |
08Formas de pago (formapago_id)
| Código | Forma de pago |
|---|---|
| 1 | Por pagar |
| 2 | Efectivo |
| 3 | Tarjeta de Débito Transbank |
| 4 | Tarjeta de Crédito Transbank |
| 5 | Cheque al día |
| 6 | Cheque a fecha |
| 7 | Crédito de la empresa |
| 8 | Transferencia |
| 9 | Contado |
| 10 | Pago Digital |
| 30 | Sin pago registrado |
| 31 | Pago Electrónico |
09Errores y respuestas
Los errores se devuelven como JSON con la clave error o status: "warning". Casos comunes al firmar:
| Respuesta | Causa |
|---|---|
{"error": "El certificado digital ha caducado"} | El certificado digital de la empresa venció. Debe renovarse antes de poder firmar. |
{"error": "No hay folios disponibles"} | No quedan folios autorizados por el SII para ese tipo de documento. |
{"error": "Los folios disponibles están vencidos"} | Los folios existen pero superaron los 6 meses de vigencia (Facturas, Guías, Notas). |
{"error": "El identificador de venta no es válido"} | El identificador enviado a /api/firmar/... no corresponde a ninguna venta registrada previamente con /api/save-sale. |
{"status": "warning", "message": "El borrador fue generado, pero no se pudo emitir el DTE"} | La venta se guardó correctamente, pero la firma falló (ver error adjunto). Puedes reintentar con /api/firmar/{identificador}. |
10Notas importantes
identificador (venta_externa_id) de forma única por venta. Es la única forma de referenciarla después para firmarla o consultar su estado.
neto, iva y valor de cada ítem son valores unitarios: el sistema los multiplica por cantidad al calcular los totales de la venta. No envíes ya el total de la línea.
valor por ítem y valor_total en la venta.
Contacto
Teléfonos:
(+56) 97332 0636
Email:
contacto@facturadorweb.cl