Documentación API B2B

API de Integración DTE

Permite a un ERP, CRM o software a medida emitir Documentos Tributarios Electrónicos. El integrador envía solo la información comercial (receptor, ítems, fechas). DiffSii completa el emisor, asigna folio CAF, firma con el certificado digital, timbra y envía el DTE al SII.

Base URL de producción: https://saas.diffsii.cl

El integrador no envía XML ni firma. Tampoco debe mandar datos del emisor: se toman de la ficha de la empresa en DiffSii.

Qué hace DiffSii en cada emisión

  1. Valida el payload (RUT, tipo DTE, ítems, referencias).
  2. Completa el emisor desde la empresa autenticada.
  3. Reserva el siguiente folio CAF (Software de Mercado) o deja que Mipyme lo asigne.
  4. Firma, timbra (TED) y envía el sobre al SII.
  5. Registra el documento en el libro de ventas y devuelve folio, trackId y pdfUrl.

Autenticación

Todos los endpoints de emisión requieren JWT. Obtén el token con un usuario de la empresa (idealmente un usuario técnico de integración).

Obtener token

POST /api/auth/login-local

Request:

curl -X POST "https://saas.diffsii.cl/api/auth/login-local" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "integracion@tuempresa.cl",
    "password": "tu_password_segura"
  }'

Body:

{
  "email": "integracion@tuempresa.cl",
  "password": "tu_password_segura"
}

Respuesta 200:

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "user": {
    "id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
    "name": "Integración ERP",
    "email": "integracion@tuempresa.cl",
    "companies": [
      {
        "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
        "name": "Empresa de Prueba SpA",
        "rut": "76111111-1"
      }
    ]
  }
}
Conserva el token para el header Authorization: Bearer y el id de la empresa como companyId (también en X-Company-ID). En los ejemplos siguientes se usa a1b2c3d4-e5f6-7890-abcd-ef1234567890.

Emitir DTE

POST /api/integration/companies/{companyId}/dte

Headers

Request completo (Factura afecta 33)

curl -X POST "https://saas.diffsii.cl/api/integration/companies/a1b2c3d4-e5f6-7890-abcd-ef1234567890/dte" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
  -H "Content-Type: application/json" \
  -H "X-Company-ID: a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
  -d '{
    "tipoDte": 33,
    "fechaEmision": "2026-10-17",
    "fechaVencimiento": "2026-11-16",
    "formaPago": 2,
    "referenciaExterna": "ERP-OC-9988",
    "receptor": {
      "rut": "76123456-0",
      "razonSocial": "Cliente Demo SpA",
      "giro": "Comercio al por mayor",
      "direccion": "Av. Apoquindo 100",
      "comuna": "Las Condes",
      "ciudad": "Santiago",
      "contacto": "compras@clientedemo.cl"
    },
    "items": [
      {
        "codigo": "SKU-01",
        "nombre": "Servicio de consultoría",
        "cantidad": 1,
        "unidad": "UN",
        "precio": 100000,
        "descuentoPct": 0,
        "exento": false
      },
      {
        "codigo": "SKU-02",
        "nombre": "Horas extra de implementación",
        "cantidad": 4,
        "unidad": "HR",
        "precio": 25000,
        "descuentoPct": 10,
        "exento": false
      }
    ],
    "referencias": [],
    "descuentoGlobalPct": 0,
    "includeXml": false
  }'

Ejemplos por tipo de DTE

Reemplaza el token y el companyId. Los totales (neto, IVA, total) los calcula DiffSii; no los envíes. El emisor tampoco: sale de la ficha de la empresa.

Factura exenta (34)

curl -X POST "https://saas.diffsii.cl/api/integration/companies/a1b2c3d4-e5f6-7890-abcd-ef1234567890/dte" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
  -H "Content-Type: application/json" \
  -H "X-Company-ID: a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
  -d '{
    "tipoDte": 34,
    "fechaEmision": "2026-10-17",
    "formaPago": 2,
    "referenciaExterna": "ERP-EXENTA-120",
    "receptor": {
      "rut": "76123456-0",
      "razonSocial": "Cliente Demo SpA",
      "giro": "Educación",
      "direccion": "Av. Apoquindo 100",
      "comuna": "Las Condes",
      "ciudad": "Santiago"
    },
    "items": [
      {
        "codigo": "CAP-01",
        "nombre": "Capacitación profesional exenta",
        "cantidad": 2,
        "unidad": "UN",
        "precio": 150000,
        "exento": true
      }
    ]
  }'

