Introducción a la API

La API REST de Pro DTE emite facturas, notas, guías y boletas ante el SII desde tu sistema, sigue el estado de cada envío y entrega el PDF y el XML de cada documento.

URL base y formato

  • Todas las rutas parten de https://api.prodte.com.
  • Se envía y se recibe JSON (Content-Type: application/json). El PDF responde application/pdf y el XML firmado, application/xml en ISO-8859-1.
  • GET /health responde sin autenticación y sirve para comprobar que el servicio está arriba.

Autenticación

Crea una clave de API en el portal, en Configuración → Claves de API. Solo el administrador de la cuenta puede crearlas, y cada clave lleva un rol. La clave se muestra una sola vez: guárdala como un secreto de tu sistema y envíala en cada solicitud.

curl -s https://api.prodte.com/taxpayers \
  -H "X-API-Key: $PRODTE_API_KEY"
  • También sirve Authorization: Bearer pdte_…, si tu cliente HTTP solo maneja ese encabezado.
  • Si una clave se filtra, revócala en el mismo lugar: deja de funcionar en la siguiente solicitud.
Roles de una clave de API
RolQué puede hacer
OPERATOREmite cualquier documento, lo reenvía, consulta su estado en el SII y lo descarga.
CASHIEREmite solo boletas, para una caja o un punto de venta, y consulta los documentos.
AUDITORSolo consulta: documentos, empresas, folios, PDF y XML.

Los usuarios del portal tienen los mismos roles y uno más, el administrador (ver Roles y usuarios). Dale a cada sistema la clave con el rol mínimo que necesite.

Emitir un documento

rutEmisor es una de las empresas de tu cuenta. Pro DTE toma el folio, firma el documento con el certificado de la empresa, lo timbra y lo envía al SII:

curl -s https://api.prodte.com/dte \
  -H "X-API-Key: $PRODTE_API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: pedido-1042' \
  -d '{
    "rutEmisor": "76111111-1",
    "tipoDte": 33,
    "receptor": {
      "rut": "76222222-2",
      "razonSocial": "Cliente SpA",
      "giro": "Comercio al por menor",
      "direccion": "Av. Las Condes 9999",
      "comuna": "Las Condes"
    },
    "items": [
      { "nombre": "Servicio de consultoría", "cantidad": 2, "precioUnitario": 50000 }
    ]
  }'

La respuesta, abreviada:

{
  "id": "…",
  "tipoDte": 33,
  "folio": 1042,
  "status": "SENT",
  "env": "PROD",
  "montoNeto": 100000,
  "montoIva": 19000,
  "montoTotal": 119000,
  "trackId": "0255013377",
  …
}
  • Sin duplicados: envía Idempotency-Key con un valor único por documento, como el número del pedido. Si repites la solicitud tras un corte de red, recibes el mismo documento y no se gasta otro folio.
  • Precios: precioUnitario va neto, sin IVA, en facturas y notas; en boletas va con el IVA incluido, como lo paga el comprador.
  • Boletas: tipoDte 39 o 41. El receptor es opcional: sin él, la boleta va al consumidor final. El comprador la verifica en app.prodte.com/verificar con los datos impresos.
  • Ambiente: cada empresa emite en el ambiente en que está, certificación (CERT) mientras se certifica y producción (PROD) cuando el SII la autoriza. Solo lo emitido en producción tiene validez tributaria.

Estados y seguimiento

Estados de un documento
statusQué significa
SIGNEDFirmado, pero el SII no lo recibió. Reenvíalo con POST /dte/{id}/enviar: usa el mismo folio.
SENTRecibido por el SII y en revisión. POST /dte/{id}/estado consulta el resultado y actualiza el documento.
ACCEPTEDAceptado por el SII. siiStatus trae el código del SII y siiGlosa su detalle.
REJECTEDRechazado por el SII. siiGlosa explica el motivo.

GET /dte lista lo emitido, del más reciente al más antiguo, y GET /dte/{id}/pdf y GET /dte/{id}/xml descargan cada documento (ver Ver y descargar el PDF).

Errores

Los errores responden con esta forma, y message viene en español, listo para mostrar a quien usa tu sistema:

{
  "statusCode": 401,
  "message": "Clave de API inválida o revocada",
  "error": "Unauthorized"
}
Errores frecuentes
statusCodeerrorCuándo
400Bad RequestLos datos no son válidos. En este caso message es una lista con cada problema.
401UnauthorizedFalta la clave, fue revocada o el token de la sesión expiró.
403ForbiddenEl rol de la clave no alcanza para esa acción, o el plan Gratis llegó a su tope del mes.
404Not FoundEl recurso no existe en tu cuenta.
409ConflictLa operación choca con el estado actual, por ejemplo otra emisión tomó el mismo folio. Reintenta.
429Too Many RequestsPasaste el límite de solicitudes. Espera un momento y reintenta.

Límites

Con una clave o una sesión: 25 solicitudes por segundo, 600 por minuto y 20.000 por hora por IP. Al pasarlos, la API responde 429.

Referencia

La referencia de la API describe cada endpoint, campo y respuesta del documento OpenAPI publicado en https://api.prodte.com/api/openapi.json. Para probar llamadas con tu clave, usa la versión interactiva en api.prodte.com/api.