Consultar estado de folios
Consultar en el SII el estado de un rango de folios: disponibles, utilizados y anulados
Probar contra el mock: responde los ejemplos del contrato, no guarda nada y nunca llega a producción.
El mock no es la API. Replica las validaciones que no dependen del SII (rango de folios, boletas en producción, folioInicial, mesesVentana y el RUT 1-9), con el mismo código y mensaje. Es más estricto en esto: un ambiente que no es 0 ni 1 da 400 (la API no da error: corre en producción, o en homologación si es otro número en las operaciones que lo dicen), la falta de un parámetro de query obligatorio da 400 (la API da 404), un body sin Content-Type da 400 (la API da 415), un body sin Data o sin Contrasenna da 400 (la API da CERT_REQUERIDO) y un mesesVentana que no es entero da 400 (la API lo ignora). Y más permisivo en esto: sin body responde el ejemplo, donde la API da CERT_REQUERIDO salvo con el RUT 1-9.
cURL equivalente
curl -X POST 'https://developers.enrolamiento.cl/mock/v1/caf/11111111-1/estado-folios/33/1001/1100?ambiente=0' \
-H 'x-mock-authorization: Basic <base64 de usuario:apikey>' \
-H 'Content-Type: application/json' \
-H 'x-amz-content-sha256: <sha256 del body>' \
--data-raw '{
"Contrasenna": "********",
"Data": "MIIC"
}'Cuenta los folios de un rango según el SII, en el ambiente que indique ambiente: cuántos el SII
todavía no recibió ni anuló (Disponibles), cuántos ya no permite anular, en la práctica los de
documentos que el SII recibió (Utilizados), y cuántos se anularon (Anulados). Es una lectura:
no anula nada, y repetirla no cambia nada en el SII.
El rango tiene que estar contenido entero en un solo CAF de los que lista caf_v1_listar: tome
FolioInicial y FolioFinal de uno de esos CAF, o un subrango. Disponibles y Anulados son
los que informa el SII; Utilizados no lo informa el SII: se calcula como Cantidad -
Disponibles - Anulados. Disponibles no es la cantidad de folios libres para emitir: puede
incluir folios que usted ya usó en documentos que aún no envió al SII; para decidir qué folio
emitir, use su propio foliado. Si los conteos del SII no cuadran con el rango, la respuesta es un
error, nunca un 200 con ceros.
Cuál usar. Para saber el último folio emitido, use caf_v1_consulta; esta operación cuenta un rango. Consulte bajo demanda, un CAF a la vez: cada llamada es una consulta completa al SII, y recorrer todos los CAF de caf_v1_listar consume una llamada por CAF del límite de requests. Para varios CAF, una llamada por CAF y en secuencia. La suma de los subrangos de un CAF no tiene por qué coincidir con una sola consulta del CAF entero si entre una y otra se emitieron o anularon folios.
Permisos. Como caf_v1_listar, verifica en el SII del mismo ambiente que el titular del
certificado esté autorizado por la empresa para operar con folios (CAF); no hace falta que
administre usuarios. Consulta la opción de anulación masiva del SII: una empresa que no está
habilitada ahí recibe CONTRIBUYENTE_SIN_PERMISO. Las boletas (39 y 41) solo se pueden consultar
en certificación (ambiente=0).
Tiempos. Hace varias llamadas al SII en serie, más que caf_v1_listar, y puede tardar decenas
de segundos: configure un timeout de cliente de al menos 70 segundos. Si tarda más de 60
segundos, la capa de entrada de la API responde 504 con una página HTML, sin código: es una
lectura, repítala. SII_ERROR_CXN es frecuente e intermitente en el SII de producción: reintente
respetando Retry-After (30 segundos), con espera exponencial (30, 60 y 120 segundos) y un tope
de 3 intentos; cada intento puede tardar decenas de segundos.
Sesión del SII entre ambientes (sin verificar). La sesión del SII se reusa 15 minutos por
certificado, en los dos ambientes. Si alterna ambiente=0 y ambiente=1 con el mismo certificado
en menos de 15 minutos, el SII podría rechazar la sesión. Desde la versión 1.5.3 la respuesta es
SII_ERROR_CXN, reintentable (antes, SII_RESPUESTA_INESPERADA): si persiste después de los
reintentos, espere 15 minutos y repita antes de contactar a soporte.
Para probar. Con el RUT 1-9 o un RUT de prueba del cliente no se consulta al SII ni se valida
el certificado: cualquier rango válido responde 200 con todos sus folios disponibles, sin
contrastarlo con el CAF de ejemplo de caf_v1_listar (del folio 1 al 10). PARAMETRO_FUERA_DE_RANGO
y NO_SOPORTADO_BOLETAS sí llegan con el RUT de prueba, porque se revisan antes. El RUT de prueba
no simula los errores del SII: CAF_NO_ENCONTRADO, SII_ERROR_CXN y los rechazos solo se ven
contra el SII; CAF_NO_ENCONTRADO, con una empresa real en certificación.
basicAuthorizationBasic <token>rut*stringRUT de la empresa.
tipoDocumento*integerTipo del documento DTE, con el código del SII: 33 factura, 34 factura exenta, 39 y 41 boletas, 56 nota de débito, 61 nota de crédito, entre otros. 39 y 41 solo en certificación (ambiente=0).
int32folioInicial*integerPrimer folio del rango: un entero mayor o igual a 1, no mayor que folioFinal. Tome el FolioInicial de un CAF de caf_v1_listar, o un folio dentro de ese CAF. Un valor menor que 1, o mayor que folioFinal, responde PARAMETRO_FUERA_DE_RANGO sin tocar el certificado ni el SII.
int64folioFinal*integerÚltimo folio del rango, incluido: un entero mayor o igual a 1, no menor que folioInicial, y del mismo CAF de caf_v1_listar. Un valor menor que 1, o menor que folioInicial, responde PARAMETRO_FUERA_DE_RANGO sin tocar el certificado ni el SII.
int64ambiente?integerAmbiente del SII: 0 = Homologación (certificación), 1 = Producción. Si se omite, opera en producción: páselo siempre explícito. Un valor que no se reconoce no da error: la operación corre en producción. Un número distinto de 0 y 1 no da error y corre en homologación. En caf_v1_reobtener, ese mismo número corre en producción: use 0 o 1 en las dos.
int32101Datos del certificado.
application/json- body
Datos del certificado digital.
Contrasenna*stringContraseña del PFX, en claro o cifrada con la clave de cifrado del perfil del cliente. Dato sensible: no se registra en logs del integrador.
Data*stringPFX del certificado, en base64. Dato sensible: no se registra en logs del integrador.
byteEl estado del rango según el SII: Rut, TipoDocumento, FolioInicial, FolioFinal, Cantidad, Disponibles, Utilizados y Anulados, con Cantidad = FolioFinal - FolioInicial + 1 = Disponibles + Utilizados + Anulados, siempre. Disponibles: los que el SII todavía no recibió ni anuló, que pueden incluir folios que usted usó en documentos que aún no envió al SII. Utilizados: los que el SII ya no permite anular; se calcula. Anulados: los anulados en el SII. Si los conteos del SII no cuadran con el rango, la respuesta es un error, nunca un 200 con ceros. Con el RUT 1-9 o un RUT de prueba del cliente, el rango pedido con todos sus folios disponibles.
application/json- response
Estado de un rango de folios según el SII: cuántos el SII todavía no recibió ni anuló, cuántos ya no permite anular y cuántos se anularon. Cantidad = Disponibles + Utilizados + Anulados, siempre.
Anulados?integerFolios del rango anulados en el SII.
int64Cantidad?integerFolios del rango: FolioFinal - FolioInicial + 1.
int64Disponibles?integerFolios del rango que el SII todavía no recibió ni anuló: puede incluir folios que usted ya usó en documentos que aún no envió al SII. No use este número para decidir qué folios emitir: use su propio foliado.
int64FolioFinal?integerÚltimo folio del rango consultado, incluido.
int64FolioInicial?integerPrimer folio del rango consultado.
int64Rut?|RUT de la empresa consultada, normalizado con guion y dígito verificador.
TipoDocumento?integerTipo del documento DTE consultado.
int32Utilizados?integerFolios del rango que el SII ya no permite anular: en la práctica, los de documentos que el SII recibió. No viene del SII: se calcula como Cantidad - Disponibles - Anulados. El conteo de recibidos del SII no se usa porque no es confiable.
int64curl --request POST \ --url 'https://api.enrolamiento.cl/v1/caf/1-9/estado-folios/33/1001/1100?ambiente=0' \ --header 'Accept: application/json' \ --header 'Authorization: Basic <base64 de usuario:apikey>' \ --header 'Content-Type: application/json' \ --data '{ "Contrasenna": "********", "Data": "MIIC"}'{ "Anulados": 2, "Cantidad": 100, "Disponibles": 60, "FolioFinal": 1100, "FolioInicial": 1001, "Rut": "11111111-1", "TipoDocumento": 33, "Utilizados": 38}Ejemplos de la respuesta 500 en text/plain
El rango no cabe entero en un solo CAF (CAF_NO_ENCONTRADO)
CAF_NO_ENCONTRADO:El rango de folios 1001-1200 del tipo 33 no está contenido en un solo CAF de la empresa 11111111-1 según el listado del SII.Boletas (39 o 41) en producción (NO_SOPORTADO_BOLETAS)
NO_SOPORTADO_BOLETAS:El estado de folios de boletas (tipos 39 y 41) no está disponible en producción. En certificación sí se puede consultar.Un folio menor que 1, o el rango invertido (PARAMETRO_FUERA_DE_RANGO)
PARAMETRO_FUERA_DE_RANGO:folioInicial y folioFinal tienen que ser mayores que 0, y folioInicial no puede ser mayor que folioFinal.El SII pidió intentarlo más tarde (reintentable) (SII_ERROR_CXN)
SII_ERROR_CXN:Error de comunicacion con el SII, intente nuevamente.Reintentos e idempotencia
Idempotente: sí. Repetirla con los mismos datos no duplica nada.
| Qué hacer | Códigos y status |
|---|---|
Reintentar solo, con espera (automatico) | 409, SII_ERROR_CXN |
Consultar el estado antes de repetir (manual) | CERT_ERROR, ERROR_GENERAL, SEC_USER_NOT_AUTHENTICATED |
No repetir: corregir la causa (nunca) | CAF_NO_ENCONTRADO, CERT_AUTH_NOT_CONFIGURED, CERT_EXPIRADO, CERT_NO_CONFIGURADO_AUTH, CERT_NO_VALIDO, CERT_REQUERIDO, CERT_REVOCADO, CERT_SIN_PERMISO, CONTRIBUYENTE_SIN_PERMISO, NO_SOPORTADO_BOLETAS, PARAMETRO_FUERA_DE_RANGO, SEC_EMP_NOT_AUTHORIZED, SEC_USER_BOLSII, SII_RESPUESTA_INESPERADA |
Un código que no figura en esta tabla se resuelve con la regla de respaldo.