Respuesta 201 (IVA en 0):

{
  "exito": true,
  "folio": 88,
  "tipoDte": 34,
  "trackId": "1234567891",
  "estado": "ENVIADO",
  "modalidad": "software_mercado",
  "fechaEmision": "2026-10-17",
  "receptor": { "rut": "76123456-0", "razonSocial": "Cliente Demo SpA" },
  "totales": { "neto": 0, "exento": 300000, "iva": 0, "total": 300000 },
  "referenciaExterna": "ERP-EXENTA-120",
  "documentoId": "9f1c2e3a-4b5d-6789-abcd-111122223333",
  "pdfUrl": "https://saas.diffsii.cl/api/integration/companies/a1b2c3d4-e5f6-7890-abcd-ef1234567890/dte/34/88/pdf?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "detalle": null
}

Boleta afecta (39)

curl -X POST "https://saas.diffsii.cl/api/integration/companies/a1b2c3d4-e5f6-7890-abcd-ef1234567890/dte" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
  -H "Content-Type: application/json" \
  -H "X-Company-ID: a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
  -d '{
    "tipoDte": 39,
    "fechaEmision": "2026-10-17",
    "formaPago": 1,
    "referenciaExterna": "POS-CAJA1-55421",
    "receptor": {
      "rut": "1-9",
      "razonSocial": "Cliente genérico"
    },
    "items": [
      {
        "nombre": "Venta mostrador",
        "cantidad": 1,
        "precio": 11900,
        "exento": false
      }
    ]
  }'

En boleta el receptor puede ser RUT 1-9 (cliente genérico). precio es neto unitario: 11.900 neto → IVA 2.261 → total 14.161.

Nota de crédito (61)

Obligatorio informar el documento origen en referencias.

curl -X POST "https://saas.diffsii.cl/api/integration/companies/a1b2c3d4-e5f6-7890-abcd-ef1234567890/dte" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
  -H "Content-Type: application/json" \
  -H "X-Company-ID: a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
  -d '{
    "tipoDte": 61,
    "fechaEmision": "2026-10-18",
    "formaPago": 2,
    "referenciaExterna": "ERP-NC-9988-1",
    "receptor": {
      "rut": "76123456-0",
      "razonSocial": "Cliente Demo SpA",
      "giro": "Comercio al por mayor",
      "direccion": "Av. Apoquindo 100",
      "comuna": "Las Condes",
      "ciudad": "Santiago"
    },
    "items": [
      {
        "codigo": "SKU-01",
        "nombre": "Anulación servicio de consultoría",
        "cantidad": 1,
        "unidad": "UN",
        "precio": 100000,
        "exento": false
      }
    ],
    "referencias": [
      {
        "tipoDoc": "33",
        "folio": "14503",
        "fecha": "2026-10-17",
        "razon": "Anula documento por error de facturación"
      }
    ]
  }'

La nota de débito (56) usa el mismo esquema de referencias.

JavaScript (secuencia completa)

async function emitirFactura33() {
const BASE = 'https://saas.diffsii.cl';
const COMPANY_ID = 'a1b2c3d4-e5f6-7890-abcd-ef1234567890';

const login = await fetch(`${BASE}/api/auth/login-local`, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    email: 'integracion@tuempresa.cl',
    password: 'tu_password_segura'
  })
}).then((r) => r.json());

const headers = {
  Authorization: `Bearer ${login.token}`,
  'Content-Type': 'application/json',
  'X-Company-ID': COMPANY_ID
};

const emitido = await fetch(`${BASE}/api/integration/companies/${COMPANY_ID}/dte`, {
  method: 'POST',
  headers,
  body: JSON.stringify({
    tipoDte: 33,
    fechaEmision: '2026-10-17',
    fechaVencimiento: '2026-11-16',
    formaPago: 2,
    referenciaExterna: 'ERP-OC-9988',
    receptor: {
      rut: '76123456-0',
      razonSocial: 'Cliente Demo SpA',
      giro: 'Comercio al por mayor',
      direccion: 'Av. Apoquindo 100',
      comuna: 'Las Condes',
      ciudad: 'Santiago'
    },
    items: [
      { codigo: 'SKU-01', nombre: 'Servicio de consultoría', cantidad: 1, unidad: 'UN', precio: 100000 }
    ]
  })
}).then((r) => r.json());

