Manejo de errores

Todos los errores de la API siguen el mismo formato: error es un mensaje legible para humanos y code es el código estable de máquina contra el que debes programar tu lógica.

json
{
  "ok": false,
  "error": "La empresa no tiene folios disponibles para el tipo 33.",
  "code": "NO_FOLIOS"
}

Errores HTTP comunes

CódigoDescripciónQué hacer
400Request inválido (datos faltantes o mal formados)Revisar el body del request
401No autenticadoRenovar el JWT o verificar la API Key
403Sin permisos o límite del plan alcanzadoVerificar el rol del usuario; si el code es PLAN_LIMIT, ver Límites del plan
404Recurso no encontradoVerificar el ID o folio en el path
409Conflicto: folio ya usado, o el SII rechazó una solicitud de foliosVerificar el estado actual del recurso; si el code es de folios, ver Errores al solicitar folios
410Archivo expirado (plan gratuito)Si el code es XML_EXPIRADO, ver Expiración de archivos
422Validación fallidaEl SII rechazó los datos del DTE
429Rate limit superado (RATE_LIMITED)Esperar el tiempo indicado en Retry-After. Las descargas de PDF y XML tienen un límite propio de 20 peticiones por ventana de 4 segundos por cuenta: guarda el archivo en vez de volver a pedirlo
503Servicio no disponibleReintentar según Retry-After. FOLIOS_REQUESTING: no había folios y Folyo los está pidiendo al SII. PDF_BUSY: demasiadas generaciones de PDF en curso; los PDF ya generados siguen descargándose

Límites del plan

Aparte del rate limit HTTP (429), cada plan tiene cuotas mensuales: emisión de DTEs, boletas, consultas al SII, usuarios, empresas y API keys. Cuando alcanzas un tope, o pides algo que tu plan no incluye, la API responde 403 con el código estable PLAN_LIMIT:

json
{
  "ok": false,
  "error": "Límite de consultas mensuales alcanzado. Actualice su plan.",
  "code": "PLAN_LIMIT"
}

A diferencia del 429, esto no se resuelve esperando unos segundos: el contador de cada período se reinicia al inicio del próximo mes (hora de Chile), o subes de plan. Distingue PLAN_LIMIT (403, cupo del plan agotado) de 429 (ráfaga de requests, se recupera solo) por el code, no por el status.

Los planes que no incluyen boletas (gratuitos) reciben PLAN_LIMIT también al solicitar o cargar folios de boleta (tipos 39 y 41), antes de que Folyo contacte al SII: así no se consume cupo de timbraje para documentos que el plan no puede emitir.

La cuota de consultas al SII cubre las llamadas que Folyo hace por ti a servicios externos de pago por uso (consulta de contribuyente, situación tributaria, sincronización del RCV, estado de DTE, folios, RCOF, acuse, extracción con IA). Emitir DTEs no descuenta de esta cuota; tiene la suya. Cada respuesta sujeta a cuota trae los headers X-Quota-Limit, X-Quota-Remaining y X-Quota-Period. Revisa Rate limits y cuotas para el detalle de qué llamadas consumen cuota.

Errores al solicitar folios

POST /v1/dte/folios/solicitar conversa con el portal de timbraje del SII. Cuando el SII no entrega el rango, la API responde 409 con uno de estos códigos y, en error, el motivo que envió el SII:

CódigoQué significaQué hacer
FOLIOS_BOLETA_SISTEMA_SIILa empresa emite boletas con el sistema gratuito del SII, que no entrega folios de boleta a software de mercado.Cambiar la modalidad de emisión de boletas en el sitio del SII y volver a solicitar.
TIMBRAJE_NO_AUTORIZADOEl SII bloquea el timbraje: quedan folios sin usar del rango anterior o el contribuyente tiene situaciones pendientes.Consumir o anular los folios pendientes, o regularizar la situación en el SII.
FOLIOS_RECHAZADOS_SIICualquier otro rechazo del portal. error trae la glosa o el código del SII (por ejemplo ST-RS-DTE-15-1).Revisar la situación tributaria y que el titular del certificado esté autorizado para timbrar por la empresa; si se repite, escribir a soporte con el motivo.

Si la empresa no tiene certificado o le faltan credenciales del SII, la respuesta es 422 con CERT_NOT_CONFIGURED, CERT_UNREADABLE o CONFIG_INCOMPLETE. Ninguno de estos casos consume cuota ni folios.

Expiración de archivos en el plan gratuito

En el plan gratuito, la descarga del XML firmado y del PDF de cada documento está disponible solo por un tiempo desde la emisión. En los planes de pago los archivos no expiran.

Ambiente del documentoDescarga disponible por
Producción4 horas
Certificación30 minutos

Pasada la ventana, GET /v1/dte/xml/:tipo/:folio y GET /v1/dte/pdf/:tipo/:folio responden 410 con el código estable XML_EXPIRADO (el PDF comparte el código porque se genera a partir del XML):

json
{
  "ok": false,
  "error": "El XML del DTE tipo 33 folio 1001 ya no está disponible: el plan gratuito lo conserva por 4 horas desde la emisión (30 minutos si es del ambiente de certificación). El documento sigue emitido y vigente ante el SII; no vuelva a emitirlo. Los planes de pago conservan los XML sin límite de tiempo.",
  "code": "XML_EXPIRADO"
}

Dos cosas importantes:

  • El documento no desaparece: solo expira la descarga. El DTE sigue emitido y vigente ante el SII, con su folio consumido, y lo sigues viendo en el listado de documentos con montos, receptor y estado. No vuelvas a emitirlo: duplicarías el documento ante el SII.
  • Guarda los archivos al emitir. El resultado del job de emisión y el webhook dte.emitido llegan dentro de la ventana: descarga el XML y el PDF apenas el job termina y almacénalos de tu lado. Si necesitas re-descargar más adelante, cualquier plan de pago conserva los archivos sin expiración.

Errores de emisión DTE

Cuando el job de emisión falla (estado: "failed"), el campo error del resultado contiene el detalle:

ErrorDescripción
SII_REJECTEDEl SII rechazó el DTE. Ver detail para el código SII.
NO_FOLIOSNo hay folios disponibles para el tipo de DTE.
CERT_ERRORError con el certificado digital (vencido o inválido).
XML_SIGN_ERRORError al firmar el XML. Verificar el certificado.
ENVIO_DTE_INCIERTOEn una compra internacional, Folyo no pudo comprobar el acuse del SII. Revisa el job antes de reintentar; no reemitas ni reserves otro folio.

ENVIO_DTE_INCIERTO no incluye un XML candidato en la respuesta. El sobre pudo haber llegado al SII, por lo que primero se debe revisar el mismo job y resolver su estado antes de cualquier nueva emisión.

Reintentos

La API no reintenta automáticamente los requests fallidos del cliente. Sin embargo, Folyo reintenta el envío al SII de forma automática antes de marcar el job como failed. Si el SII confirmó el envío y luego falla una persistencia local, Folyo recupera esa persistencia con el mismo resultado: no envía otro sobre ni asigna otro folio.

Para los webhooks, Folyo reintenta la entrega hasta 5 veces con backoff exponencial.