console.log(emitido.folio, emitido.trackId, emitido.pdfUrl);

const consulta = await fetch(
  `${BASE}/api/integration/companies/${COMPANY_ID}/dte/${emitido.tipoDte}/${emitido.folio}`,
  { headers }
).then((r) => r.json());

const pdf = await fetch(emitido.pdfUrl);
const blob = await pdf.blob();
return { emitido, consulta, blob };
}

emitirFactura33();

Campos

Campo Obligatorio Notas
tipoDte Sí 33, 34, 39, 41, 46, 52, 56, 61
receptor.rut Sí Con o sin puntos. Se valida dígito verificador.
receptor.razonSocial Sí* Puede omitirse si el RUT ya existe en Clientes de DiffSii.
items[].nombre Sí Descripción del detalle
items[].cantidad Sí Default 1
items[].precio Sí Entero CLP, neto unitario
items[].exento No true para líneas no afectas
fechaEmision No YYYY-MM-DD. Default: hoy
formaPago No 1 contado, 2 crédito, 3 sin costo. Default 2
referencias 56 y 61 Documento origen: tipoDoc, folio, fecha, razon

Respuesta 201 y PDF

Respuesta del ejemplo de factura 33 (ítem 100.000 + 4×25.000 con 10% dto. = neto 190.000):

{
  "exito": true,
  "folio": 14503,
  "tipoDte": 33,
  "trackId": "1234567890",
  "estado": "ENVIADO",
  "modalidad": "software_mercado",
  "fechaEmision": "2026-10-17",
  "receptor": {
    "rut": "76123456-0",
    "razonSocial": "Cliente Demo SpA"
  },
  "totales": {
    "neto": 190000,
    "exento": 0,
    "iva": 36100,
    "total": 226100
  },
  "referenciaExterna": "ERP-OC-9988",
  "documentoId": "4c8a1d2e-9b70-4f11-8c22-0aa1bb2cc3dd",
  "pdfUrl": "https://saas.diffsii.cl/api/integration/companies/a1b2c3d4-e5f6-7890-abcd-ef1234567890/dte/33/14503/pdf?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "detalle": null
}

pdfUrl abre el PDF del DTE. Incluye un token de descarga válido 30 días; no requiere el JWT de sesión.

Descarga con el token del link:

curl -L "https://saas.diffsii.cl/api/integration/companies/a1b2c3d4-e5f6-7890-abcd-ef1234567890/dte/33/14503/pdf?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
  -o DTE_33_14503.pdf

O autenticado con el JWT de integración:

curl -L "https://saas.diffsii.cl/api/integration/companies/a1b2c3d4-e5f6-7890-abcd-ef1234567890/dte/33/14503/pdf" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
  -o DTE_33_14503.pdf
GET /api/integration/companies/{companyId}/dte/{tipoDte}/{folio}/pdf

El documento queda registrado en el libro de ventas de DiffSii.

Reemisión idempotente (200)

Si vuelves a enviar el mismo referenciaExterna, no se reenvía al SII:

{
  "exito": true,
  "idempotente": true,
  "folio": 14503,
  "tipoDte": 33,
  "trackId": "1234567890",
  "estado": "Aceptado",
  "modalidad": "software_mercado",
  "fechaEmision": "2026-10-17",
  "receptor": { "rut": "76123456-0", "razonSocial": "Cliente Demo SpA" },
  "totales": { "neto": 190000, "exento": 0, "iva": 36100, "total": 226100 },
  "referenciaExterna": "ERP-OC-9988",
  "documentoId": "4c8a1d2e-9b70-4f11-8c22-0aa1bb2cc3dd",
  "pdfUrl": "https://saas.diffsii.cl/api/integration/companies/a1b2c3d4-e5f6-7890-abcd-ef1234567890/dte/33/14503/pdf?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "detalle": "Documento ya emitido con esta referenciaExterna. No se volvió a enviar al SII."
}

Consultar un DTE emitido

GET /api/integration/companies/{companyId}/dte/{tipoDte}/{folio}
curl "https://saas.diffsii.cl/api/integration/companies/a1b2c3d4-e5f6-7890-abcd-ef1234567890/dte/33/14503" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
  -H "X-Company-ID: a1b2c3d4-e5f6-7890-abcd-ef1234567890"

Respuesta 200:

{
  "exito": true,
  "folio": 14503,
  "tipoDte": 33,
  "estado": "Aceptado",
  "fechaEmision": "2026-10-17",
  "periodo": "2026-10",
  "origen": "api",
  "receptor": { "rut": "76123456-0" },
  "totales": { "neto": 190000, "exento": 0, "iva": 36100, "total": 226100 },
  "referenciaExterna": "ERP-OC-9988",
  "trackId": "1234567890",
  "documentoId": "4c8a1d2e-9b70-4f11-8c22-0aa1bb2cc3dd",
  "pdfUrl": "https://saas.diffsii.cl/api/integration/companies/a1b2c3d4-e5f6-7890-abcd-ef1234567890/dte/33/14503/pdf?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

Si el DTE no existe:

{ "error": "Documento no encontrado en DiffSii." }

Siguiente folio CAF

GET /api/integration/companies/{companyId}/dte/siguiente-folio?tipoDte=33
curl "https://saas.diffsii.cl/api/integration/companies/a1b2c3d4-e5f6-7890-abcd-ef1234567890/dte/siguiente-folio?tipoDte=33" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
  -H "X-Company-ID: a1b2c3d4-e5f6-7890-abcd-ef1234567890"

Software de Mercado (CAF vigente):

{
  "success": true,
  "tipoDte": 33,
  "emissionType": "software_mercado",
  "hasCaf": true,
  "exhausted": false,
  "siguienteFolio": 14503,
  "folioDesde": 14000,
  "folioHasta": 14999,
  "totalDisponibles": 497
}

Sistema Gratuito SII / Mipyme:

{
  "success": true,
  "tipoDte": 33,
  "emissionType": "gratuito_sii",
  "hasCaf": false,
  "exhausted": false,
  "siguienteFolio": 0,
  "modo": "automatico_sii",
  "message": "En el Sistema Gratuito SII el folio lo asigna el portal Mipyme al timbrar."
}

Útil para previsualizar el correlativo. En emisión, si no envías folio, DiffSii lo reserva automáticamente.

Errores de emisión

HTTP Cuándo
400 Payload inválido (RUT, ítems, tipoDte, NC/ND sin referencia)
401 Sin JWT o token expirado
403 Sin permiso de ventas, empresa ajena o tope del plan
409 Periodo cerrado, sin CAF o CAF agotado
502 El SII rechazó o no confirmó el envío

400 — nota de crédito sin documento origen:

{
  "error": "Payload de emisión inválido.",
  "details": [
    "Las notas de crédito (61) y débito (56) requieren al menos una referencia al documento origen."
  ]
}

400 — RUT inválido:

{
  "error": "Payload de emisión inválido.",
  "details": ["RUT con dígito verificador incorrecto: 76123456-9"]
}

403:

{ "error": "Tu cuenta no tiene permisos para emitir ventas." }

409 — periodo cerrado:

{ "error": "El periodo 2026-10 está cerrado. No es posible emitir DTE." }

409 — sin CAF:

{
  "error": "No hay CAF autorizado para el tipo de documento 33. Sincronice o solicite un CAF al SII.",
  "code": "SIN_CAF"
}

502 — el SII no confirmó:

{
  "exito": false,
  "folio": 14503,
  "tipoDte": 33,
  "trackId": null,
  "estado": "RECHAZADO",
  "modalidad": "software_mercado",
  "fechaEmision": "2026-10-17",
  "receptor": { "rut": "76123456-0", "razonSocial": "Cliente Demo SpA" },
  "totales": { "neto": 190000, "exento": 0, "iva": 36100, "total": 226100 },
  "referenciaExterna": "ERP-OC-9988",
  "documentoId": null,
  "pdfUrl": null,
  "detalle": "El SII rechazó el envío."
}

Requisitos en DiffSii

Para inyectar compras/ventas ya emitidas (sin timbrar), usa la API de movimientos B2B.